2017-02-21 9 views
0

私は、ある角度のために任意の軸の周りを回転させるためにロッドリグの公式をしようとしています。ならば、私は行列をテストし、見て、私は、だから私は2つのベクトルで開始し、このコードロドリゲスのベクトル回転式

function norm(v) { 
 
    return Math.sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); 
 
} 
 
function normalize(v) { 
 
    var length = norm(v); 
 
    return [v[0]/length, v[1]/length, v[2]/length]; 
 
} 
 
function dotProduct(v1, v2) { 
 
    return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]; 
 
} 
 
function crossProduct(v1, v2) { 
 
    return [v1[1]*v2[2] - v1[2]*v2[1], v1[2]*v2[0] - v1[0]*v2[2], v1[0]*v2[1] - v1[1]*v2[0]]; 
 
} 
 
function getAngle(v1, v2) { 
 
    return Math.acos(dotProduct(v1, v2)/(norm(v1)*norm(v2))); 
 
} 
 
function matrixMultiply(matrix, v) { 
 
    return [dotProduct(matrix[0], v), dotProduct(matrix[1], v), dotProduct(matrix[2], v)]; 
 
} 
 
function aRotate(p, v, a) { 
 
    var ca = Math.cos(a), sa = Math.sin(a), t=1-ca, x=v[0], y=v[1], z=v[2]; 
 
    var r = [ 
 
     [ca + x*x*t, x*y*t - z*sa, x*z*t + y*sa], 
 
     [x*y*t + z*sa, ca + y*y*t, y*z*t - x*sa], 
 
     [z*x*t - y*sa, z*y*t + x*sa, ca + z*z*t] 
 
    ]; 
 
    return matrixMultiply(r, p); 
 
} 
 

 
var v1 = [5,-6,4]; 
 
var v2 = [8,5,-30]; 
 
var a = getAngle(v1, v2); 
 
var cp = crossProduct(v1, v2); 
 
var ncp = normalize(cp); 
 
var np = aRotate(v1, ncp, a); 
 
console.log(np); // <---- this is wrong result

を持っている私はそれらの間の角度を取得し、私は垂直なベクトルを取得し、それを正規化v1を入力するとv2に戻ります。しかし、私はそれを取り戻さない。誰が私が間違っていたか知っていますか?私はそれがマトリックスコードにあると思う。私は[2.232221073308228, 1.3951381708176427, -8.370829024905852]を返す。

式は、軸と角度から回転行列の下でここ https://en.wikipedia.org/wiki/Rotation_matrix

おかげ

+0

私はあなたがさらにデバッグするために使用できる基本的なテストフレームワークであなたを設定します。あなたの "期待された"価値とあなたが受け取っている価値を比較するためにこれを使用してください。 http://jsbin.com/howosuwova/2/edit?js,console –

答えて

2

である私はこの問題は、ここにないと思います。

npは正しい方向(v2と同じ方向)のベクトルですが、大きさが間違っています。あなたはで見ることができます:

console.log(normalize(v2), normalize(np)); 

結果は次のとおりです。

[0.254385200299, 0.1589907501872, -0.953944501123] [0.254385200299, 0.1589907501872, -0.953944501123]

v2norm(v2) * normalize(np)で見つけることができます。


v1v2v1を回転するだけで、あなたに正しい方向を取得します、非常に異なる長さですが、結果のベクトルの長さは、まだv1の長さを持つことになりますので。

console.log(norm(v1), norm(np));

リターン:あなたはでこれを見ることができます

8.774964387392123 8.774964387392123

+0

次に、 'rotate'はジョブの正しいツールではありません。あなたが投稿した機能はうまく回転します! –

+0

ああ、私は彼らが長さが違うことを忘れていた、それは問題です。 – omega

関連する問題