在Autodesk Forge Viewer中对Three.JS Object3D网格进行光线投射

时间:2017-01-23 17:11:30

标签: raycasting autodesk-forge autodesk-viewer

我一直在尝试对我在THREE.Scene中添加的对象执行光线投射,提供为viewer.impl.sceneAfter(我已经将link作为教程用于添加支持透明度的对象。)

由于链接中的文档指定:

  

不幸的是,这会产生副作用:本机查看器选择机制必须处理没有预期属性的网格。

     

它可以修复,但您可能需要编辑查看器的代码并加载自定义版本,请参阅下面的修复程序(viewer3D.js#L21962)。另一种选择是以与查看者相同的方式创建自定义几何体,因此它可以参与选择,但可能更多的工作。如果你有更好的解决方案,我很高兴听到它......

首先,我添加了常规的THREE.Object3D,当我执行单击操作时,这会给我一个错误:

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

我认为,来自观看者的meshRayCast函数:

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;
  }
};

从源代码中,我注意到Autodesk Viewer需要THREE.BufferGeometry而不是常规几何体,因此我使用从BufferGeometries创建的Object3D进行了测试,这些已经消除了singleClick上面的错误,但是它仍然不支持光线投射,即使使用我的自定义raycaster:

[http://jsfiddle.net/aaLuxgg6/2/][1]

我已经测试了link提供的各种其他观看者提供的光线投射功能,这对我来说并不起作用。

(总结)我的问题是:

  1. 我有什么方法可以对THREE.SceneAfter中添加的对象进行光线投射?

  2. 似乎link建议我以与查看器相同的方式创建自定义几何体。对此有任何参考吗?

  3. 提前致谢。

1 个答案:

答案 0 :(得分:1)

自定义网格上的光线投射在我这边工作得很好,所以请查看我的RotateTool。它正在使用叠加场景,我尝试在自定义网格上设置透明度,这很好。在下面的代码中,如果我用sceneAfter替换叠加,它也可以正常工作,我可以使用raycaster检测鼠标点击Gizmo:

pip uninstall scipy
conda install scipy

希望有所帮助