threejs,如何让一个物体停留在另一个物体表面上?

4
我正在生成类似于以下的地形几何体:

代码如下:

     var geometry = new THREE.PlaneGeometry(100, 100, 100 , 100 );
     for (var i = 0, l = geometry.vertices.length; i < l; i++) {
          geometry.vertices[i].z  = Math.random() / 2;
     }
     geometry.computeFaceNormals();
     floor = new THREE.Mesh(geometry, floorMaterial);

我有另一个Object3D,它应该在地面上行走。 我如何找出物体需要向上或向下移动多少?也许可以用射线投射器。

[编辑] 好的,第一部分已经解决了,但是第二部分是射线投射器返回的距离不正确,对于每个面都会翻转。请查看示例: http://myhtmltest.net76.net/raycast.html


1
警告:您正在生成非平面四边形。如果您遵循答案中的说明,您的程序将完美地工作。 - WestLangley
1个回答

3
THREE.Raycaster应该可以正常工作,就像您已经猜测的那样。
在更新循环中,您需要向下投射射线。
var raycaster = new THREE.Raycaster();
raycaster.set(yourMovingObject.position, THREE.Vector3(0, -1, 0));

接下来,您需要确定物体需要停止“下落”的距离。

var distance = 40; //set to your own measurements

最后但同样重要的是,检查交叉点。
var velocity = new THREE.Vector3();

var intersects = raycaster.intersectObject(floor); //use intersectObjects() to check the intersection on multiple

//new position is higher so you need to move you object upwards
if (distance > intersects[0].distance) {        
    yourMovingObject.position.y += (distance - intersects[0].distance) - 1; // the -1 is a fix for a shake effect I had
}

//gravity and prevent falling through floor
if (distance >= intersects[0].distance && velocity.y <= 0) {
    velocity.y = 0;
} else if (distance <= intersects[0].distance && velocity.y === 0) {
    velocity.y -= delta ;
}

yourMovingObject.translateY(velocity.y);

这样的代码应该可以工作,但是你需要根据自己的环境对其进行调整。


谢谢你的回答,它帮助我理解了这个概念,但我仍然无法正确地做到。 - Ashkan Ghodrat
好的,我提供了一个链接,我的问题很明显,只需要单击几次即可。http://myhtmltest.net76.net/raycast.html - Ashkan Ghodrat
rays[i] 是一个笔误。我会查看你的示例。 - Chris Laarman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接