给出以下两个输入:
如何获取球体上该点的切线空间中对象的方位角和高度(观察者应该观察的高度和方位角)?特别是,当对象正好位于天顶时,偏航旋转(绕垂直轴旋转)应说明方位角(这样,即使观察者直视上方,他的肩膀也将面对与对象相同的方位角)。
到目前为止我尝试过的数学是:
资源在线存在,但没有这些具体输入,也没有支持天顶案例的必要性。
顺便说一下,该程序是用于three.js的打字稿,因此对于上述第一个解决方案,代码如下:
function getRotationAtPoint(
object: THREE.Object3D,
point: THREE.Vector3
): { azimuth: number, elevation: number } {
// 1. Get the matrix of the tangent space of the observer.
const tangentSpaceMatrix = new THREE.Matrix4();
const baseTangentSpaceAxes = getBaseTangentAxesOnSphere(point);
tangentSpaceMatrix.makeBasis(...baseTangentSpaceAxes);
// 2. Tranform the object's matrix in tangent space of observer.
const inverseMatrix = new THREE.Matrix4().getInverse(tangentSpaceMatrix);
const objectMatrix = object.matrixWorld.clone().multiply(inverseMatrix);
// 3. Get the angles.
const euler = new THREE.Euler().setFromRotationMatrix(objectMatrix);
return {
azimuth: euler.z,
elevation: euler.x
};
}
Three.js还提供对THREE.Object3D
实例的上轴的引用,但是我处理的程序将所有内容直接计算到对象的矩阵中,并且上轴不可信任。