PaperVision3D : passer de la 2d a la 3d = problème de coordonnées :-/

PaperVision3D : passer de la 2d a la 3d = problème de coordonnées :-/ - Flash/ActionScript - Programmation

Marsh Posté le 29-12-2010 à 22:25:54    

Bonjour a tous, je débute dans Flex et l'actionscript, et j'ai un problème bien chiant pour une application que je tente de faire.
 
En gros j'ai crée une grille en 2d qui s'affiche a l'écran, tout bête.
Quand je clique sur la grille, ca me place un point, quand je clique a un autre endroit un autre point est crée et une ligne est tracée, et enregistrée dans un fichier XML.
 
Le problème c'est pour le rendu 3d.
 
J'arrive a lire le fichier XML et a récupérer les x et y de départ et x2 et y2 d'arrivée qui doivent donner normalement un mur.
 
Et la je coince, j'arrive a créer un Plane avec des valeurs en dur, mais impossible de trouver comment faire pour que mes Plane correspondent a ce que j'ai fait sur la grille 2D.
 
J'ai 2 points avec X et Y par mur, et pour le plane une fois qu'il est crée je peux changer X, Y (mais pas besoin puisque c'est devenu la hauteur du mur, qui reste fixe), Z, rotation Y pour "tourner" mon mur et enfin la taille de ce dernier.
 
Malgré mes recherches j'arrive pas a assembler tout ça et je suis complètement bloqué, si quelqu'un est en mesure de m'aider ca serait vraiment sympa :)


---------------
204 - No Content
Reply

Marsh Posté le 29-12-2010 à 22:25:54   

Reply

Marsh Posté le 30-12-2010 à 09:44:08    

Tu n'es pas très clair... Où-est-ce que tu bloque ?
 
De quelle manière tu "stockes" tes coordonnées 2D ?
 
La démarche à suivre peut dépendre de plein de critère, un même point "2d" pourra-t'il servir à plusieurs murs ?
 
...


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 30-12-2010 à 12:14:33    

Salut :)
 
Alors je vais essayer d'être plus clair, j'ai deux applications, la première affiche une grille en 2d, qui est vide.
 
quand on clique une première fois on a un point sur la grille, si on reclique encore on a un autre point et une droite est tracée sur la grille (elle représente un mur), et ca enregistre les coordonnées des deux points dans un fichier XML.
 
En gros mon fichier xml ressemble a ca avec un mur:  
 

Code :
  1. <monde>
  2. <mur x="10" y="10" x2="100" y2="100" />
  3. </monde>


 
et avec plusieurs :  

Code :
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. - <monde>
  3.   <mur x="10" y="10" x2="100" y2="100" />
  4.   <mur x="20" y="20" x2="200" y2="200" />
  5.   <mur x="30" y="30" x2="300" y2="300" />
  6.   <mur x="40" y="40" x2="400" y2="400" />
  7.   </monde>


 
Jusque la pas de soucis.
 
Maintenant ma seconde application doit être capable de lire le fichier XML, récupérer les coordonnées des murs et de les afficher en 3D.
 
Pour la lecture et la récupération des coordonnées c'est OK, pour l'affichage 3D par contre, la je bloque, une fois que j'ai récupéré mes coordonnées bah je sait pas quoi en faire pour mettre en place mes Pane aux bonnes coordonnées et qu'ils soient de la bonne longueur :(
 
Et sinon pour ta question, si on fait partir deux murs à partir d'un même point sur la grille je ne vois pas pourquoi ca devrait poser de problèmes puisque l'on aurait deux éléments dans le XML au final (certes avec un point x,y ou x2,y2 en commun).


Message édité par ooterreuroo le 30-12-2010 à 12:16:50

---------------
204 - No Content
Reply

Marsh Posté le 30-12-2010 à 12:33:05    

Ah ok :)

 

