让一个物体追逐另一个物体

Make an object chase another object

我想让一个物体追逐另一个移动的物体,当它到达被追物体的位置时停止。我尝试使用 TranslateonAxis,如下所示

this.el.object3D.translateOnAxis(targetposition, distance);

使追逐者到达目标位置(被追逐对象的位置)但追逐者对象最终完全向另一个方向移动。我认为原因可能是由于世界位置和物体的局部位置不同。

这是我的代码

    <a-scene physics="gravity: 0">
      <a-assets>
        <a-asset-item id="boat" src="../images/models/surfboard/scene.gltf"></a- 
         asset-item>
        <a-asset-item id="orca1" src="../images/models/orca/scene.gltf"></a-asset- 
         item>
      </a-assets>
      <a-entity position="0 1.8 0">
          <a-camera id="camera" look-controls="enabled: false">
                <a-entity id="boats" position="0 -2 -4" rotation="0 -90 0" 
                scale=".02 .02 .02" gltf-model="#boat" static-body></a-entity>
          </a-camera>
      </a-entity>
<a-entity id="orca" position="-1 0.7 -40" gltf-model="#orca1" static-body move></a-entity>

</a-scene>

我尝试使用移动组件将#orca 移向#boats(可以使用 WASD 移动)。代码 -

AFRAME.registerComponent('move', {
  schema: {
   speed: { type: 'number', default: 2 }
  },

  tick: function(t, dt) {
     var target = this.el.sceneEl.querySelector('#boats');
     var vec3 = new THREE.Vector3();
     var currentPosition = this.el.object3D.position;
     target.object3D.getWorldPosition(vec3);
     var  distance = dt*this.data.speed / 100;      
     this.el.object3D.translateOnAxis(vec3, distance);

     if (currentPosition.z > 30) {
        this.el.setAttribute('position', {
          z: -60
        });
      }

    }  
});

附带说明 - 我希望有更好的解释 material 可以解释 worldToLocal 和 LocaltoWorld 方法。

1) 你需要通过将世界 space 翻译成本地 space.

来获取船的位置
// Get orca's object in regard to the target object
vec3 = this.el.object3D.worldToLocal(target.object3D.position.clone())

为了更好地理解这一点,请从两个角度考虑相同的设置。

从T的角度来看,不需要向[0, 0, 0]移动。它需要从自己的角度去计算空盒子的位置,也就是[1, -0.7, 5]。此外, space 不仅与位置有关,还与旋转有关(和比例,这里不重要)。 T旋转时空框位置会不一样

2) 使用 THREEs a.distanceTo(b) 检查距离。如果距离比你想要的大,移动逆戟鲸:

var target = this.el.sceneEl.querySelector('a-camera'); // this should be in the init()
var vec3 = new THREE.Vector3();
var currentPosition = this.el.object3D.position;

// clone the position to operate on a copy
vec3 = this.el.object3D.worldToLocal(target.object3D.position.clone()) 
var  distance = dt*this.data.speed / 1000;      
var camFromOrca = currentPosition.distanceTo( target.object3D.position );

// if the distance is more than one meter, move the orca
if (camFromOrca > 1) {
  this.el.object3D.translateOnAxis(vec3, distance);
}

fiddlehere。其实很恐怖:)

var vec3 = new THREE.Vector3();
var obj = this.el.object3D;
var targ = target.object3D;
obj.position.add(vec3.copy(targ.position).sub(obj.position).multiplyScalar(0.1));