Javascript 地形交叉口性能

Javascript 地形交叉口性能,javascript,three.js,Javascript,Three.js,我创建var geometry=new THREE.planegeometry512512255255;然后解析jpg heightmap并更改垂直线的位置以接收变形的平面。然后在动画功能中将光线从天空投射到地面,以获得交点: var raycaster = new THREE.Raycaster( new THREE.Vector3(player.x, 100, player.z), new THREE.Vector3(0, -1, 0) ); var intersects = raycast

我创建var geometry=new THREE.planegeometry512512255255;然后解析jpg heightmap并更改垂直线的位置以接收变形的平面。然后在动画功能中将光线从天空投射到地面,以获得交点:

var raycaster = new THREE.Raycaster( new THREE.Vector3(player.x, 100, player.z), new THREE.Vector3(0, -1, 0) );
var intersects = raycaster.intersectObject( ground, true );
if(intersects.length == 1) {
    mesh.position.set(intersects[0].point.x, intersects[0].point.y, intersects[0].point.z);
}

但是FPS变得非常低尝试直接在循环中计算尽可能少的FPS。这也意味着您应该在循环外部分配光线投射器。使用该范围还可能有助于加快光线投射:

 const direction = new THREE.Vector3(0, -1, 0);
 const position = new THREE.Vector3(player.x, 100, player.z);

 const raycaster = new THREE.Raycaster(position, direction, 0, 200);

 let y = 0;
 let count = 0;
然后在循环内部,有时会重新计算高度:

 if(count = (count + 1) % 10){
   position.set(player.x, 100, player.z);
   y = raycaster.intersectObject( ground, true );
 }

 mesh.position.set(player.x, y, player.z);

你在每个渲染上创建了两个新向量,我理解正确了吗?实际上你只需要在某个位置获得地面高度,不是吗?@prisoner849我必须在每帧创建第一个向量,因为player.x和player.y可以更改。@JonasW。是的,你说得对。你会好奇你是怎么使用这个地形交叉点的吗?对于像将玩家夹在地面上这样的操作,可能会更容易。FPS仍然是~25。@Kittyhawk什么是地面?平面因高度贴图而变形。@Kittyhawk可能是其mesh.position.set?或者其他代码?你查过了吗?我不明白你的意思。这是我的动画功能与您的代码: