3

我试图弄清楚如何将球体从自身的 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但我不知道如何在三中实现它。 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;

谢谢!

4

2 回答 2

3

假设球体以原点为中心A并且B被归一化(即单位长度)。然后计算叉积 C = A×B。这是代表旋转轴的矢量。旋转的角度由单位向量和的点积给出。请注意,这种情况下的角度通常以弧度为单位,而不是度数。θ = cos-1(A∙B)A∙BAB

如果球体以某个点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-1(A'∙B')      // Angle by which to rotate

然后,您可以使用Vandθ作为构造四元数的参数,您将用于定义旋转。此旋转将以原点为中心,因此在应用它之前,先平移 -P,然后应用旋转,再平移回 P。

注意:此处可能存在符号错误。如果它不起作用,那是因为叉积的符号与点积的符号不匹配。如果这是一个问题,只需颠倒叉积中参数的顺序即可修复它。

于 2012-08-29T19:02:18.407 回答
0
var c = group.rotation.y;
var d = -b * (Math.PI / 180)%(2 * Math.PI);
var e = Math.PI / 2 * -1;
group.rotation.y = c % (2 * Math.PI);
group.rotation.x = a * (Math.PI / 180) % Math.PI;
group.rotation.y= d+e;

其中 a= 纬度,b= 经度,group=Object3D(或球体)

于 2014-10-08T11:36:57.560 回答