PDA

Voir la version complète : coordonnées 3d > 2d



fabian
27/11/2009, 17h13
Hello à tous,
Juste une petite question on the fly.
Est-il possible de récupérer les coordonnées 3D des objets et de les transformer en 2D ?
Donc, en gros, c'est transformer "automatiquement" tous les Z en coordonnées XY.
Pourriez-vous me dire quelle est la manip ?
En vous remerciant d'avance ;-)

Fab

Sylla
27/11/2009, 17h32
tu mets un xpresso avec une sortie coordonnée position z sur ton objet associé à une entrée pour la position X et une pour la position y.
A moins que je n'ai pas compris ce que tu voulais

Jean-Laurent
27/11/2009, 20h32
Rien compris à ta question.
Du coup je vais donner une réponse. :mrgreen:

Tu utilises la fonction SetValue et tu places tous les z à 0. Comme ça tous tes points sont dans le plan xy.

fabian
28/11/2009, 11h12
Hello merci pour vous réponses,
mais il me faudrait vraiment automatiser l'ensemble.
J'aurais besoin qu'à chaque keyframe, tous les points des objets soient ramenés en plan 2D (il s'agira de particules).
En flash, nous allons récupérer ces coordonnées et les utiliser pour mapper des textures dynamiques sur ces particules.
Et comme flash n'a pas de réel axe Z... Voilà pourquoi il me faudra tout ca en 2D

Donc effectivement, tous mes points devraient être ramenés uniquement en XY, sans bien entendu changer leur forme ou leur position dans l'espace, sinon le "mapping" ne fonctionnera plus.

En gros quand l'image est rendue (et donc en 2D), j'aurais besoin d'avoir les coordonnées de tous les points la composant
Il n'y aura pas des millions de points hein ;-)
Il ne devrait y avoir qu'une centaine de particules au final, n'ayant chacune que 4 points, bref des quadrangles ;-)
Merziiii

Fab

Jean-Laurent
28/11/2009, 13h42
J'ai peur de comprendre un peu mieux.

Transformer des points 3D en 2D ça ne se fait pas n'importe comment.
Tu veux donc faire une projection de ton espace 3D sur un plan.
L'ennui c'est que visiblement tu ne veux pas simplement faire cette projection sur le plan XY si j'ai bien compris.
Tu veux les coordonnées des points dans la vue caméra.

C'est ce que fait le moteur de C4D (ou de n'importe quel logiciel 3D) avec différentes formules plus ou moins compliquées qui dépendent entre autre de la caméra choisie. Son ouverture, etc ...

Pas sûr que ça puisse s'obtenir facilement ça... :?:
En tout cas je vois pas. Peut-être Tarlack si il passe par là.

tarlack
28/11/2009, 19h16
pour un modèle simplifié de caméra (pas de distortion focale, lentille de taille nulle, etc) c'est une matrice de transformation perspective M 4x4. Une fois que tu l'as, tu peux calculer [x_h, y_h,z_h,w_h]' = M*[x_v,y_v,z_v,1]' , où (x_v, y_v, z_v) sont les coordonnées dans l'espace monde de ton point, et le signe ' est là pour transposer (avoir un vecteur colonne). Tes coordonnées x,y sont alors données par x = x_h / w_h, y = y_h / w_h .
si ca t'interesse toujours, je peux détailler comment calculer M. cela dit, peut-etre que dans coffee ou via expresso, ils fournissent déjà tout ce qui est necessaire pour faire ce changement de coordonnées.

pour des modèles plus compliqués et plus proches de la physique, je ne sais pas si les modèles sont inversibles, mais je connais pas trop cette partie là.

lolofedo
28/11/2009, 19h31
Whaou, tu est beau Tarlack quand tu parle :bail:

Jean-Laurent
28/11/2009, 19h36
Toujours très intéressant de te lire tarlack. :wink:
Je me souviens avoir déjà utilisé ces formules pour simuler de la 3D sous flash en action script.
J'avais trouvé les matrices sur le net.

Pour fabian la réponse est donc bien: "ce n'est pas codable facilement".
Sauf si la fonctionnalité existe déjà sous C4D mais je n'en ai pas entendu parler.

tarlack
28/11/2009, 19h41
si tu as accès à l'angle d'ouverture de la caméra (qu'on peut trouver à partir de la focale au pire), la position de la caméra, son vecteur up et sa direction de visée, la matrice est pas si compliquée que ca il me semble (j'ai été confronté à ce genre de chose il y a pas mal de temps, donc je me souviens plus trop :oops: )
à partir de là, à coder c'est pas grand chose, coffee doit avoir une classe de matrice, ou au pire c'est 16 flottants, et la multiplication matrice/vecteur se code très vite aussi pour quelqu'un qui connaît coffee. donc c'est à Fabian de voir :) mais regarde quand meme si y a pas une fonction toute prête dans COFFEE...si y a une classe pour gerer les caméras, je verrais bien une fonction dans cette classe là :)

