Импортированные сетки не могут быть выбраны детерминировано

У меня есть сетка цилиндрических сеток, созданная просто

var tile = BABYLON.MeshBuilder.CreateCylinder("tile-" + i, { tessellation: 6, height: 0.1 }, scene);

то у меня есть следующий обратный вызов события

window.addEventListener("click", function (evt) {
    // try to pick an object
    var pickResult = scene.pick(evt.clientX, evt.clientY);
    if (pickResult.pickedMesh != null){
         alert(pickResult.pickedMesh.name)
});

Затем mouse-click на одном из tiles поднимает message box с правильным названием тайла.

Когда я добавляю несколько новых мешей (3D-модель внутри файла .babylon) с помощью

var house;
BABYLON.SceneLoader.ImportMesh("", "../Content/"
                              , "house.babylon"
                              , scene
                              , function (newMeshes) 
                                { house = newMeshes[0]; });

Для лучшего воображения это текстура дома, созданная из четырех разных мешей, которые размещены на grid из cylinder тайлов.

Он отображается нормально, но когда mouse-click он слишком часто ведет себя так, как будто полностью игнорирует наличие такой сетки, и поэтому pickResult.pickedMesh это либо null, либо pickResult.pickedMesh.name точки на плитку, лежащую в основе моей импортированной сетки в точке, которую я щелкнул.

Как раз приблизительно 5% площади сетки соответствует mouse-clicks (скажем, в середине крыши, в середине стен).

Я пробовал играть с установкой некоторых виртуальных (скрытых) house.parent mesh для того, что не будет создано путем импорта мешей, но кажется тупиковым.

Знаете ли вы, как заставить scene.pick(evt.clientX, evt.clientY); уважать иерархию сетки и учитывать все видимые части наложенной текстуры?

Для полноты картины я работаю со средней частью этой 3D модели. (удалены левый и правый дома из этого).

РЕДАКТИРОВАТЬ: Демо на игровой площадке BabylonJS


person Jaroslav Kadlec    schedule 13.04.2017    source источник


Ответы (1)


можно попробовать изменить

var pickResult = scene.pick(evt.clientX, evt.clientY);

to

var pickResult = scene.pick(scene.pointerX, scene.pointerY);

поскольку evt соответствует всей странице.

person Eilue    schedule 14.04.2017