我一直在尝试对我在 THREE.Scene 中添加的对象执行光线投射,以 viewer.impl.sceneAfter 的形式提供(我已按照此链接作为添加支持透明度的对象的教程)。
正如链接中的文档所指定的:
不幸的是,这有一个副作用:本机查看器选择机制必须处理不具有预期属性的网格。
它可以修复,但您可能必须编辑查看器的代码并加载自定义版本,请参阅下面的修复 (viewer3D.js #L21962)。另一种选择是以与查看器相同的方式创建自定义几何图形,因此它可以参与选择,但可能需要更多工作。如果您有更好的解决方案,我很高兴听到它...
起初,我添加了常规的 THREE.Object3Ds,当我执行单击操作时,这给了我一个错误:
wgs.js:1889 Uncaught TypeError: Cannot read property 'index' of undefined
我相信,来自观众的 meshRayCast 功能:
function meshRayCast( mesh, raycaster, intersects ) {
init_three();
var geometry = mesh.geometry;
if (!geometry)
return;
var material = mesh.material;
var side = material ? material.side : THREE.FrontSide;
var attributes = geometry.attributes;
inverseMatrix.getInverse( mesh.matrixWorld );
ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );
var a, b, c, i, j, il;
var precision = raycaster.precision;
var positions, stride, intersectionPoint, distance;
if (attributes.index !== undefined) { <----RIGHT HERE
从源代码中,我注意到 Autodesk Viewer 需要 THREE.BufferGeometry 而不是常规几何图形,因此我使用从 BufferGeometry 创建的 Object3D 进行了测试,它在单点单击上消除了上述错误,但它仍然不支持光线投射,即使使用我的自定义光线投射器:
class SceneSelector {
constructor(viewer){
this.raycaster = new THREE.Raycaster();
this.viewer= viewer;
}
selectByType(type,vectorXY){
const camera = this.viewer.getCamera();
const direction = new THREE.Vector3();
const pointerDir = new THREE.Vector3();
if(camera.isPerspective){
direction.set(vectorXY.x,vectorXY.y,0.5);
direction.unproject(camera);
this.raycaster.set(camera.position,
direction.sub(camera.position).normalize());
} else {
direction.set(vectorXY.x,vectorXY.y,-1);
direction.unproject(camera);
this.raycaster.set(direction,
pointerDir.transformDirection(camera.matrixWorld));
}
const filteredObjects = this.viewer.impl.sceneAfter.children.filter(obj=>{
return obj.type == type;
});
const intersects = this.raycaster.intersectObjects(filteredObjects,true);
return intersects ? intersects[0] : null;
}
};
我已经测试了由link提供的各种其他查看器提供的光线投射功能,这对我不起作用。
(总结)我的问题是:
有什么方法可以对 THREE.SceneAfter 中添加的对象执行光线投射?
似乎该链接表明我以与查看器相同的方式创建自定义几何图形。有没有这方面的参考?
提前致谢。