[DIVERS-3D] Projection 3D

Merci d'utiliser des tags [C] [ASP] [VB] etc... dans vos topics pour qu'on sache de quoi vous parlez.

[DIVERS-3D] Projection 3D

Message par damo » 17 Juil 2006 10:11

Bonjour à tous,
Voici un petit probleme.
Soit une scene S en 3D.
Soit une camera C en 3D.
Soit un plan P en 3D.
On connait les coordonnées de C (Cx,Cy,Cz), sa focale Cf, ainsi que les coordonnées du point regardé (0,0,0).
P est un plan infini basé sur x,z (le sol quoi) avec Py=0.

Ma question est, si je clique sur ma vue, la representation 2D de la scene, comment je fais pour obtenir la projection 3D, l'intersection avec le plan.
Bon je suis pas clair...
L'idée et si je click sur ma vue 2D, je click forcement quelque part sur mon plan. Et je voudrais obtenir les coordonnées de mon click en 3D.
A bientot
http://www.tamina-online.com/damo
"l'imagination est plus importante que la connaissance "
(Albert Einstein)
Avatar de l’utilisateur
damo
Maître
Maître
 
Message(s) : 1352
Inscription : 06 Mars 2002 17:44

Message par Guym » 17 Juil 2006 18:53

tu choisis un plan 3d arbitraire qui est fasse a ta camera tu le decoupes en egrille qui correspond aux pixel de ton ecran 2d et tu trace la droite qui passe du centre de la amera au point selectioné sur la grille et tu calcule le point d'intersection avec le plan.

Autre technique plus efficasse avec un stencil buffer : dans tu strocke le progection de ton objet en binaire : 1 le pixel est sur l'objet 0 il est hors en suite suffit de regarder si le pt correspondant a ta souris est a 0 ou 1
Il a fallu 38 ans à la radio pour atteindre 50 millions d'utilisateurs, 13 ans pour la télévision, 4 ans pour Internet, et 2 ans pour Facebook... les paris sont ouverts pour le prochain.
Avatar de l’utilisateur
Guym
Administrateur
Administrateur
 
Message(s) : 8217
Inscription : 29 Jan 2002 16:33
Localisation : Mufflins (Groland)

Message par damo » 18 Juil 2006 09:13

Mwoué, en fait je pensais à un algo purement mathematique. La creation d'une grille de 700x500 cases va faire ramer mon appli.
A bientot
http://www.tamina-online.com/damo
"l'imagination est plus importante que la connaissance "
(Albert Einstein)
Avatar de l’utilisateur
damo
Maître
Maître
 
Message(s) : 1352
Inscription : 06 Mars 2002 17:44

Message par ZeDuckMaster » 18 Juil 2006 11:58

Sinon si tu as fait un algo de projection 3d propre, tu dois avoir une matrice de transformation espace3D->espaceCamera2D qui permet de prendre un point en 3d et d'avoir ses coordonnées en 2d sur l'écran.

Donc après tu prends les coordonnées de ta souris, tu les fais passer dans l'inverse de cette matrice et tu as un point en 3d, et ajoutes à ça la position de ta caméra et tu as un vecteur.
Le reste ce n'est que de l'intersection vecteur-polygone.
Avatar de l’utilisateur
ZeDuckMaster
Demi-Dieu Vivant
Demi-Dieu Vivant
 
Message(s) : 3109
Inscription : 23 Jan 2002 00:17
Localisation : dans sa mare :)

Message par Guym » 18 Juil 2006 12:30

yep pareil que dcuk en fait c'est la meme chose et noncée de facon empirique ou mathématique. (quand je par le de grille c'est pour le visualiser dans ta tete elle n'as pas besoin d'etre codé, ca permet juste d'obtenir le vecteur en trouvant la matrice de transformation inverse de facon tres empirique)
Il a fallu 38 ans à la radio pour atteindre 50 millions d'utilisateurs, 13 ans pour la télévision, 4 ans pour Internet, et 2 ans pour Facebook... les paris sont ouverts pour le prochain.
Avatar de l’utilisateur
Guym
Administrateur
Administrateur
 
Message(s) : 8217
Inscription : 29 Jan 2002 16:33
Localisation : Mufflins (Groland)

Message par damo » 19 Juil 2006 09:16

