我正在使用A-Frame并希望一个物体随着相机移动。为此,我将一个组件放在一起,根据摄像机位置更新对象的位置:
AFRAME.registerComponent('follow', {
schema: {
distance: {type: 'vec3'},
target: {type: 'selector'}
},
tick: function() {
const targetItem = this.data.target;
const relativePosition = this.data.distance
var tempPos = targetItem.getAttribute("position").split(" ").map(Number);
targetPos = new THREE.Vector3(relativePosition.x + tempPos[0], relativePosition.y + tempPos[1], relativePosition.z + tempPos[2]);
this.el.setAttribute('position', targetPos)
}
});
当我使用init
而不是tick
时这很好用,但由于它是一个init函数,它只在场景开始时更新一次。出于某种原因,当我使用tick
时,一切都会中断。我用错了吗?我应该做些不同的事情来不断更新它的位置吗?
提前致谢!
修改:我应该提到的目标是要有一些内容,但不可以修复到您的视图中。从时之笛中思考Navi。
答案 0 :(得分:3)
从外部SO收到解决方案:
我需要将WASD控制器放在包含摄像头的实体上:
<a-entity id="character" position="0 2 3" wasd-controls look-controls>
<a-entity id="camera" camera>
<a-ring radius-outer="0.03" radius-inner="0.02"
position="0 0 -1"
material="color: cyan; shader: flat"
cursor="fuse: true; fuseTimeout: 500">
</a-ring>
</a-camera>
</a-entity>
然后,我需要更改功能:
tick() {
const targetItem = this.data.target;
var distance = this.data.distance;
var targetPosition = targetItem.getAttribute('position');
this.el.setAttribute('position',{
x: targetPosition.x + distance.x,
y: targetPosition.y + distance.y,
z: targetPosition.z + distance.z
});
然后它奏效了!