将球体 a 旋转到 b 指向自身
Posted
技术标签:
【中文标题】将球体 a 旋转到 b 指向自身【英文标题】:rotating a sphere a to b point on itself 【发布时间】:2012-08-24 10:56:52 【问题描述】:我试图弄清楚如何将球体从自身的 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;
谢谢!
【问题讨论】:
只是出于好奇,我在下面提供的答案中是否有任何内容不能满足您的需求?如果有什么方法对您更有用,我愿意提供帮助。 3.js/js 语法而非数学语法的代码示例会很棒! 这有几个问题。首先,我不熟悉 3.js。实际上,我正在为自己学习 js,并且此时我的脑海中还没有足够直截了当的地方来公正地对待它。另一个也许更大的问题是关于你是否理解下面的概念。如果你不这样做,你可能会更好地发展这种理解,而不是得到你以后无法维护的代码。那么,您了解什么是交叉点积吗?如果没有,我可以扩展这些概念,您可以自己编写代码。 @and 由于这个问题是几年前的问题,你现在有任何关于语法的 threejs 知识吗? @neil 我还没学过threejs...我最初是根据数学标签回答这个问题的,而不是其他任何一个。 【参考方案1】:假设球体以原点为中心,A
和 B
被归一化(即单位长度)。然后计算cross productC = A×B
。这是代表旋转轴的矢量。旋转的角度由θ = cos<sup>-1</sup>(A∙B)
给出,其中A∙B
是单位向量A
和B
的dot product。请注意,这种情况下的角度通常以弧度为单位,而不是度数。
如果球体的中心在某个点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
然后,您可以使用 V
和 θ
作为参数来构造将用于定义旋转的四元数。这个旋转将以原点为中心,所以在应用它之前,先平移 -P,然后应用旋转,再平移回来。
注意:此处可能存在符号错误。如果它不起作用,那是因为叉积的符号与点积的符号不匹配。如果这是一个问题,只需颠倒叉积中参数的顺序即可修复它。
【讨论】:
【参考方案2】: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(或球体)
【讨论】:
以上是关于将球体 a 旋转到 b 指向自身的主要内容,如果未能解决你的问题,请参考以下文章
C ++ / openGL:使用四元数将QUAD旋转到一个点