让一个物体追逐另一个物体
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) 使用 THREE
s 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));
我想让一个物体追逐另一个移动的物体,当它到达被追物体的位置时停止。我尝试使用 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) 使用 THREE
s 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));