3

球をそれ自体の点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;

ありがとう!

4

2 に答える 2

3

球は原点に中心があり、正規化されていると仮定しAますB(つまり、単位長さ)。次に、外積 を計算しますC = A×B。これは、回転軸を表すベクトルです。回転の角度は、単位ベクトルとの内積であるで与えられます。この場合の角度は通常、度ではなくラジアンであることに注意してください。θ = cos-1(A∙B)A∙BAB

球体の中心が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

次に、回転を定義するために使用するクォータニオンを構築するための引数としてVandを使用できます。θこの回転は原点を中心とするため、適用する前に -P で平行移動してから回転を適用し、P で平行移動します。

1 つ注意: ここに符号エラーがある可能性があります。うまくいかない場合は、外積の符号が内積の符号と一致しないためです。これが問題である場合は、外積の引数の順序を逆にして修正してください。

于 2012-08-29T19:02:18.407 に答える