Et bien, à partir de tes 2 points, tu en déduis le centre de ton futur plan* puis ses dimensions (Pythagore), et pour l'angle autour de l'axe vertical (je sais plus si c'est Z ou Y sur PV3D), tu as le Cosinus (ou le Sinus)...

 

*Coordonnées 3D du milieu :
x = x + (x2-x)/2
y = [hauteur du mur]/2
z = y + (y2-y)/2
(j'ai peut etre inversé Z et Y, je sais qu'en fonction des frameworks 3D, les reperes ne sont pas toujours les mêmes...)

 

* Angle Y :
angle (en radian) = acos((x2-x)/(Math.sqrt(Math.pow((x2-x),2)+Math.pow((y2-y),2))))
(Après, ça dépend du repère).

 


EDIT : Sinon plus simple, au lieu de passer par un Plan, tu construit chaque mur avec un Mesh3D (que tu construit grace à tes coordonnées 3D de vertex), mais veille à le construire de manière à ce que son centre soit son point de pivot...


Message édité par abais le 30-12-2010 à 13:30:10

---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 30-12-2010 à 14:40:26    

ah, bon je risquais pas de trouver tout seul :/
 
J'essaie de modifier mon programme avec tes calculs, mais la compilation semble pas vouloir passer pour le acos , il me sors :  

Error: Appel à une méthode qui ne semble pas dé
finie, acos.


 
edit : naaaah... c'est ma faute, une erreur de syntaxe a la con que j'avais pas remarquée  [:barthaliastoxik]  
 
Enfin bon la ca compile, mais le résultat final reste similaire a ce que j'obtenais jusque la, par exemple avec :  
http://gopix.fr/image-08CC_4D1CA477.jpg
 
Bah au final j'obtiens :
 
http://gopix.fr/image-84EC_4D1CA47F.jpg
 
Bref j'ai pas encore pris en compte la taille des murs, ni le pas de la grille et le positionnement est encore pas au point, vu le temps que j'ai passé sur le reste j'ai un peu les boules mais je perds pas espoir :o


Message édité par ooterreuroo le 30-12-2010 à 16:29:05

---------------
204 - No Content
Reply

Marsh Posté le 30-12-2010 à 19:00:12    

Bon, je bricole un truc pour tester et je te répond.
Sinon en effet, la fonction c'est Math.acos


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 30-12-2010 à 19:17:35    

bien vu pour le math.acos :)
 
Sinon je peux partager le code source de l'appli si ca t'est plus utile, j'ai continué mes tests, et la position des murs change bien, donc au moins je suis sur que ce qu'il y a derrière fonctionne (lecture du xml & parsing), un bon point déjà :d


---------------
204 - No Content
Reply

Marsh Posté le 30-12-2010 à 21:24:09    

Je reprend un truc que j'ai entamé avant de mangé, je te tiens au jus...


Message édité par abais le 30-12-2010 à 21:24:22

---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 30-12-2010 à 21:41:45    

Lol, PV3D ne prévoit rien pour changer la largeur/hauteur d'un plan dynamiquement... C'est nul...
Je dois en re-instancié un à chaque changement, ou jouer avec le scale... Bref


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 30-12-2010 à 22:09:07    

Vraiment pas commode ce truc, quand je vois ce que certains arrivent a faire avec j'en reste sur le cul quand même :d
 
J'ai fait un peu de nettoyage sur mon code et tenté quelques trucs de plus, j'ai eu pas mal de trucs intéressants (dans le sens totalement abusé [:ddr555] ) mais rien de bon


---------------
204 - No Content
Reply

Marsh Posté le 30-12-2010 à 22:09:07   

Reply

Marsh Posté le 30-12-2010 à 23:53:20    

Bon, j'ai réussi après quasi 2h de défi !
 
=> http://urfman.free.fr/fhw/grille3D/
(bon, je n'ai fais qu'un mur, on peut drag&dropper les points dans mon repere 2D...)
 
Pour calculé la rotation autour de l'axeY, il fallait tout simplement utilisez la fonction Math.atan2() qui fait ça à partir d'un vecteur...
J'ai lutter pour comprendre certain PB, il fallait par exemple inverser l'axeY de mon repere2D pour correspondre à l'axe Z... C'est logique mais j'ai pomé 30 min pour ça...
C'était un défi marrant...
 
Source : http://urfman.free.fr/fhw/grille3D/Grille3D.zip


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 31-12-2010 à 00:38:36    

ouah joli  [:implosion du tibia]  
 
j'ai regardé rapidement le code sous np++ , c'est  :pt1cable:  
 
