2

我已经尝试通过创建网格并将它们作为更大几何图形的一部分来改进我的项目的渲染时间,并且将单个几何图形作为我添加到场景中的对象。我认为我仍然可以通过一组原始网格来管理对象的拾取,并将它们传递给光线投射器。我使用了以下代码:

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 包含原始的单个网格,我动态创建一个数组来指定我想从中选择哪些对象。不幸的是 intersects 是空的。

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

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

谢谢!

4

3 回答 3

6

您需要手动更新不在渲染场景中的对象的矩阵,因为它是作为渲染过程的一部分完成的,因此如果您使用的是幻影场景,则不需要渲染它,只需在进行交集之前更新矩阵:

scene_ghost.updateMatrixWorld(true);
于 2015-01-27T12:08:31.970 回答
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 );
  }

}

每当我要检查碰撞时,我会翻转到渲染幽灵场景,检查命中,然后翻转回正常渲染。

编辑:我后来发现对象不能属于多个场景(尽管可以共享几何图形)。所以我所做的是为采摘场景创建了简单的网格。这需要更多内存,但可以选择使用更简单的网格进行选择,以便更快地拾取。此外,将幽灵场景本身的孩子发送到光线投射器似乎对我有用。您可能需要像我一样,为幻影场景中的每个对象添加一个属性,该属性引用您尝试选择的主要对象。

于 2013-04-02T04:42:12.353 回答
0

我正在做类似的事情,并且已经验证您需要渲染场景才能进行正确的光线投射。优化这一点很容易,但是只渲染两个屏幕并让一个清晰地覆盖另一个。您应该能够将您的代码更改为此,因为第二个渲染调用将在第一个屏幕上清除:

function render() {
  renderer.render( scene_ghost, camera );
  renderer.render( scene, camera );
}
于 2014-02-27T20:34:18.910 回答