我目前在小车上安装了VR摄像机,以便进行平移和旋转。我正在尝试根据游戏手柄的输入来相对于摄像头(与VR头戴式耳机链接)的方向平移小车。]
我还试图避免使小车相对于相机向上或向下倾斜。
我当前的代码如下所示:
this.camerDirectionVector = new THREE.Vector3()
this.camera.getWorldDirection(this.cameraDirectionVector)
this.moveVec.y = 0
this.dolly.translateOnAxis(this.cameraDirectionVector, this.gamepad.axes[0] * this.moveSpeed)
此功能非常适合沿摄像机指向的方向(减去y旋转)移动小车。
我不知道如何基于额外的游戏手柄输入来相对于摄像机平移小车“左右”。
基于对问题的评论,我想我理解。如果没有,请发表评论,我将更新此答案。
我的理解是,您希望能够相对于相机左右移动,而无需改变小车的up
方向。
这实际上比听起来容易,并且甚至更容易,因为您已经习惯了沿轴平移。
[首先,请了解相机具有其自己的空间参考系,它位于原点,且方向为+ Y up
,并且它向下看-Z轴。考虑到这一点,您已经知道“左”和“右”轴:-X(-1, 0, 0
)和+ X(1, 0, 0
)。
但是摄影机(尤其是在VR中)在世界空间中可能没有很好地对齐,因此您需要将这些很好的统一轴转换为世界轴。 Three.js使用Object3D.localToWorld
使此操作非常容易。
(注意:Object3D.localToWorld
对输入Vector3
具有破坏性。)] >>
这里是获取与世界对齐的左轴的功能:
const getLeftWorld = (function(){ const localLeft = new THREE.Vector3(-1, 0, 0); return function(vectorRef){ // you can give it a vector to overwrite let out = vectorRef || new THREE.Vector3(); out.copy(localLeft); camera.localToWorld(out); return out; }; ))();
您可以为“右”轴创建类似的功能。
手握新的与世界对齐的左轴,您可以使用控制器输入给出的“速度”沿其移动小车。平移不会改变小车的音高,尽管它会改变仰角,具体取决于计算时相机倾斜的方式(但您可以像[0]那样将y
分量清零)之前,如果需要的话。