| Auteur |
Passer à la 3D |
|
|
marcf3 Programmeur Basic

 Messages: 35 Calculatrice : Graph 85 SD | Message posté: 01-03-2008 à 14:47  
bonjour
je commence à programmer en langage C, et j'ébauche des calculs sur ma calto pour connaitre "comment on fait" un certain calcul.
le probleme que je me pose est un des plus ardus:
comment passer d'une liste de points en 3D à un affichage 2D?
g réduit le cas à l'affichage d'un seul point:
on connait les variables suivantes, qui sont celles de la calto bien sur:
A: abscisse du point
B: ordonnée du point
C: hauteur du point
D: abscisse de la caméra
E: ordonnée de la caméra
F: hauteur de la caméra
U: rotation horizontale de la caméra
V: rotation verticale de la caméra
W: rotation axiale de la caméra
merci d'avance pour les cracks qui réussiraient à pondre un code source qui réponde à ces instructions:
il y a des contraintes:
à la fin, on doit obtenir:
I: abscisse du point à l'écran
J: ordonée du point à l'écran
il faut tenir compte de la perspective.
le point ne doit être affiché que si il est dans le champ de vision de la caméra, c'est à dire environ 90 degrés.
les mesures d'angles doivent être en radians (comme en C)
ici, la taille de l'écran est 127x63, mais le repère à choisir pour afficher les points
est:
viewwindow: -63,63,1,-31,31,1 (vous voyez à peu près, quoi.)
celui qui trouvera la solution recevra ma bénédiction
 |
 |
Alexis Webmaster

 Messages: 820 Calculatrice : Graph 35+ | Message posté: 01-03-2008 à 16:48  
Bonjour,
si tu a un niveau post-bac en math, je pourrai te donner des pistes. Sinon, j'essaierai de te faire les calculs vers la fin de la semaine prochaine si ça t'intéresse.
 |
 |
dunedune Utilisateur Graph

 Messages: 186 Calculatrice : Graph 35+ | Message posté: 01-03-2008 à 17:33  
Félicitations pour ton courage alexis ! Mais n'est-ce pas accessible avec de simples co et sinus et tgts ?
 |
 |
Alexis Webmaster

 Messages: 820 Calculatrice : Graph 35+ | Message posté: 01-03-2008 à 19:19  
on a donc :
Xm'=cos a*sin b*(Xm-Xo)+sin a*sin b*(Ym-Yo)+cos b*(Zm-Zo)
Ym'=-sin a*(Xm-Xo)+cos a*(Ym-Yo)
où :
Xm' et Ym' sont les coordonnées sur l'écran
Xm, Ym, Zm les coordonnées du point M
Xo, Yo, Zo les coordonnées de la caméra
a et b les angles pour l'orientation de la caméra
 |
 |
marcf3 Programmeur Basic

 Messages: 35 Calculatrice : Graph 85 SD | Message posté: 02-03-2008 à 16:25  
ah ouais... en fait c'est plus simple que je ne le pensais.
j'avais déjà réussi à afficher des points mais dans un espace limité, et je me suis fâché avec les angles:
tu sais, je m'arrangeais pour trouver les 2 angles qui définissaient la direction ou se trouve le point, et j'obtenais la position à l'écran grâce à une tangente qui donnais un nombre entre 1 et -1. on multipliait ce nombre par la taille de l'écran...et voila.
mais dés que le point passait DERRIERE la caméra, bim! il revenait devant, peinard... et à l'envers. tu est sur que la définition que tu m'as donnée est complète et marche avec n'importe quel point? (je n'ai pas vu de conditions)
je vais l'essayer, et je te dis si sa marche.
sinon, jsuis en 1ère, et merci pour ton aide!
 |
 |
Alexis Webmaster

 Messages: 820 Calculatrice : Graph 35+ | Message posté: 02-03-2008 à 21:41  
en effet.
Pour empêcher les points situés "derrière" l'écran d'apparaître, il faut que :
cos a*cos b*(Xm-Xo)-sin a*cos b*(Ym-Yo)+sin b*(Zm-Zo)>=0
 |
 |
marcf3 Programmeur Basic

 Messages: 35 Calculatrice : Graph 85 SD | Message posté: 05-03-2008 à 17:38  
j'ai testé ton code mais il y a un souci:
la 3D manque de profondeur. si j'éloigne la caméra, rien ne se passe, et on n'a pas de point de fuite.
voici un exemple de 3D que je recherche:
bon, bien sur c pioché sur le net et je ne demande pas d'afficher des surfaces
mais tu remarques que ça le fait mieux.
j'ai fait une étude là dessus, il faut connaitre les coordonées polaires de chaque point en 3D et y ajoutant les angles de la caméra. mais je n'arrive pas à trouver la formule miracle!
cette formule renverrait 2 angles qui, une fois passés par une tangente, deviennent ces fameuses coordonées à l'écran.
 |
 |