Je vais aller télécharger flash builder parce que la je pourrais pas suivre sinon, me reste plus qu'a essayer d'intégrer les murs qui proviennent de mon XML sur le plan 3d (une fois qu'on les a défini dans le plan 2d on ne s'en occupe plus, ton exemple va bien au delà de ce que je voulais faire :D )
 
Bref c'est pas encore gagné pour moi, il faut que je comprenne comment y parvenir, en tout cas encore une fois merci ;)
 
edit : bon j'en peux plus la, j'ai tenté quelques modifs et ajustements sur mon code, j'ai l'impression que ca marche, mais pas totalement, on dirait que mes murs sont trop proches les uns des autres (ils se rentrent dedans), quand je place un mur en début de map et l'autre en fin de map ils se touchent pas mais l'espace entre est vraiment faible, bref ya un souci c'est clair, mais j'ai le cerveau qui fait  :pt1cable:


Message édité par ooterreuroo le 31-12-2010 à 02:25:59

---------------
204 - No Content
Reply

Marsh Posté le 31-12-2010 à 10:57:45    

Ne prend pas FlashBuilder, c'est bof et utile que si tu fais du Flex, ou du profiling/debuggage, je l'ai pris parceque je n'ai pas le choix sur mac (je deteste dev sur Flash API).
Prend FlashDevelop si t'es sur Windows, c'est le top du top, je le regrette beaucoup...

 

J'ai utilisé Flash pour ma grille 2D que j'ai exporté en SWC...

 

Sinon, concernant PV3D :
Veille à bien utiliser un moteur de rendu Quadrant, sinon la moindre interpénétration entre tes faces ou le fait qu'elle soit trop proche, ça foire l'affichage...
Dans la source, il n'y a que src/Grille3D.as à regarder...
C'est surtout ma methode calculPlaneParameter() que tu dois choper, quand tu importe ton XML, pour chaque mur, calcule les trigonométries via ma fonction et créé un Plan() avec...
Dans mon exemple, vu que le sol est centré, j'ai du soustraire 200(la moitié des cotés se ce plan de sol) en x et z de mon mur pour que ça corresponde à la 2D. Par ailleurs, si ça t'intéresse, j'avais bricolé une Camera3D pour PV3D (je n'aime pas celle par défaut), faite pour tourner autour d'un objet, visible là : http://urfman.free.fr/fhw/ilotAbais/pv3d_testLum.html


Message édité par abais le 31-12-2010 à 11:28:04

---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 31-12-2010 à 11:36:51    

Ok bon alors j'ai up ce que j'ai fait rapidement hier soir sous np++,  
 
L'appli pour créer le xml : http://admin.exen.fr/test3d/test3d-map2d.rar
L'appli pour créer le rendu 3d a partir du xml (il faut placer le xml a la racine) : http://admin.exen.fr/test3d/test_3dnew.rar
 
Et j'ai mis en ligne vite fait le rendu actuel avec cet essai sur la grille : http://gopix.fr/thumb-8A06_4D1DB1CF.jpg
 
Démo : http://admin.exen.fr/test3d/rendu/Main.swf
Utiliser ZQSD pour se déplacer.
 
Pour flex, j'avais commencé a l'utiliser, puis la démo a expirée, et je suis pas très fan non plus, je vais aller voir du coté de flashdevelop ;)
 
Pour PV3D je vais essayer de le reprendre pour changer le rendu parce que je n'utilise pas Quadrant :/


---------------
204 - No Content
Reply

Marsh Posté le 31-12-2010 à 12:18:54    

Oula, c'est le gros bordel ta scene, pas le temps de me plonger dedans pour comprendre, d'autant plus que FB me met des erreurs...
C'est quoi PaperBase ?
Sinon, voici à quoi doit ressembler ta class Mur :

