Three.js: 使用具有不同基本方向的 DeviceOrientationControls

Three.js: Using DeviceOrientationControls with a different base direction

我正在使用设备方向控件,但需要一些我在使用时遇到困难的附加功能。

我希望用户能够 "lock" 相机,这样可以防止相机方向发生变化。当解锁它时,我希望视图现在从他们锁定它的地方旋转相机,即。我不希望相机 "jump" 转向另一个方向,即使他们 phone 的方向在视图锁定时发生了变化。

这是 DeviceOrientaionControls.js 的修改版本的代码:https://gist.github.com/BruOp/a3fb2f0854357eb1182671cafd3fae89

关键部分在updatedisconnectreconnect

我基本上采用用户在 "lock" 时看到的方向(称为 lockedRot),然后在 "unlocked" 时采用设备的方向(unlockedRot).然后我找到四元数 deviceToPercieved 这样:

deviceToPercieved * unlockedRot = lockedRot

但这并没有真正起作用。有时,相机在解锁时只会跳动一点,但有时它无法在解锁时完全保持 "locked" 方向。

我是不是采取了错误的方法,还是遗漏了一些更基本的东西?

我找到问题了!只是计算deviceToPerceived四元数时的乘法顺序。它是:

this.deviceToPercieved.multiplyQuaternions(
  this.unlockedRot.clone().conjugate(),
  this.lockedRot
).normalize();

但实际上应该是:

this.deviceToPercieved.multiplyQuaternions(
  this.lockedRot,
  this.unlockedRot.clone().conjugate()
);

注意乘法顺序的变化和 normalized() 调用的删除。

现在可以正常使用了!