Aaaah on s'approche.
Mes competences ne me permettent pas encore de resoudre ce probleme mais je comprend un peu mieux.
J'utilise une API pour faire de la 3D en flash.
Dans la doc : http://www.flashsandy.org/documentation/
je vois qu'il y a 2 methodes dans la classe Camera3D : getTransformMatrix():Matrix4 et getProjectionMatrix():Matrix4
Je ne sais pas laquelle des deux va m'etre utile pour resoudre mon probleme mais intuitivement je sens que c'est par là que ça se passe.
Ensuite je regarde la classe Matrix4Math pour voir à quoi ressemble le resultat des methodes ci-dessus.
Beaucoup de methodes sont disponibles et je commence à perdre le fil.
Peut etre que projectVector serait une bonne piste.
Compute the projection of a vector with a projection matrix.
The result gives a 2 dimension point represented by the x and y properties of the vector (z is null).
Be carefull: The passed matrix MUST be a PROJECTION matrix.

Ce n'est pas tout à fait ça mais je ne peux helas poursuivre plus loin.
A bientot
http://www.tamina-online.com/damo
"l'imagination est plus importante que la connaissance "
(Albert Einstein)
Avatar de l’utilisateur
damo
Maître
Maître
 
Message(s) : 1352
Inscription : 06 Mars 2002 17:44

Message par ZeDuckMaster » 19 Juil 2006 12:11

La matrice de projection est la matrice qui permet de transformer un point en 3d en un point 2d sur l'écran, donc c'est celle que tu dois récupérer.

Ensuite tu calcules l'inverse de cette matrice (tu dois avoir des fonctions pour ça). Et ensuite tu calcules le produit entre cette matrice et le point sur l'écran et ça te donnera un premier point en 3d. Avec la position de la caméra ça te fait un 2e point et donc tu as un vecteur.

Voilà.
Sinon si l'api est bien foutue, tu as peut etre une fonction UnProject toute prete ?
Avatar de l’utilisateur
ZeDuckMaster
Demi-Dieu Vivant
Demi-Dieu Vivant
 
Message(s) : 3109
Inscription : 23 Jan 2002 00:17
Localisation : dans sa mare :)

Message par damo » 19 Juil 2006 12:34

Voici la reponse de l'auteur de l'API :
Tu peux recupérer la matrice de projection en perspective de la camera:
getProjectionMatrix
function getProjectionMatrix (Void) : Object
Return the projection matrix.

Logiquement si tu inverse cette matrice Matrix4Math.invert ou getinverse je sai splus comment j'ai nommé ça, et que tu multiplie les coordonnées wx, wy, wz de ton vertex (que tu transforme en vecteur) par cette matrice inversée, tu dois pouvoir retrouver le point en 3D.

Connaissant ce point 3D et la position de la camera, tu a l'équation d'une droite 3D. Vu que tu peux avoir l'equation de ton plan, tu dois faire un calcul d'intersection.

Je n'ai pas le temps de tester plus en profondeur je suis désolé.


