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

时间:2017-09-27 18:32:52

标签: three.js quaternions

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

我希望用户能够“锁定”相机,这可以防止相机方向改变。当解锁它时,我希望视图现在将相机从锁定它的位置旋转,即。我不希望相机“跳”到另一个方向,即使在视图锁定时手机的方向已经改变。

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

关键部分位于updatedisconnectreconnect

我基本上采取了用户在“锁定”时看到的方向(称之为lockedRot),然后在“解锁”(unlockedRot)时获取设备的方向。然后我找到四元数deviceToPercieved,以便:

deviceToPercieved * unlockedRot = lockedRot

但它并没有真正起作用。有时,相机在解锁时只会稍微跳一下,但有时候它无法完全解锁时保持“锁定”方向。

我在这里采取了错误的做法,还是我错过了一些更基本的东西?

1 个答案:

答案 0 :(得分:0)

我发现了问题!计算deviceToPerceived四元数时,这只是乘法的顺序。那是:

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

但实际上应该是:

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

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

现在正常运作!