沿着球体内表面的导航在北极弯曲

问题描述

我正在尝试创建一个空心的地球导航,沿着球体的内表面移动,但我正在做的旋转计算似乎有问题。在南极转动和移动是好的,但越靠近北极,它越弯曲,所以你正对着北极。我正在使用四元数,所以我认为这不应该是万向节锁定问题。相关代码如下:

function forwardQuaternion() {
  const q1 = new THREE.Quaternion().setFromunitVectors(axisY(),axisUp());
  const q2 = new THREE.Quaternion().setFromAxisAngle(axisY(),playerAngle);
  return q1.multiply(q2);
}
function getForwards() {
  return axisX().applyQuaternion(forwardQuaternion());
}

这是一个工作示例 https://codesandbox.io/s/threejs-playground-forked-rokm7?file=/src/index.js:2079-2259

WASD 移动。如果您向前走到北极(用红色框标记)并尝试转向远离它,那么当您移动时,您会再次扭曲以面对它。我一直在网上搜索答案并撕掉我的头发,所以如果有人有任何想法,我将永远感激你!

解决方法

这不是真正的火箭科学,您当前的方向是球体的单位切向量,要向前或向后一小步,添加少量该切向量并投影到球体表面,以旋转当前方向,向量乘以一个小的外部或内部法向量。