将球体 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】:

假设球体以原点为中心,AB 被归一化(即单位长度)。然后计算cross productC = A×B。这是代表旋转轴的矢量。旋转的角度由θ = cos<sup>-1</sup>(A∙B) 给出,其中A∙B 是单位向量AB 的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旋转到一个点

Three.js里如何让一个球体相对y轴偏转23°26'旋转(即地球的旋转)?

Three.js - 围绕某个轴旋转球体

如何让球体保持原地旋转?

如何从旋转矩阵中获取用户视点?