@lolo : ca se voit que tu m'as jamais vu parler en vrai :mrgreen:
@JL : merci :oops:

Jean-Laurent
28/11/2009, 20h15
si tu as accès à l'angle d'ouverture de la caméra (qu'on peut trouver à partir de la focale au pire), la position de la caméra, son vecteur up et sa direction de visée, la matrice est pas si compliquée que ca il me semble (j'ai été confronté à ce genre de chose il y a pas mal de temps, donc je me souviens plus trop :oops: )


Vi,vi. On a tout ça facilement.

Mais pour le pas compliqué je reste réservé même si coffee gère sans problème les matrices il me semble.
Si tu as la matrice sous les yeux n'hésite pas à nous l'exhiber. :wink:

tarlack
28/11/2009, 20h47
données de base :
C : position de la caméra
U : vecteur up de la caméra, normalisé
Z : direction de visée de la caméra, normalisée
f : angle d'ouverture de la caméra (field of view)

^ dénote le produit vectoriel.

on pose : X = Z ^ U
Y = X ^ Z

le deuxieme produit vectoriel, c'est pour s'assurer qu'on a une base orthonormale

vu que la fc4d est pas prévue pour faire des maths, je vais prendre une notation particulière pour définir les lignes d'une matrice : un ";" veut dire qu'on passe à la ligne suivante (comme dans matlab) :mrgreen:

on va faire ca via des produits de matrice : M = scaleBias * scale * persp * w2c
w2c passe les coordonnées de l'espace monde à l'espace caméra, défini par C et le repère (X, Y, Z) :

w2c = [X1, X2, X3, - C.x ; Y1, Y2, Y3, -C.y ; Z1, Z2, Z3, -C.z ; 0, 0, 0, 1]

persp fait la division perspective, c'est elle qui permet que les points alignés par rapport à la lentille aient les mêmes coordonnées x, y dans l'espace écran. ca consiste juste à diviser par la coordonnée z du point dans l'espace caméra, ce qui se fait via la coordonnée w dans l'espace homogène :

persp = [1, 0, 0, 0 ; 0, 1, 0, 0 ; 0, 0, 1, 0 ; 0, 0, 1, 0]
on note bien le 1 en 3ieme colonne dans la dernière ligne, pas à la 4ième.

scale permet de prendre en compte le field of view, en multipliant par un meme facteur les coordonnées x et y finales. on va noter a = 1/tan(f/2)

scale = [a, 0, 0, 0 ; 0, a, 0, 0 ; 0, 0, 1, 0 ; 0, 0, 0, 1]

et enfin, scaleBias permet de passer les coordonnées x et y de [-1, -1] à [0, 1]

scaleBias = [0.5, 0, 0, 0.5 ; 0, 0.5, 0, 0 ; 0, 0, 1, 0 ; 0, 0, 0, 1]

voila, si aucune erreur ne s'est introduite à mon insu :D

Jean-Laurent
28/11/2009, 20h59
";" veut dire qu'on passe à la ligne suivante (comme dans matlab) :mrgreen:


:lol: On t'a forcé aussi à faire du matlab ? C'est mes mauvais souvenirs de SI. :puke:

Merci pour les matrices. :poucehaut:
Il n'y a plus qu'à ... :wip:
Si j'ai un peu de temps j'essayerai demain, c'est le genre de truc qui m'amuse. T'éloigne pas trop, qu'on te tape sur les doigts au cas où. :mrgreen:

tarlack
28/11/2009, 21h13
matlab (ou octave pour moi) j'aime bien, ca me permet de tester très vite certaines choses pas trop compliquées avant de le coder sérieusement après :)
je vais mettre des moufles pour me protéger alors :D

Jean-Laurent
29/11/2009, 11h50
Tarlack, t'es là ? :nono:

Bon j'ai voulu jeter un coup d'œil rapide mais ça ne marche pas dés le début.