Alexis Webmaster

 Messages: 820 Calculatrice : Graph 35+ | Message posté: 05-03-2008 à 19:08  
"la 3D manque de profondeur. si j'éloigne la caméra, rien ne se passe, et on n'a pas de point de fuite" tout ça est lié au fait qu'il n'y a pas de point de fuite.
Les formules que je t'ai données ne prennent pas en compte ce point de fuite parce que je n'étais pas sûr qu'elles étaient correctes.
 |
 |
marcf3 Programmeur Basic

 Messages: 35 Calculatrice : Graph 85 SD | Message posté: 08-03-2008 à 15:44  
j'ai élaboré un nouveau code qui marche à peu près bien pour la 3D réelle.
il y a la profondeur.
j'ai utilisé 3 types de coordonées:
coordonées cartésiennes, polaires et sphériques.
le dernier type est assez difficile à concevoir, pourtant c celui qui permet la rotation.
(il s'agit de coordonnés polaires dans l'espace ou chaque angle est fonction de l'autre et vice versa)
après moulte conditions et formules à rallonge, on aboutit à 2 angles équivalents à ceux des "rayons de lumière" qui percutent la caméra à des coordonées x et y.
c'est une sorte de projection, en fait.
mais mon code est tellement long, et je ne suis pas sur kil marche dans tous les cas... kan j'en aurai le temps, je l'écrirai sur le forum et j'ajouterai des images.
 |
 |
Alexis Webmaster

 Messages: 820 Calculatrice : Graph 35+ | Message posté: 08-03-2008 à 16:53  
ok
sinon pour ajouter un effet de profondeur, tu peux faire :
d=K*sqr((Xm-Xo)^2+(Ym-Yo)^2+(Zm-Zo)^2)
où K est une constante>1.
et prendre pr abscisses et ordonnées :
X''m=X'm/d
Y''m=Y'm/d
 |
 |
marcf3 Programmeur Basic

 Messages: 35 Calculatrice : Graph 85 SD | Message posté: 09-03-2008 à 15:48  
je ne comprend pas très bien cette formule... mais bon je vais l'essayer, pour voir.
je croyais que tout était une affaire d'angles:
lorsque l'on regarde un objet, il renvoie vers notre oeil un rayon lumineux qu'on peut intérpréter comme une droite. cette droite est égale au rayon d'une sphère virtuelle. lorsqu'on fait pivoter notre tête, cela revient à déplacer l'objet sur la sphère.
pour afficher l'objet sur un écran, il suffit de récupérer les 2 angles avec lequels le rayon percute notre oeil. après, on leur applique tan(angle) et c'est fait.
mais raisonner comme ça, sa donne des calculs trop complexes...
je vais tester le code.
 |
 |
Alexis Webmaster

 Messages: 820 Calculatrice : Graph 35+ | Message posté: 09-03-2008 à 16:36  
oui, je vois ce que tu veux dire.
Bon courage pour la suite
 |
 |
marcf3 Programmeur Basic

 Messages: 35 Calculatrice : Graph 85 SD | Message posté: 12-03-2008 à 19:20  
j'ai testé ton code:
K=?
K fait en effet varier la "taille" de l'image des points (en l'occurence, un cube)
mais K ne devrait pas être constante puisque l'on ne voit pas les 8 points.
il s'agit donc d'une affaire de coordonées sphériques.
j'ai vu récement des librairies qui traitaient la 3D donc je pense que je vais laisser
tomber pour le moment.
dommage j'avait fait une bonne percée, là
 |
 |
marcf3 Programmeur Basic

 Messages: 35 Calculatrice : Graph 85 SD | Message posté: 14-04-2008 à 16:02  
EUREKA
j'ai trouvé le code pour visualiser jusqu'à des maillages en 3 dimensions,
avec effet de profondeur, comme dans les jeux! (pas la isométrique, hein )
j'enverrai bientot un lien vers un programme G1M (eh oui...) capable de faire
ça, avec des commentaires, de l'aide pour l'intégrer dans d'autres progs.
3DVIEWER!
 |
 |
PierrotLL Administrateur

 Messages: 762 Calculatrice : Graph 85 | Message posté: 14-04-2008 à 17:34  
Bien joué, je regarderais ça.
Mais ça lagg pas trop?
 |
 |
marcf3 Programmeur Basic

 Messages: 35 Calculatrice : Graph 85 SD | Message posté: 15-04-2008 à 18:50  
avec toutes les options activées, oui sa rame. normal.
mais ce prog pourrait servir à des supports plus puissants.
(je sais qu'il y a le GPU pour les ordis par exemple)
voici le lien vers 3DVIEWER DEMO:
http://www.jeuxcasio.com/modules/Downloads/getftemp.php?nom=3DV~DEMO.G1M
j'ai mis demo car la version complète est trop compliquée (et lente)
pour être mise sur une g85, après c le classpad.
 |
 |