2017-02-21 38 views
0

我想要做一個角度的任意軸旋轉rodrigues的公式。我有這樣的代碼羅德里格斯的矢量旋轉公式

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

於是我開始用2個載體,我讓他們之間的角度,我得到的垂直矢量化和規範化,然後我測試矩陣,看看如果我輸入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]

v2可以norm(v2) * normalize(np)被發現。


因爲v1v2是非常不同的長度,旋轉v1只會讓你的正確方向,但由此產生的向量的長度仍將有v1長度。

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

回報:你可以看到這個

8.774964387392123 8.774964387392123

+0

然後'旋轉'不是工作的正確工具。你發佈的功能旋轉得很好! –

+0

噢好吧,我忘了他們是不同的長度,這是問題。 – omega