(résolu) [Java 3D] Comment centrer la vue sur des objets WaveFront

[Java 3D] Comment centrer la vue sur des objets WaveFront (résolu) - Java - Programmation

Marsh Posté le 10-04-2006 à 10:27:37    

Tout d'abord, bonjour à tout le monde ! :hello:  
 
Alors je m'explique un tout petit peu quand même : je suis en projet et je dois réaliser une modélisation 3D d'une ville.
Il y a à peu près 230 maisons et chaque maison est un calque : j'ai donc 230 fichiers WaveFront (*.obj) que je charge grâce au loader de Java.  :sweat:  
Or le problème est que je voudrais garder les coordonnées initiales (à peu près 1000000 en X, 700000 en Y et 200 en Z) de ces fichiers et donc ne pas utiliser le flag "Objectfile.RESIZE" qui me ramène tous mes objets à l'origine et les fait se superposer...  
 
Donc la question est : Comment je pourrai déterminer les coordonées min et max de mes fichiers *.obj et après comment centrer la vue (c'est-à-dire ramener la caméra vers ces coordonnées) afin que je puisse voir la ville en entier ?  :??:  
 
Merci d'avance pour vos réponses !!!
 ;)


Message édité par Frac10 le 18-04-2006 à 12:04:24
Reply

Marsh Posté le 10-04-2006 à 10:27:37   

Reply

Marsh Posté le 10-04-2006 à 20:36:51    

Ben tu peux essayer de faire un changement d'échelle sur tes objets pour modifier leurs dimensions. Donc voir la doc de Transform3D et TransformGroup.
 
Sinon, peut être que tu peux modifier directement les coordonnées du Shape3D de ton objet (en récupérant le ou les Geometry qui le compose).
 
La lecture du code source de ObjectFile devrait être instructive aussi.


---------------
Incongru : une FAQ abandonnée sur les Standards du Web - FAQ périmée de blabla@Prog
Reply

Marsh Posté le 11-04-2006 à 11:48:14    

Ok merci, je vais regarder çà de plus près !
Par contre pour le changement d'échelle d'accord, mais en fait je voudrais déplacer ma "vue" afin de garder les coordonnées des objets (que je devrais afficher ensuite) et d'avoir l'ensemble de mes objets "contenus" dans cette même vue...
Je pense que je vais m'attarder sur le code source ObjectFile (dès que j'aurai mis la main dessus !).
 
Je te tiens au courant ! :)

Reply

Marsh Posté le 11-04-2006 à 21:42:20    

Ah ouais j'avais lu un peu vite :D
 
Ceci dit, pour modifier la vue c'est le même principe, tu récupère le TransformGroup de la vue de ton univers (avec tonUnivers.getViewingPlatform().getViewPlatformTransform() ) sur lequel tu appliques des Transform3D (translation, rotation, echelle...)


---------------
Incongru : une FAQ abandonnée sur les Standards du Web - FAQ périmée de blabla@Prog
Reply

Marsh Posté le 12-04-2006 à 17:02:39    

gm_superstar a écrit :

Ah ouais j'avais lu un peu vite :D


 
C'est pas bien grave !  ;)  
 
Sinon j'ai regardé le ObjectFile.java et effectivement, il y aurait bien une fonction qui m'intéresserait : la fonction "getLimit()".
Mais voilà, le problème c'est qu'elle est Private et que je peux pas l'appeler directement de mon programme...
 
Y'aurait-il un moyen du genre la rendre publique ou bien sortir carrèment du *.jar tout ce qui concerne les Objectfile et les mettre dans le dossier de mon programme de sorte que je puisse accéder à cette fonction ?  :??:  
 
Et désolé d'être aussi lourd, mais ce sont un peu mes premiers pas en java...  :sweat:

Reply

Marsh Posté le 12-04-2006 à 20:42:32    

Effectivement tu peux sortir ObjectFile.java et en faire une classe personnalisée...
 
