У меня есть сетка цилиндрических сеток, созданная просто
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