我想弄清楚如何将球体从自身的 A 点旋转到自身的 b 点。我找到了一些 Unity3d 代码:
Quaternion rot = Quaternion.FromToRotation (pointA, pointB);
sphere.transform.rotation *= rot; //Multiply rotations to get the resultant rotation
通过http://answers.unity3d.com/questions/21921/rotate-point-a-on-sphere-to-point-b-on-sphere.html但我不知道如何在 Three.js 中实现它。
这是我的代码:
var s = sphere mesh
var va = 1st start vector
var vb = 2nd end vector;
var qa = new THREE.Quaternion(va.x, va.y, va.z, 1);
var qb = new THREE.Quaternion(vb.x, vb.y, vb.z, 1);
var qc = new THREE.Quaternion();
THREE.Quaternion.slerp(qa, qb, qc, 1);
s.useQuaternion = true;
s.quaternion = qc;
谢谢!
最佳答案
假设球体以原点为中心,A
和 B
被归一化(即单位长度)。然后计算 cross product C = A×B
.这是代表旋转轴的矢量。旋转 Angular 由 θ = cos<sup>-1</sup>(A∙B)
给出其中 A∙B
是dot product单位向量 A
和 B
.请注意,这种情况下的 Angular 通常以弧度为单位,而不是度数。
如果球体以某个点为中心 P
不在原点或其半径不是单位长度,您必须在导出旋转之前平移和缩放 A 和 B。这看起来像:
A' ← (A-P)/|A-P| // Normalized version of A
B' ← (B-P)/|B-P| // Normalized version of B
V ← A'×B' // Axis about which to rotate the system
θ ← cos<sup>-1</sup>(A'∙B') // Angle by which to rotate
然后您可以使用 V
和 θ
作为构建四元数的参数,您将使用它来定义旋转。此旋转将以原点为中心,因此在应用它之前,按 -P 平移,然后应用旋转,然后按 P 平移回来。
注意:这里可能有符号错误。如果不起作用,那是因为叉积的符号与点积的符号不匹配。如果这是一个问题,只需颠倒叉积中参数的顺序即可修复它。
关于javascript - 将球体 a 旋转到自身的 b 点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12184589/