javascript - 将球体 a 旋转到自身的 b 点

标签 javascript math webgl three.js

我想弄清楚如何将球体从自身的 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;

谢谢!

最佳答案

假设球体以原点为中心,AB被归一化(即单位长度)。然后计算 cross product C = A×B .这是代表旋转轴的矢量。旋转 Angular 由 θ = cos<sup>-1</sup>(A∙B) 给出其中 A∙Bdot product单位向量 AB .请注意,这种情况下的 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/

相关文章:

javascript - AngularJS 显示基于 url/条件的 div

c - 从头开始合成 WAV 文件 - C

c - libc 随机数生成器有缺陷?

firefox - 将向量数组传递给着色器

javascript - ReactJS:如何在数组状态中添加新元素并为其保留 "prevState"?

javascript - 未捕获( promise ): TypeError: Cannot read property 'router' of undefined

javascript - HTML,Canvas和WebGL之间的质量差异

opengl-es - webgl 和 opengl es 有什么区别?

php - 跟踪 CDN 文件上的请求

mysql - 如何从mysql上的多个表计算账单?