C'est pilpoil ce que tu dis dans ton dernier message coincoinmaster.
Je comprend comment transformer les coordonnées de ma souris (encore que j'ai un doute) mais je comprend pas le rapport avec la position de la camera. OU plutot je ne sais pas comment mixer les 2 pour obtenir ...
Ok j'ai du mal.
Reprenons depuis le depuis.

Code : Tout sélectionner
var maSouris:Mouse = new Mouse();
var maMatrice:Matrix4 = Matrix4Math.getInvert(Camera3D.getProjectionMatrix());
//apres ça se complique
var monVertex:Vertex = new Vertex(maSouris.x+maCamera.x,maSouris.y+maCamera.y,maCamera.z)
Matrix4Math.vectorMult(maMatric,monVertex);
//Et apres je ne sais pas :(
A bientot
http://www.tamina-online.com/damo
"l'imagination est plus importante que la connaissance "
(Albert Einstein)
Avatar de l’utilisateur
damo
Maître
Maître
 
Message(s) : 1352
Inscription : 06 Mars 2002 17:44

Message par damo » 19 Juil 2006 13:54

Nouvelle reponse de l'auteur :
Faudrai remplacer
var monVertex:Vertex = new Vertex(maSouris.x+maCamera.x,maSouris.y+maCamera.y,maCamera.z)

par
var monVecteur:Vector = new Vector(monX, monY, 0);

selon moi.
Et ensuite déterminer la droite et son equation qui passe par le point retourné par :
Matrix4Math.vectorMult(maMatrice,monVector);
et la position de la camera.

si deja tu obtiens qq chose de cohérent là, alors peut etre que c'est faisable.
A bientot
http://www.tamina-online.com/damo
"l'imagination est plus importante que la connaissance "
(Albert Einstein)
Avatar de l’utilisateur
damo
Maître
Maître
 
Message(s) : 1352
Inscription : 06 Mars 2002 17:44

Message par ZeDuckMaster » 19 Juil 2006 14:52

bin oui tu veux mettre la charrue avant les boeufs c'est normal ;)

Comme il dit, il faut faire dans l'ordre :
- multiplier les coordonnées du point sur l'écran par la matrice inverse de projection.
- et seulement après créer un vecteur avec le point 3d que tu viens de récupérer en ajoutant la position de la caméra. Pour rappel on construit un vecteur à partir de 2 points (là en l'occurence le point que tu viens de calculer et la position de ta caméra en 3d).

il ne faut pas tout faire en meme temps !
Avatar de l’utilisateur
ZeDuckMaster
Demi-Dieu Vivant
Demi-Dieu Vivant
 
Message(s) : 3109
Inscription : 23 Jan 2002 00:17
Localisation : dans sa mare :)

Message par damo » 19 Juil 2006 15:28

Donc à ce stade, j'ai un vecteur, les coordonnées de la camera et un plan.
Si j'ai bien suivi, le point final est representé par l'instersection entre le plan et la droite formée par mon vecteur et la position de la camera. C'est ça ?

Si oui, comment je calcule cette intersection ?
A bientot
http://www.tamina-online.com/damo
"l'imagination est plus importante que la connaissance "
(Albert Einstein)
Avatar de l’utilisateur
damo
Maître
Maître
 
Message(s) : 1352
Inscription : 06 Mars 2002 17:44

Message par ZeDuckMaster » 19 Juil 2006 15:39

oui c'est ça, sauf que ce n'est pas un vecteur que tu as mais un point en 3d, ou vertex, ou encore les coordonnées en 3d de ton point sur l'écran.
Il va ensuite falloir que tu créé un vecteur, un vrai, à partir de ce point et de la position de ta caméra. Ce vecteur ainsi créé sera le vecteur directeur de ta droite dont tu te serviras pour calculer l'intersection.

sinon pour l'intersection, tu as essayé sous le moteur de recherche de ton choix : "intersection droite plan" ?
Avatar de l’utilisateur
ZeDuckMaster
Demi-Dieu Vivant
Demi-Dieu Vivant
 
Message(s) : 3109
Inscription : 23 Jan 2002 00:17
Localisation : dans sa mare :)

Message par damo » 20 Juil 2006 14:41

Merci beaucoup pour vos explications. C'est pas encore ça mais si vous voulez suivre mon avancée sur ce probleme, c'est ici que ça se passe :
http://flash.media-box.net/index.php?showtopic=58354
A bientot
http://www.tamina-online.com/damo
"l'imagination est plus importante que la connaissance "
(Albert Einstein)
Avatar de l’utilisateur
damo
Maître
Maître
 
Message(s) : 1352
Inscription : 06 Mars 2002 17:44

Message par damo » 21 Juil 2006 14:39

Bon ben je reviens vers vous car j'y arrive toujours pas.
L'auteur me conseil de voir avec des specialistes en algo (donc vous) :D
Vous pouvez consulter le lien ci-dessus pour voir ce qu'il se passe.
En gros, apres avoir multiplié mon point par la matrice de projection inverse, j'ai un resultat tres louche.
A bientot
http://www.tamina-online.com/damo
"l'imagination est plus importante que la connaissance "
(Albert Einstein)
Avatar de l’utilisateur
damo
Maître
Maître
 
Message(s) : 1352
Inscription : 06 Mars 2002 17:44

Message par Guym » 21 Juil 2006 16:56

position camera : 0,30,-200
lookat camera : 0,0,0
position virtuellement cliquée à l'ecran : 25,0,0 (sur le plan en y=0)
position à l'ecran : vector1 : 482 // 181 // 0
vector1 apres multiplication avec la matrice de projection inversée : 0 // -4.67721468460195e-17 // 0.0461322395593759


Ben a vue de nez ton vecteur me semble correct. Maintenant avec lu point plus le vecteur directeur t'as la droite qui t'interesse, reste a calculer l'intersection avec le plan.

vu que ta cammera est en -200 en z ton vecteu a bcp de z et peut de reste. moi ca me semble bien. je suis un peu rouillé en mathematique vectorielle mais poour moi t'es sur la bonne voie


[edit] normalize le si tu que ton vecteur ait une plus belle gueule
Il a fallu 38 ans à la radio pour atteindre 50 millions d'utilisateurs, 13 ans pour la télévision, 4 ans pour Internet, et 2 ans pour Facebook... les paris sont ouverts pour le prochain.
Avatar de l’utilisateur
Guym
Administrateur
Administrateur
 
Message(s) : 8217
Inscription : 29 Jan 2002 16:33
Localisation : Mufflins (Groland)

Suivant

Retour vers Programmation

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité

cron