【问题标题】:threejs, Keep object on surface of another objectthreejs,将对象保持在另一个对象的表面上
【发布时间】:2013-07-04 17:18:34
【问题描述】:

我正在生成这样的地形几何:

     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。 我怎样才能知道我的对象必须上升或下降多少?也许与 raycaster 一起使用。

[已编辑] 好吧,第一部分已经解决了,但第二部分是光线投射器返回的距离不正确,它以某种方式为每个面翻转。检查示例: http://myhtmltest.net76.net/raycast.html

【问题讨论】:

  • 警告:您正在生成非平面四边形。如果您按照this 答案中的说明进行操作,您的程序将完美运行。

标签: javascript three.js


【解决方案1】:

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);

这样的东西应该可以工作,但是您必须根据自己的环境对其进行调整。

【讨论】:

  • 感谢您的回答,它帮助我理解了这个概念,但我仍然无法正确完成。
  • 好的,我提供了一个链接,我遇到的问题很清楚,只需点击几次。 myhtmltest.net76.net/raycast.html
  • 光线[i] 是一个错字。我会研究你的例子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 2012-02-13
相关资源
最近更新 更多