Mais c'est un peu gore.
 
Ce que fait la méthode getLimit() (et sans doute resize() ) tu peux le faire toi même sur le Shape3D de ton objet que tu récupères. A partir du Shape3D, tu peux récupérer le Geometry qui est l'objet qui contient effectivement les coordonnées de ta forme.
Ensuite tu modifies ces coordonnées comme tu l'entends et tu crées un nouvel objet Shape3D et ce sera lui que tu ajouteras à ton arborescence.


---------------
Incongru : une FAQ abandonnée sur les Standards du Web - FAQ périmée de blabla@Prog
Reply

Marsh Posté le 14-04-2006 à 12:52:13    

Ok merci, je vais essayer de me débrouiller avec la fonction getLimits()...  :)  
 
Merci bien pour ton aide, je te tiens au courant !  :jap:  
 
(désolé je me suis trompé et en fait j'ai édité ce message... C'est pour cela que j'ai essayé de le remettre...) :whistle:


Message édité par Frac10 le 15-04-2006 à 16:13:38
Reply

Marsh Posté le 15-04-2006 à 16:14:18    

C'est bon, j'arrive à obtenir une BoundingSphere autour de mon objet WaveFront, afin d'avoir les oordonnées Min et Max de celui-ci, mais j'ai encore un petit problème (heu désolé)... :sarcastic:  
J'utilise ce morceau de programme (qui n'est pas de moi bien évidemment...) pour avoir ma vue centrée sur mon objet ('non' est ma BoundingSphere et 'view' est ma vue :-) ) :

Code :
  1. TransformGroup vpTG = vueFace.getViewPlatformTransformGroup();
  2.     Transform3D transform = new Transform3D();
  3.     Transform3D viewTrans = new Transform3D();
  4.     Point3d center = new Point3d();
  5.     non.getCenter(center);
  6.     double radius = non.getRadius();
  7. double eyeDist = 1.2 * radius / Math.tan(view.getFieldOfView() / 2.0);
  8. Vector3d up = new Vector3d(0, 0, 1);
  9. Point3d eyePos = new Point3d(center);
  10. eyePos.z += eyeDist;
  11. if ( view.getBackClipDistance() < eyeDist ) {
  12.     view.setBackClipDistance(eyeDist);
  13.     view.setFrontClipDistance(eyeDist / 3000);
  14.     }
  15. viewTrans.lookAt(eyePos, center, up);
  16. viewTrans.invert();
  17.     vpTG.setTransform(viewTrans);


 
Et en fait çà m'affiche un écran noir alors que les coordonnées ont l'air bonnes (mon objet a pour limites (à peu près :-) ) Lower (X=7036 Y=2039 Z=192), Upper (X=7075 Y=2649 Z=224)) et ma position de caméra (le lookAt) a pour limites (eyePos=(7056, 2626, 308) center=(7056, 2626, 208) et up=(0, 1, 0) ).
 
Bon, bref le positionnement de la vue a l'air bon (enfin j'espère), mais je comprends pas pourquoi je n'arrive pas à voir mon objet (unique pour le moment) dans la vue de ma fenêtre... :sweat:

Reply

Marsh Posté le 15-04-2006 à 17:06:57    

Là je vois pas trop... ça fait beaucoup de code d'un coup et il faut arriver à se représenter ce que c'est censé faire...
 
