无法确定性地拾取导入的网格

Imported meshes can't be picked deterministically

我得到了由

简单创建的圆柱体网格
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-clicktiles 之一上提出 message box 正确的牌名。

当我通过

添加一些新网格(.babylon 文件中的 3D 模型)时
var house;
BABYLON.SceneLoader.ImportMesh("", "../Content/"
                              , "house.babylon"
                              , scene
                              , function (newMeshes) 
                                { house = newMeshes[0]; });

为了更好地想象,它是由四个不同的网格创建的房屋纹理,这些网格放置在 gridcylinder 块瓷砖上。

它显示正常,但是当 mouse-click 时,它经常表现得完全忽略有这样一个网格,所以 pickResult.pickedMesh 要么是 null 要么是 pickResult.pickedMesh.name指向我单击的导入网格下方的图块。

大约 5% 的网格区域恰好对应于 mouse-clicks(假设在屋顶中间,在墙壁中间)。

我试过设置一些虚拟的(隐藏的)house.parent mesh,因为它不会通过导入网格创建,但似乎是死胡同。

您是否知道如何强制执行 scene.pick(evt.clientX, evt.clientY); 尊重网格层次结构并考虑叠加纹理的所有可见部分?

为了完整起见,我正在处理此 3D 模型的中间部分(从中删除了左右房屋)。

编辑:BabylonJS playground

上的演示

你可以尝试改变

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

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

因为evt对应整个页面。