Code :
  1. package
  2. {
  3.  
  4.       import org.papervision3d.materials.BitmapFileMaterial;
  5.       import org.papervision3d.objects.primitives.Plane;
  6.     
  7.     public class Mur extends Plane
  8.     {
  9.         private var materiau:BitmapFileMaterial = new BitmapFileMaterial('image_0.jpg');
  10.        
  11.         public function Mur(ix:int,iy:int, ix2:int, iy2:int)
  12.         {
  13.  
  14.             materiau.doubleSided = true;
  15.             
  16.             var vecteurX:Number = ix2 - ix;
  17.             var vecteurY:Number = iy2 - iy;
  18.             
  19.             var middleX:Number = ix + vecteurX/2;
  20.             var middleY:Number = iy + vecteurY/2;
  21.             
  22.             var rotY:Number = Math.atan2(vecteurX,vecteurY)*180/Math.PI + 90;
  23.             
  24.             var _width:Number = Math.sqrt(Math.pow(vecteurX,2) + Math.pow(vecteurY,2));
  25.             
  26.             super(materiau, _width, 1000, 2, 2);
  27.             this.x = middleX;
  28.             this.z = middleY;
  29.             this.rotationY = rotY;
  30.             
  31.         }
  32.  
  33.     }
  34. }


J'ai mis une texture JPG au Plane (un simple dégradé), parce-qu'on distingue mal les différents murs sinon...


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 31-12-2010 à 14:28:07    

le paperbase c'est sûrement quand j'ai voulu importer papervision dans flex d'une mauvaise manière, normalement tu peux le commenter
 
j'ai fait les modifications, viré la méthode dessineMur qui devient inutile avec ta solution, alors déjà le placement des murs a l'air de marcher, il ne me reste maintenant plus qu'un problème d'échelle, quand je dessine un grand carré sur ma map2d il est minuscule sur la map3d.
 
je vais essayer de creuser un peu plus le problème, sinon je sait que mon code est pas joli, j'y travaille (tu aurais du voir mes premiers essais [:ddr555] ).
 
en tout cas encore une fois merci pour ton aide :)


---------------
204 - No Content
Reply

Marsh Posté le 31-12-2010 à 14:50:04    

faut que tu comprennes surtout...
Je vais voir par curiosité ce que ça donne sans PaperBase, parceque j'ai que ça à foutre, c'est triste ça 9h10 avant 2011 !


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 31-12-2010 à 15:00:48    

c'est d'autant plus triste pour moi pour le moment :d (enfin faut quand même pas pousser je bosserais pas dessus ce soir j'ai autre chose de prévu)
 
sinon pour la compréhension ca m'a pas mal avancé, je comprends mieux comment sont fait les scènes et les objets (note la petite table que j'ai rajoutée [:ddr555] ) mais j'ai un très gros problème avec les mathématiques, par exemple : "acos((x2-x)/(Math.sqrt(Math.pow((x2-x),2)+Math.pow((y2-y),2))))" alors la je te garantis que JAMAIS j'aurai pu sortir ça, mais alors jamaaais :o
 
Je comptais une fois le problème des murs passé rajouter des fonctions pour pouvoir choisir les textures des murs, ajouter des objets et tout, j'ai été trop gourmand je pense mais même avec ce rendu pas terrible je trouve ca plus que sympathique :d


---------------
204 - No Content
Reply

Marsh Posté le 31-12-2010 à 16:26:07    

ooterreuroo a écrit :

mais j'ai un très gros problème avec les mathématiques, par exemple : "acos((x2-x)/(Math.sqrt(Math.pow((x2-x),2)+Math.pow((y2-y),2))))" alors la je te garantis que JAMAIS j'aurai pu sortir ça, mais alors jamaaais :o


T'as quitté le collège avant la 4eme ? Parce que Pythagore et la trigonométrie, c'est pas ce qu'il y a de plus poussé quand même  :D
Bon j'avoue, c'est en 3ème qu'on aborde la tangente, et on est encore moins censé connaitre le Math.atan2() de flash qui calcule un angle par rapport à un vecteur(qui possède un sens)...
Sinon ça m'a donné envie de bricolé des truc, je perfectionne ma caméra par exemple...
J'ai commencé pareil que toi, et ce n'était qu'il y a 2ans, je me suis passionné pour le codage AS3, du coup je me suis rapidement perfectionné...
Il faut que tu comprenne un peu la POO aussi, pourquoi j'ai pas eu besoin d'une fonction secondaire dans a classe Mur par exemple : grace à l'héritage de Plane et la fonction super()...


Message édité par abais le 31-12-2010 à 16:28:46

---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 31-12-2010 à 17:09:40    

Spoiler :

je hais les maths depuis ma plus tendre enfance :o


 
Sinon pour la POO pas de soucis, je développe surtout pour le web (php oo) mais je m'intéresse à d'autres langages parce qu'il n'y a pas que le php dans la vie :d
 
