2011-06-23 4 views
1

J'essaye d'utiliser Java3D pour faire tourner un vecteur. Mon but est de créer une transformation qui rendra le vecteur parallèle à l'axe des ordonnées. Pour ce faire, j'ai calculé l'angle entre le vecteur original et un vecteur identique sauf qu'il a une valeur z de 0 (original x, original y, 0 pour la valeur z). J'ai ensuite fait la même chose pour l'axe des ordonnées (original x, 0 pour y-value, original z). J'ai ensuite utilisé chaque angle pour créer deux objets Transform3D, les multiplier ensemble et appliquer au vecteur. Mon code est le suivant:Rotation de vecteur en utilisant Java 3D

Transform3D yRotation = new Transform3D(); 
Transform3D zRotation = new Transform3D(); 

//create new normal vector 
Vector3f normPoint = new Vector3f (normal.getX(), normal.getY(), normal.getZ()); 

//****Z rotation methods***** 
Vector3f newNormPointZ = new Vector3f(normal.getX(), normal.getY(),0.0F); 
float zAngle = normPoint.angle(newNormPointZ); 
zRotation.rotZ(zAngle); 

//****Y rotation methods***** 
Vector3f newNormPointY = new Vector3f(normal.getX(),0.0F, normal.getZ()); 
float yAngle = normPoint.angle(newNormPointY); 
yRotation.rotY(yAngle); 

//combine the two rotations 
yRotation.mul(zRotation); 

System.out.println("before trans normal = " +normPoint.x + ", "+normPoint.y+", "+normPoint.z); 
//PRINT STATEMENT RETURNS: before trans normal = 0.069842085, 0.99316376, 0.09353002 

//perform transform 
yRotation.transform(normPoint); 

System.out.println("normal trans = " +normPoint.x + ", "+normPoint.y+", "+normPoint.z); 
//PRINT STATEMENT RETURNS: normal trans = 0.09016449, 0.99534255, 0.03411238  

J'espérais la transformation produirait x et les valeurs z ou très proche de 0. Alors que la logique est logique pour moi, je manque évidemment quelque chose ..

Répondre

1

Si votre objectif est de faire tourner un vecteur parallèlement à l'axe y, pourquoi ne pouvez-vous pas le définir manuellement en utilisant l'amplitude du vecteur et en réglant votre vecteur sur < 0, MAGNITUDE, 0>? De plus, sachez que la rotation d'un vecteur pointant directement sur + Y ou -Y peut entraîner la rupture de certaines implémentations de rotation, car elles fonctionnent selon le vecteur "world up" ou < 0,1,0 >. Vous pouvez résoudre ceci en construisant votre propre système de rotation et en utilisant le vecteur "world out" < 0,0,1> en tournant directement vers le haut.

Si vous avez d'autres raisons pour cela, fastgraph m'a aidé à construire des matrices de rotation.

Il est préférable de comprendre les maths de ce qui se passe afin que vous sachiez quoi faire dans le futur.

+0

Merci. Mon objectif global est de faire tourner un nuage de points entier de sorte que le sol ait des valeurs très proches ou égales à 0. J'essaie de générer un Transform3D qui fera tourner le vecteur (normal au sol) parallèlement à l'axe y et ensuite utiliser ce même Transform3D pour faire pivoter chaque point dans le nuage de points. Après la rotation, j'espère que tous les points appartenant au sol auront une valeur très proche de zéro. Est-ce que cela ressemble à une approche décente? – RDL

+0

L'emplacement de chaque point dépend de l'axe de rotation. Si je me souviens bien, les fonctions RotX/Y/Z tournent à l'aide de la matrice modelview de chaque objet, donc la rotation d'un point qui a été déplacé vers (a, b, c) fera que le point se trouvera toujours dans (a, b, c), mais avec une direction normale différente. [AxisAngle4f] (http://download.oracle.com/docs/cd/E17802_01/j2se/javase/technologies/desktop/java3d/forDevelopers/J3D_1_3_API/j3dapi/javax/vecmath/AxisAngle4f.html) semble être ce que tu veux. –