2017-02-21 1 views
0

J'essaye de faire la formule des rodrigues pour la rotation autour d'un axe arbitraire pour un certain angle. J'ai ce codeLa formule de Rodrigues pour la rotation du vecteur

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

Je commence avec 2 vecteurs, je reçois l'angle entre eux, je reçois le vecteur perpendiculaire, et la normaliser, alors je teste ma matrice, et voir si Je reviens v2 si je saisis v1. Mais je ne le récupère pas. Est-ce que quelqu'un sait où je me suis trompé. Je pense que c'est dans le code matriciel. Je reviens [2.232221073308228, 1.3951381708176427, -8.370829024905852].

Formula est ici https://en.wikipedia.org/wiki/Rotation_matrix sous matrice de rotation de l'axe et de l'angle

Merci

+0

Je vous mis en place un cadre de tests de base que vous pouvez utiliser pour déboguer plus loin. Veuillez l'utiliser pour comparer votre valeur "attendue" avec les valeurs que vous recevez. http://jsbin.com/howosuwova/2/edit?js,console –

Répondre

2

Je ne pense pas qu'il y ait un problème.

np est un vecteur de la bonne direction (même direction que v2) mais de mauvaise grandeur. Vous pouvez voir avec:

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

Le résultat est:

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

v2 peut être trouvé avec norm(v2) * normalize(np).


Parce que v1 et v2 sont des longueurs très différentes, rotation v1 vous obtiendrez seulement la bonne direction, mais la longueur du vecteur résultant aura toujours la longueur de v1. Vous pouvez le voir avec:

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

retours:

8.774964387392123 8.774964387392123

+0

Ensuite, "rotate" n'est pas le bon outil pour le travail. La fonction que vous avez affichée tourne très bien! –

+0

Oh ok, j'ai oublié qu'ils étaient de longueurs différentes, c'est le problème. – omega