2010-11-21 15 views
1

J'ai cherché toute la soirée, mais je ne trouve pas l'information que je cherche, ou même si c'est possible, ce qui est assez pénible;)Java3D: objet tournant dans les coordonnées du monde?

J'utilise Java3D et je n'arrive pas à comprendre comment faire pivoter la caméra dans l'espace du monde.

Ma rotation gauche/droite et haut/bas se produisent tous deux dans l'espace local. Cela signifie que si je me déplace à gauche et à droite, tout va bien. Cependant, si je regarde 90 degrés vers le bas, alors regarder 90 degrés à droite, tout semble être de son côté.

Actuellement, je suis en train de faire ce qui suit. Cela se traduira par les effets ci-dessus:

TransformGroup cam = universe.getViewingPlatform().getViewPlatformTransform(); 
Transform3D trfcam = new Transform3D(); 
cam.getTransform(trfcam); 

trfcam.mul(Camera.GetT3D()); //Gets a Transform3D containing how far to rotate left/right and how far to move left/right/forward/back 

trfcam.mul(Camera.GetRot()); //Gets a t3d containing how far to rotate up/down 

cam.setTransform(trfcam); 

Alternativement, une chose que j'ai essayé tournait la racine, mais qui tourne autour de 0, donc si je me déplace jamais la caméra loin de 0, il va mal. Y a-t-il quelque chose sur le web qui pourrait me dire comment réaliser ce genre de chose? J'ai essayé beaucoup de choses différentes, mais je n'arrive pas du tout à comprendre. Je suis familier avec le concept, comme je l'ai réalisé dans Ogre3D, tout simplement pas familier avec la loi de la terre dans J3D.

Merci à l'avance pour les réponses :)

Répondre

1

magasin le ammound vous avez tourné autour de chaque axe (x et y), et lorsque vous essayez de tourner autour de l'axe x par exemple, inverser la rotation autour de y, faites tourner autour de x, puis refaites la rotation autour de y.

Je ne suis pas sûr de bien comprendre votre deuxième question. Puisque les transformations de visionneuse et de modèle sont doubles, vous pouvez simuler des mouvements de caméra en transformant le monde lui-même. Si vous ne voulez pas traduire les axes x et y que vous tournez, ajoutez simplement un autre TransformGroup au TransformGroup principal que vous utilisez, et faites les transformations dans le nouveau.

Edit: La première solution est assez lent, de sorte que vous pouvez faire un Transform3D sur 3 vous transformer avez à faire:

que vous avez tourné autour de l'axe x (Translate3D xrot), et maintenant vous avez besoin pour y tourner autour de:

Translate3D yrot = new Translate3D(); 
yrot.rotY(angle); 

Translate3D temp = xot; 
xrot.mul(yrot); // Dont forget the reverse order. xrot is the previous translate 
xrot.mul(yrot); // xrot = xrot * yrot * xrot^-1 
temp.transpose(); // Get the reverse transform of the old transform 
xrot.mul(temp); 

yrot = xrot; // Store it for future rotation around x axis 
cam.setTransform(yrot); 

Il fonctionne même pour de nombreuses transformations que vous faites: inverser le fait précédent, faire la transformation, refaire l'ancien. J'espère que ça aide.