Ceci dit, est-ce que ta caméra ne serait pas au milieu de ton objet ? (donc dans l'objet).
La direction du tronc (up) m'a l'air bizarre. Dans ton code c'est (0, 0, 1) et tu dis qu'il fait (0, 1, 0) ? En Java3D la hauteur est selon Y.
 
Sinon une autre solution est d'ajouter un KeyNavigator à ta scène pour pouvoir déplacer ta vue avec le clavier et retrouver ton objet :D Par tatonnement tu finiras par trouver les bonnes valeurs pour positionner ta vue.


---------------
Incongru : une FAQ abandonnée sur les Standards du Web - FAQ périmée de blabla@Prog
Reply

Marsh Posté le 15-04-2006 à 18:33:51    

Heu non, en fait je ne suis pas au milieu de mon objet vu que je peux effectuer des déplacements à la souris (Zoom, Translation et Rotation), et que j'ai essayé de voir l'objet, mais rien n'y fait c'est toujours la même chose...  :cry:  
Le truc bizarre c'est que logiquement j'avais mis un fond bleu à mon Canvas3D (fond bleu qui s'affiche normalement quand j'utilise le RESIZE), mais çà m'affiche un fond noir lorsque j'utilise la fonction pour centrer ma vue : je comprends vraiment pas ce qu'il se passe (si quelqu'un a une idée, elle serait vraiment la bienvenue).  :??:  
 
Pour ce qui est de la direction du tronc, je me suis trompé, j'ai posté un bout de code où j'avais essayé un peu toutes les directions pour celui-ci, désolé...  :whistle:  
 
Merci d'avance !!!  :)


Message édité par Frac10 le 16-04-2006 à 05:16:29
Reply

Marsh Posté le 15-04-2006 à 18:33:51   

Reply

Marsh Posté le 17-04-2006 à 15:02:07    

Apparemment cela proviendrait de la fonction "lookAt", car quand je la met en commentaire, ma couleur de fond du canvas3D s'affiche correctement (couleur bleu), alors que quand je la laisse active, mon fond devient noir, alors que j'utilise la ligne :

Code :
  1. Background background = new Background(new Color3f(0f,0f,1f));


 
Mais dans les 2 cas ( que j'active ou que je désactive le "lookAt" ), il n'y a rien qui apparaît dans mon canvas... :(  
 
Je ne vois vraiment pas pourquoi ce simple lookAt me fait "planter" la vue comme çà : pourtant les valeurs sont correctes (confer le post précédent)...  :heink:  
 
Si quelqu'un pouvait m'aider... Merci d'avance !!!  :jap:


Message édité par Frac10 le 17-04-2006 à 15:02:31
Reply

Marsh Posté le 17-04-2006 à 19:59:20    

Quand on a un Background il s'applique à une région donnée (setApplicationBounds() ) donc peut être que ton lookAt fait que tu regardes en dehors de cette région...


---------------
Incongru : une FAQ abandonnée sur les Standards du Web - FAQ périmée de blabla@Prog
Reply

Marsh Posté le 18-04-2006 à 00:06:33    

Merci pour cette réponse, je pense effectivement qu'il y avait un problème de ce côté-là : pour le BackGround ainsi que pour les lumières de la scène, j'avais défini des BoundingSphere, mais effectivement je n'avais pas changer leurs centres (donc elles étaient centrées en (0, 0, O)) et de plus leurs rayons étaient seulement de 100, alors que la ville doit avoisiner les 500m... :jap:  
 
Mais malheureusement, même en changeant cela, j'ai toujours ce fond noir. Et le problème se situe toujours au niveau du "lookAt", puisque j'ai essayé l'application pas à pas et c'est seulement quand le code arrive au lookAt que le fond bleu devient noir... :sweat:
 
 
 
EDIT : Heu, alors là je sais pas ce qui s'est passé, mais j'ai juste essayé de relancer une dernière fois avec les modifications précédentes et çà marche, çà m'affiche le village en entier !!!
Alors là, merci beaucoup gm_superstar pour ton aide précieuse, je pense pas que j'y serai arrivé tout seul ! :jap:  
(bon j'ai juste un problème avec le zoom, les translations et les rotations maintenant, mais çà devrait pas être bien compliqué : je verrai çà demain...)
 
Merci beaucoup encore !!!! ;)


Message édité par Frac10 le 18-04-2006 à 00:20:29
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed