我有一个 three.js 项目,我需要能够在大约200,000 - 300,000个三角形的网格上移动鼠标时选择单个面孔。
我正在使用这样的函数:
function raycast (x, y) {
//transform mouse coords relative to main window and normalize
var normalized = normalizeCoordinates(x, y);
// create a Ray with origin at the mouse position and direction into the scene (camera direction)
var vector = new THREE.Vector3( normalized.x, normalized.y, 1 );
projector.unprojectVector( vector, camera );
raycaster.set( camera.position, vector.sub( camera.position ).normalize() );
// create an array containing all objects in the list with which the ray intersects
return raycaster.intersectObject(mesh);
}
其中 normalizeCoordinates 只是将鼠标页面坐标转换为规范化设备坐标。
当 mesh 使用THREE.Geometry时,它是可行的,尽管有点慢。出于各种原因,我决定尝试使用BufferGeometry。这在整个项目的其他方面都看到了很好的结果,但是光线投射变得太慢了。当 mesh 使用THREE.BufferGeometry(非索引)时,intersectObject方法需要大约4.5倍的时间来完成。
首先,这是使用BufferGeometry的预期行为,其次是我可以做些什么来改善一般的光线投射性能(无论是Geometry还是BufferGeometry)?我对着色器相对较新,但特别是我想知道使用着色器执行加速光线投射是否可行。