当物体不属于场景时,Three.js raycaster交叉点为空

时间:2013-03-31 05:11:31

标签: three.js

我尝试通过创建网格并将它们作为更大几何体的一部分来改进我的项目的渲染时间,并将该单个几何体作为我添加到场景中的对象。我以为我仍然可以通过拥有原始网格阵列来管理对象的拾取,并将它们传递给raycaster。我使用了以下代码:

var vector = new THREE.Vector3( ( loc_x / window.innerWidth ) * 2 - 1, - ( loc_y / window.innerHeight ) * 2 + 1, 0.5 );
projector.unprojectVector(vector, camera);
var raycaster = new THREE.Raycaster( camera.position, vector.sub( camera.position ).normalize() );
var objects = [];

var i = active_regions.length;
while (i--) {
  objects = objects.concat(active_regions[i].mesh_entities);
}
var intersects = raycaster.intersectObjects( objects );
if ( intersects.length > 0 ) {
  console.log("Intersection: " + intersects);
}

所以在上面的代码中,active_regions包含原始的单个网格,我动态创建一个数组来指定我想要选择的对象。不幸的是,交叉点是空的。

如果我稍微修改我的项目,以便我将所有那些mesh_entities单独添加到场景中,那么上面的代码可以工作,我可以成功选择对象。不幸的是,整个场景呈现缓慢。

成功检查与光线的交点是否有什么好方法(或一些好方法),而不会减慢渲染速度?

谢谢!

3 个答案:

答案 0 :(得分:5)

您需要手动更新不在渲染场景中的对象的矩阵作为渲染过程的一部分,因此如果您使用鬼场景,则不需要渲染它,只需更新在做交叉之前的矩阵:

scene_ghost.updateMatrixWorld(true);

答案 1 :(得分:1)

我通过鬼影解决了这个问题。基本上,我将所有对象添加到幽灵场景中作为他们各自的网格,然后当我使用raycaster时,它可以工作。

但是,我必须沿着以下几行使用函数:

function flip_render_ghost(yes) {
  if (yes == true) {
    scene_ghost.add(camera);
    render_ghost = true;
  } else {
    scene.add(camera);
    render_ghost = false;
  }
  render();
}

function render() {

  if (render_ghost == true) {
    renderer.render( scene_ghost, camera );
  } else {
    renderer.render( scene, camera );
  }

}

每当我要检查碰撞时,我会翻转渲染鬼影,检查命中,然后翻转回正常渲染。

编辑:我后来发现对象不能属于多个场景(尽管可以共享几何)。所以我所做的就是为拾取场景创建简单的网格。这需要更多内存,但可以选择使用更简单的网格来选择更快的选择。此外,似乎让我把幽灵场景的孩子们送到了raycaster。您可能需要像我一样为鬼影场景中的每个对象添加一个属性,该对象引用您要选择的主对象。

答案 2 :(得分:0)

我正在做类似的事情并且已经验证您需要渲染场景以进行正确的光线投射。然而,很容易对其进行优化,以便只渲染两个屏幕并使一个屏幕清晰。您应该能够将代码更改为此,授予第二个渲染调用将在第一个屏幕上清除:

function render() {
  renderer.render( scene_ghost, camera );
  renderer.render( scene, camera );
}
相关问题