2012-08-29 20 views
3

我试图弄清楚如何将球体从A点自己旋转到B点本身。我发现了一些Unity3d代码:将球体a旋转到b点本身

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; 

谢谢!

+0

只是出于好奇,有没有在我提供以下不满足你的需要的答案什么?如果有某种方式可能对您更有用,我希望能提供帮助。 – andand

+1

3.js/js语法中的代码示例并非数学语法将非常棒! – Jisike

+0

这有几个问题。首先,我对3.js不熟悉。实际上,我正在为自己学习js,在这一点上我没有把所有的东西都放在正确的位置上。另一个,也许更大的问题是你是否理解下面的概念。如果你不这样做,你可能会更好地服务于开发这种理解,而不是在稍后的某个日期提供你将无法维护的代码。那么,你知道什么是交叉点和点积?如果没有,我可以扩展这些概念,你可以自己编码。 – andand

回答

3

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

如果球体的中心位置不在原点或其半径不是单位长度,则必须在导出旋转之前平移和缩放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

然后可以使用Vθ为你的论点构建将用于定义您的旋转四元数。此旋转将以原点为中心,因此在应用之前,请先用-P进行平移,然后应用旋转,然后再向后平移。

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

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 =经度,组= Object3D(或领域)