Si on regroupe tes matrices (très didactiques séparées mais pour des essais c'est plus pratique ...) on trouve la matrice suivante:

[ 0.5 a X1 0.5 a X2 0.5 a X3 -0.5 a C.x - 0.5 C.z
0.5 a Y1 0.5 a Y2 0.5 a Y3 -0.5 a C.y
0 0 0 -C.z
0 0 0 -C.z ]

Et là pas mal de choses me choquent à première vue.
En tout premier la simplicité de la matrice, mais bon, pourquoi pas.
Mais surtout le rôle de la position de la caméra suivant l'axe z (C.z).

On peut se placer dans un cas très simple où la caméra regarde un point en 0,0,0 du monde et se trouve sur l'axe x. Avec donc un C.z = 0.

Dans ce cas les deux dernières lignes de la matrices ne contiennent que des 0.
Ce qui implique entre autre un w_h =0.
Donc plus aucun calcul possible sous peine de diviser par 0. :?:

Tu n'aurais pas donné une formule simplifiée pour une caméra positionnée sur l'axe z des fois ?
Tes formules au fait c'est pour des trièdres directs ? Comme on est en main gauche dans C4D c'est pour ne pas se tromper.

tarlack
29/11/2009, 12h29
ben alors JL, on sait plus faire un produit matriciel ? :mrgreen: je rigole bien sûr, pour une fois que je pense ne pas avoir tord sur un truc de maths en parlant avec toi :prie:

moi j'obtiens ca (vérifié via un soft de calcul former -- wxmaxima -- tellement j'ai confiance en moi :D) :

[O.5 a X1 + 0.5 Z1 O.5 a X2 + 0.5 Z2 O.5 a X3 + 0.5 Z3 -O.5 a C.x - 0.5 C.z
O.5 a Y1 + 0.5 Z1 O.5 a Y2 + 0.5 Z2 O.5 a Y3 + 0.5 Z3 -O.5 a C.y - 0.5 C.z
Z1 Z2 Z3 -C.z
Z1 Z2 Z3 -C.z ]

on voit bien que la coordonnée W est bien la coordonnée en Z dans l'espace caméra :)

oli_d
29/11/2009, 12h31
Pas sûr que ça puisse s'obtenir facilement ça... :?:
En tout cas je vois pas. Peut-être Tarlack si il passe par là.


Dans le SDK en C++ il y a des fonctions (classe BaseView : Vector SW(const Vector& p) et suivantes) où on peut passer du monde, à la caméra et à l'écran. J'ai pas trop de temps en ce moment, mais cela m'intéresserait de regarder ceci dans un futur proche ....

Bon je dis ça, mais vous avez l'air de vous éclater avec vos matrices ...:arg:

Jean-Laurent
29/11/2009, 12h55
ben alors JL, on sait plus faire un produit matriciel ? :mrgreen: je rigole bien sûr, pour une fois que je pense ne pas avoir tord sur un truc de maths en parlant avec toi :prie:

moi j'obtiens ca (vérifié via un soft de calcul former -- wxmaxima -- tellement j'ai confiance en moi :D) :

[O.5 a X1 + 0.5 Z1 O.5 a X2 + 0.5 Z2 O.5 a X3 + 0.5 Z3 -O.5 a C.x - 0.5 C.z
O.5 a Y1 + 0.5 Z1 O.5 a Y2 + 0.5 Z2 O.5 a Y3 + 0.5 Z3 -O.5 a C.y - 0.5 C.z
Z1 Z2 Z3 -C.z
Z1 Z2 Z3 -C.z ]



Ah, je l'ai fait rapidement à la mano sur une feuille, à l'ancienne :lol:. Pas impossible que j'ai décalé un 1 et un 0 quelque part.
Je reprends ma copie. :wip:

Mais même avec ta matrice je ne comprends toujours pas comment ça peut marcher ?
Si la caméra est un z=0 quelque soit sa direction on a w_h=0 donc pas de x,y calculables dans ce cas ?
Avec par exemple x= x_h/w_h.

Pourtant la caméra peut être placée sur le plan xy ?
J'ai faux où?



Dans le SDK en C++ il y a des fonctions (classe BaseView : Vector SW(const Vector& p) et suivantes) où on peut passer du monde, à la caméra et à l'écran. J'ai pas trop de temps en ce moment, mais cela m'intéresserait de regarder ceci dans un futur proche ....


C'est l'idéal. L'ennui c'est que si c'est en C++ et pas en coffee il faut compiler ensuite pour la bonne version de C4D, le bon ordi etc ...
Si c'est une bête matrice on devrait faire ça plus facilement mais je reste sceptique.
Cela dit je trouve l'exercice très intéressant donc je m'accroche un peu.

Je profite de la présence de tarlack mais dès que j'ai un peu de temps il faudrait que je me replonge dans les matrices 3D pour y voir un peu plus clair ... :google:

