Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1478 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1342788
Frac10
Posté le 10-04-2006 à 10:27:37  profilanswer
 

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
mood
Publicité
Posté le 10-04-2006 à 10:27:37  profilanswer
 

n°1343508
gm_superst​ar
Appelez-moi Super
Posté le 10-04-2006 à 20:36:51  profilanswer
 

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
n°1343954
Frac10
Posté le 11-04-2006 à 11:48:14  profilanswer
 

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 ! :)

n°1344544
gm_superst​ar
Appelez-moi Super
Posté le 11-04-2006 à 21:42:20  profilanswer
 

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
n°1345284
Frac10
Posté le 12-04-2006 à 17:02:39  profilanswer
 

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:

n°1345513
gm_superst​ar
Appelez-moi Super
Posté le 12-04-2006 à 20:42:32  profilanswer
 

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
n°1346840
Frac10
Posté le 14-04-2006 à 12:52:13  profilanswer
 

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
n°1347477
Frac10
Posté le 15-04-2006 à 16:14:18  profilanswer
 

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:

n°1347486
gm_superst​ar
Appelez-moi Super
Posté le 15-04-2006 à 17:06:57  profilanswer
 

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
n°1347505
Frac10
Posté le 15-04-2006 à 18:33:51  profilanswer
 

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
mood
Publicité
Posté le 15-04-2006 à 18:33:51  profilanswer
 

n°1348142
Frac10
Posté le 17-04-2006 à 15:02:07  profilanswer
 

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
n°1348296
gm_superst​ar
Appelez-moi Super
Posté le 17-04-2006 à 19:59:20  profilanswer
 

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
n°1348447
Frac10
Posté le 18-04-2006 à 00:06:33  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
[RESOLU]Mon neurone va exploser[Résolu] typeid
[java swing] HTML dans JEditorPane(résolu) [Java 3D] Changer l'apparence d'objets WaveFront
[résolu][C]Aide programmation somme de série numérique.iText Créer ses propres objets
[résolu][PERL]variable bizzare 
Plus de sujets relatifs à : (résolu) [Java 3D] Comment centrer la vue sur des objets WaveFront


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR