编程语言
首页 > 编程语言> > javascript-将球体a旋转到b点

javascript-将球体a旋转到b点

作者:互联网

我试图找出如何将球体从点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;

谢谢!

解决方法:

假设球体以原点为中心,并且A和B进行了归一化(即单位长度).然后计算cross product C = A×B.这是代表旋转轴的向量.旋转角度由θ= cos-1(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平移,然后应用旋转,再按P向后平移.

注意:此处可能有符号错误.如果不起作用,那是因为叉积的符号与点积的符号不匹配.如果有问题,只需反转叉积中参数的顺序即可解决.

标签:webgl,three-js,javascript,math
来源: https://codeday.me/bug/20191127/2076357.html