翻译相机推车的有效方法

问题描述 投票:0回答:1

我目前在小车上安装了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旋转)移动小车。

我不知道如何基于额外的游戏手柄输入来相对于摄像机平移小车“左右”。

three.js webvr
1个回答
0
投票

基于对问题的评论,我想我理解。如果没有,请发表评论,我将更新此答案。

我的理解是,您希望能够相对于相机左右移动,而无需改变小车的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分量清零)之前,如果需要的话。

© www.soinside.com 2019 - 2024. All rights reserved.