Pour ta caméra la trouve vraiment bien faite et fluide, en plus avec deux moteurs de rendus pas mal :o


---------------
204 - No Content
Reply

Marsh Posté le 31-12-2010 à 17:22:37    

http://urfman.free.fr/fhw/grille3D/Musee
Source : http://urfman.free.fr/fhw/grille3D [...] reuroo.zip


Message édité par abais le 31-12-2010 à 18:23:06

---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 31-12-2010 à 17:35:27    

:love:
 
par contre truc amusant, quand tu molette le rendu de la grille de sol est bizarre, mais la navigation reste ok :d
 
edit: ca ressemble vachement au même souci que j'ai sur mes murs, en face ils sont correctement représentés, mais de coté on a des artefacts  [:canaille]
 
edit2: la source est en 404 [:ddr555]

Message cité 1 fois
Message édité par ooterreuroo le 31-12-2010 à 17:38:40

---------------
204 - No Content
Reply

Marsh Posté le 31-12-2010 à 18:22:52    

ooterreuroo a écrit :

:love:
 
par contre truc amusant, quand tu molette le rendu de la grille de sol est bizarre, mais la navigation reste ok :d
 
edit: ca ressemble vachement au même souci que j'ai sur mes murs, en face ils sont correctement représentés, mais de coté on a des artefacts  [:canaille]
 
edit2: la source est en 404 [:ddr555]


 
En effet, la projection de la texture est foireuse, je sis pas ce qu'on peut faire avec PV3D pour ameliorer ça...
Sinon, non, ce n'est pas le même pb que tu as, là il s'agit d'un problème de projection UV de la map, toi c'est le Z-Order qui déconne, c'est dû au BasicRenderer qui est trop léger... Si tu regarde ma scene avec mon ilot3D, on constate un pb similaire au niveau de la racine qui déborde (en Basic), ou encore sur les primitives que je proposes d'afficher en appuyant sur "h"...
 
Sinon, j'ai réparé le link :)


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 31-12-2010 à 19:01:59    

en effet j'ai vu ca :d
 
J'ai regardé très rapidement ton code (va faloir que j'y aille), et pour la lecture du fichier XML en tout cas j'ai bien rigolé en voyant ta fonction, quand je pense a mon code foireux :lol:
 
En tout cas ta caméra fait vraiment bien son boulot, je vais essayer d'obtenir une vue comme j'ai dans ma démo, pour pouvoir me "balader" dans l'environnement 3d, rah je m'imagine déjà faire un labyrinthe ou on peut se ballader dedans et le voir de dessus pour tricher (avec ta caméra) :love:
 
Bref je m'absente, je te tiendrais au courant (et peut être poserais quelques questions sur ton code si vraiment je ne comprends pas).
 
Bonne année 2011 en tout cas :hello:
 
ps : je vois que tu a un compte free pour ton hébergement, si tu a besoin d'un peu de place sur un serveur fait moi signe ;)


Message édité par ooterreuroo le 31-12-2010 à 19:03:29

---------------
204 - No Content
Reply

Marsh Posté le 01-01-2011 à 22:11:49    

Bonne année toi aussi.
C'est gentil pour ton offre, mais j'ai déjà une dedibox qui me convient amplement :)


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 01-01-2011 à 22:28:21    

ok pas de soucis ;)
 
je continue d'avancer, j'ai installé tour de flex et flash develop , je suis en train de mettre un système de sélection des textures bref je commence a être un peu plus a l'aise que sous notepad++ et mon batch pour compiler  [:barthaliastoxik]  
 
Après pour ce qui est du déplacement dans la map j'ai fait quelques tests pas trop concluants pour le moment mais je continue d'avancer :D


---------------
204 - No Content
Reply

Marsh Posté le 02-01-2011 à 11:00:36    

bah, perso je te conseil de lâcher PV3D au profit d'un framework plus adapté, comme alternativa3d, en plus son moteur de rendu par défaut est très bien, plus lourd mais gère parfaitement l'interpénétration polygonale et propose une panoplie de méthode adaptées au jeu video (collision, vue à la 3eme personne...)


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 02-01-2011 à 12:15:17    

ok je vois, par contre alternativa3d n'est pas open source :/


---------------
204 - No Content
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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