tarlack
29/11/2009, 13h04
si tu as la caméra dans le plan xy, alors c'est juste C.z qui sera nul, ta direction de visée (Z1, Z2, Z3) est forcément un vecteur de norme 1, donc ses composantes seront non nulles, donc w_h sera non nul, sauf si le point est dans le plan défini par les vecteurs (X,Y) du repère de la caméra (auquel cas la caméra ne le voit pas) ;)

Jean-Laurent
29/11/2009, 13h22
Ah, oui. Pour le coup c'est moi qui suit étourdi j'étais resté avec l'idée de mes 0 sur ma dernière ligne de matrice. :oops:
Je repars donc avec la nouvelle matrice. :wip:

Par contre, j'ai refais le calcul deux fois, et je sais bien que je me fais vieux mais je ne trouve pas mon erreur ...
Il n'y aurait pas une coquille dans l'une des 4 matrices que tu as donné. :?:
C'est le plus plausible. :mrgreen:
Sinon je développe et tu me dis où j'ai fais faux. C'est pourtant pas la mort, des matrices quasi-diagonales. :roll:

Edit: J'ai rien dit. :mrgreen:

Plus c'est gros et moins on le voit, j'avais mis 0 0 0 au lieu de Z1, Z2 et Z3. :oops:

Itsmil
29/11/2009, 14h24
Je repars donc avec la nouvelle matrice. :wip:


Je t'ai démasqué Jean-Laurent ! :mrgreen:

http://www.syti.net/Images/Matrix2_154.jpg


ps: bon, faut que j'aille prendre mes cachets !!

tarlack
29/11/2009, 14h38
faire de la physique quantique et se planter sur 3 produits de matrices 4x4, bravo :mrgreen: :mrgreen:

fabian
29/11/2009, 15h56
:o P'tain, vous êtes une bande de grands malades en fait :-D
Moi j'espérais qu'on me dise ben tu cliques là, tu colles ce tag là et tadaaaammmm.
Ptain c hardcore de chez hardcore là vot' truc...
:D
Bon ben je crois que je vais essayer autre chose hein... :art:

Jean-Laurent
29/11/2009, 18h45
Moi j'espérais qu'on me dise ben tu cliques là, tu colles ce tag là et tadaaaammmm.


Il faudrait alors que tu demandes sur un forum de 3D.
Nous on s'occupe des maths et c'est tout. :mrgreen:

Bon le retour du "ça ne marche pas":

Le cas d'école:

La caméra est sur l'axe z en z=-100 et regarde un point sur l'origine du monde (0,0,0).
http://img687.imageshack.us/img687/5332/camerat.jpg

Le code en coffee:
http://img214.imageshack.us/img214/7217/codeb.jpg

Je récupère les données de la caméra, je défini mes vecteurs X,Y,Z, je construit la matrice comme un tableau etc ...
On ne le voit pas dans le code mais évidemment je multiplie par la matrice, je divise par W etc ...

Et les résultats:
http://img214.imageshack.us/img214/5939/consoler.jpg

Tout semble coller sauf le résultat incohérent de x et y.

Sinon le produit vectoriel dans tes formules tarlack c'est le même qu'en physique (trièdre direct) ou il est inversé comme le "vcross" dans C4D?

tarlack
29/11/2009, 19h58
euh, y a un soucis à la fin de ton code, tu ajoutes toujours m[0][3], quelque soit la ligne :)

Jean-Laurent
29/11/2009, 20h13
Que tu es pénible ... :mrgreen:

Effectivement. Mais ce n'est pas le seul soucis visiblement. :coup:

Là je fais ma grosse faignasse. Le plus simple je pense c'est de tout reprendre à la base et sans matrice.
C'est de la géométrie de grand papa, il doit y en avoir pour une grosse minute.
Ensuite je comprendrais sans doute mieux à quoi correspondent les matrices.

Là c'est zorro, ça attendra un peu. :nono:

tarlack
29/11/2009, 20h21
suffit de faire matrice par matrice pour tester, elles renvoient des résultats prévisibles dans ton cas si tu testes sur le point (0,0,0) : en sortie de w2c, tu dois avoir (0,0,100, 1), en sortie de persp (0,0,100,100), pareil en sortie de scale, et (50, 50, 100, 100) en dernier, ce qui donne bien 50/100 = 0.5 pour X et Y...

bon zorro :mrgreen:

Jean-Laurent
29/11/2009, 20h43
Il s'en est sorti de justesse. Ouf ... :mrgreen:

Pour moi aussi ça semble rouler du coup pour l'instant. :wink:
Il reste à voir si c'est récupérable à partir des particules.

Il faudrait que fabian nous dise sous quelle forme il veut ses points pour les récupérer dans flash. :?:

fabian
09/12/2009, 16h22
Yop les petits gars,
Sorry je reviens vers vous un peu tardivement je viens de jeter un oeil avec le développeur qui va s'occuper du projet
Donc en gros, il me faudrait les coordonnées 2D (du rendu) des 4 points d'une face (quadrangle) et ce pour chaque particule d'une scène.
Donc l'idéal serait d'avoir tout ça dans un xml pour chaque frame et chaque particule.
Mais je peux me débrouiller avec un code en COFFEE que j'arrangerai selon mes besoins s'il me donne bien les coordonnées des 4 points de chaque particules.
Limite un bête fichier texte c bon aussi ;-)
Mille merci d'avance, je transmettrai :-)

Jean-Laurent
09/12/2009, 17h38
Je pensais que tu avais trouvé plus simple. :wink:

J'ai réussi à reproduire une perspective très similaire mais il reste un petit décalage au niveau des points donc pour du mapping c'est pas encore bon.
Il faut que je regarde plus en détail, je pense que ça vient juste du format de l'image 4/13 ou 16/9 etc ...

Je n'ai pas regardé non plus si les points des particules sont récupérables.
Si c'est pour demain c'est grillé. :mrgreen:

Par contre si tu as encore un peu de temps devant toi je regarde ça de mon côté et je poste les avancées par ici.


Edit: Je viens de rejeter un coup d'oeil et je pense que la perspective marche bien. Je peux récupérer les coordonnées des points d'un objet. Mon erreur venait du fait que pour vérifier rapidement la perspective je faisais se déplacer un objet à l'écran suivant xy de C4D sans penser que lui aussi subissait l'effet de la perspective de C4D. :roll:

Edit2: Par contre aucune idée de comment récupérer les points pour des particules.
J'ai peur que ce soit ça qui pose problème. :coup:

fabian
09/12/2009, 18h14
Ouééé là tu m'intéresses :bounce:
Ok si la caméra est à présent parfaitement reproduite et que l'on peut récupérer ces coordonnées de points.
Comment pourrait-on faire faire pour les migrer vers un fichier texte ? voir un .xml (COFFEE ? EXPRESSO ?)
Et surtout quelle structure adopter pour récupérer correctement ces datas dans flashs :-/
Chaque keyframe est un fichier texte séparé et flash les loade simultanément ?
comment déterminera t'on ensuite quelle particule passe devant une autre ? à part la grandeur de sa surface ?

Et puisque je vois que tu maîtrises et que tu aimes bien, je pose l'ultimate question :-D
Comment récupérer les points 2D d'objets clonés sortis de Mograph ?
Je tâche de t'envoyer une scène test et de voir comment on pourrait faire pour chopper les infos.
de notre côté avec le développeur on postera les results.
Enfin si ca ne t'emmerde pas évidemment hein ;-)
Je crois que ca peut servir à pas mal de monde cette requête en fait :-)

Merci de t'être déjà penché là-dessus en tout cas ;-)

fabian
09/12/2009, 18h15
edit 1:
OK je parlais pas d'un emetteur de particules, mais bien d'un cloner object mograph ;-)
If it helps :-D

edit 2:
Ok je fais mes edits dans un autre message soit...

edit 3:
Au pire je peux aisément convertir l'anim mograph en objets distincts

Jean-Laurent
09/12/2009, 19h17
Je pense effectivement que la caméra est reproduite maintenant sans problème mais c'est loin d'être gagné pour le reste.
Donc pour l'instant je peux passer de coordonnées 3D à 2D.



Comment pourrait-on faire faire pour les migrer vers un fichier texte ? voir un .xml (COFFEE ? EXPRESSO ?)


J'ai déjà vu un truc dans le genre. Il me semble que c'est Base qui faisait ça. :?:
Dans le pire des cas, on peut sans doute écrire dans le container d'une primitive texte. Il me semble avoir déjà utilisé cette astuce mais dans l'autre sens.
Il faut voir si ce n'est pas limité en taille.



Et puisque je vois que tu maîtrises et que tu aimes bien, je pose l'ultimate question :-D
Comment récupérer les points 2D d'objets clonés sortis de Mograph ?


C'est là l'ennui. Je n'ai pas Mograph entre autre. :wink:
Mais visiblement en XPresso on peut récupérer la position des particules avec un "noeud donnée". Regarde si tu as ça.
Si on peut récupérer la rotation aussi c'est dans la poche.
Une position, une rotation et l'objet de départ et on aurait tous nos points en 3D facilement calculables.
Sauf si c'est faisable directement. C'est encore mieux.