Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » Les espaces 3D (coder)
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Les espaces 3D (coder)

Posté le 13/02/2017 19:18

Bonjour,
Je suis disperseur, cela fait un petit bout de temps que je me suis intéressé à la programmation et comme tout programmeur je me suis penché sur la question de la 3D. J'ai récemment commencer un petit programme en 3D (voir SEE 3D sur planete casio dans la rubrique projets pour graph35+ )(simple couloir à visualiser sous tous les angles ou presque ) et je me demandais comment on pouvais coder une pièce en 3D sachant qu'il faut penser à chaque posibilité d'angle de vues (+que 9 dans une pièce de 3x3...). Est ce qu'il n'y aurai pas une alternative à coder tous ces côtés par exemple avec une ou des matrices...?
Si quelqu'un a une bonne idée pour cela est ce qu'il pourrait m'en faire part. ..?! Svp

Salut.
DISPERSEUR


1, 2, 3, 4, 5, 6 Suivante
Lephenixnoir En ligne Administrateur Points: 24556 Défis: 170 Message

Citer : Posté le 13/02/2017 20:13 | #


L'algèbre linéaire et ses calculs matriciels offrent un fond théorique très puissant. En multipliant tes vecteurs (qu'il faut écrire (x, y, z, 1), la dernière coordonnée étant qualifiée d'homogène) par des matrices 4*4 (les matrices 3*3 sont plus "limitantes"), tu peux réaliser toute transformation affine (i.e. f(a * x) = a * f(x) + cc est une constante). Cela comprend :
- Les rotations (fondamental !)
- Les symétries (moins utile)
- Les translations
Si tu tournes la tête de 30°, tu n'as qu'à transformer le monde de -30° et alors tu peux faire comme si tu regardais droit. Ta seule préoccupation devient d'afficher un monde où les axes sont toujours dans la même direction. Le problème en est très simplifié !

Les maths derrière sont un peu compliquées (tout dépend de ton niveau d'études), mais c'est la méthode infaillible pour comprendre les mécanismes des moteurs 3D. Si ça t'intéresse je te conseille de creuser de ce côté
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 14/02/2017 18:55 | #


je pense que je devrais attendre un peu avant de m'y mettre sérieusement... Je crains de ne pas avoir le niveau d'études suffisant...4 ème. Mais je pense que je peut me restreindre à des trucs comme mon petit programme SEE 3D.
Merci quand même, j'en prend note pour plus tard .
Salut

Ajouté le 14/02/2017 à 19:00 :
PS: peut tu me préciser comment tu peut enregistrer une "map" 3D (ce que l'on voit. En tournant la tête par ex )sur une matrice..?

Dark storm Hors ligne Labélisateur Points: 11641 Défis: 176 Message

Citer : Posté le 14/02/2017 19:25 | #


La matrice sert juste à faire les calculs de rotation/translation/symétrie. Pour stocker une map, il faut stocker des points dans l'espace (donc [x, y, z, 1]). Tu peux par contre mettre ces points dans une matrice :
[[x1, y1, z1, 1],[x2, y2, z2, 1],…]→Mat A

Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 15/02/2017 13:59 | #


OK merci, donc quand tu tourne la tête de 30 degrés, ou tu te déplace (en gros quand le monde virtuel bouge, le decor) c'est juste les cases de valeurs utilisés dans les matrices, qui changent. Ex: dans une matrice de 2x2 avec les valeurs : 1 et 2, au début tu utilises la valeur 1, mais quand tu bouges, cela change et tu prend la valeur 2. Cela mais avec trois coordonnées : x,y,z...? Mais attend...! C'a te fait une matrice énorme si pour chaque position il faut des coordonnées différentes .
Bon je dis ça mais de mon côté, je pense qu'il faudrait que je me penche sur les drawsats... ....?

Au fait, juste une dernière petite question, :
n'existe t il pas de tuto sur les affichages de mondes virtuels 3D ou sinonymes. ..?
Lephenixnoir En ligne Administrateur Points: 24556 Défis: 170 Message

Citer : Posté le 17/02/2017 14:03 | #


Les tutos que tu pourras trouver te parleront tous de transformations matricielles. J'ai déjà rédigé un message pour te répondre hier, mais je l'ai perdu par accident - tu m'excuseras donc d'écourter ma rédaction pour cette fois. Puisque le sujet a l'air de t'intéresser, je vais essayer de faire simple ; peut-être trop pour toi, enfin j'imagine qu'il vaut mieux que je raconte des trucs évidents plutôt que tu ne comprennes pas.

Si tu es en 4ème, j'imagine que tu n'as as encore vu les fonctions (3ème si ma mémoire ne me trompe pas). Une fonction, c'est une sorte de machine, de procédé de calcul, qui reçoit quelque chose en entrée et te produit un résultat en sortie. Le résultat ne dépend que de la valeur entrée. Tu peux par exemple avoir une fonction dont l'entrée est un nombre réel, et la sortie sa partie entière (la sortie est donc un entier signé). Le « type » de l'entrée et de la sortie n'est pas forcément le même : tu pourrais étudier la fonction qui à une longueur d'onde visible (couleur) associe sa composante rouge dans la décomposition rouge - vert - bleu (réel entre 0 et 1).

Un moteur 3D manipule essentiellement des points 3D. Ces points peuvent se représenter par des objets mathématiques, le plus simple étant le triplet (x, y, z) ou x, y et z sont des réels. Trois dimensions, trois coordonnées. C'est important : il y a plein de manières différentes de repérer les points dans l'espace mais toutes nécessiteront trois valeurs, ni plus, ni moins. Avec deux valeurs tu n'as pas assez d'informations, et avec quatre tu en as trop. Tu pourras m'objecter que Darks et moi ne parlons que de vecteurs à 4 coordonnées depuis le début mais c'est un artifice de calcul. Comme tu as pu le remarquer, la dernière coordonnée vaut toujours 1 : elle ne contient pas d'information. On dit que l'espace est de dimension 3 (aucune surprise de ce côté-là mais c'est un terme de maths).

Le sujet qui nous intéresse ici ce sont des fonctions de l'espace. Je vais considérer par exemple une telle fonction que j'appelle f. f est une fonction qui prend en entrée un point et envoie en sortie un autre point dit « image ». Je vais prendre par exemple un point p1 dans l'espace (n'importe lequel), et j'appelle p2 le résultat obtenu en donnant p1 à f. On dit que p2 est l'image de p1 par f, et on écrit p2 = f(p1). On a donc un point « source », p1, et son point transformé p2. Pour concrétiser un peu cette histoire, considérons la fonction g, qui à un point (x, y, z), associe le point (x + 1, y, z). (C'est du vocabulaire de matheux tout ça, mais ça devrait être compréhensible.) Si l'on compare le point donné en entrée au point obtenu en réponse, on s'aperçoit que le second est décalé d'une unité sur l'axe x par rapport au premier. La fonction g est donc une translation sur l'axe x.

Si on applique la fonction g à tous les points de l'univers, alors on aura translaté l'univers tout entier. On aura opéré une transformation de l'espace. Les moteurs 3D font beaucoup de ces transformations. Bien sûr, les translations ne sont pas les seuls. Imagine par exemple la fonction h, qui au point (x, y, z) associe le point (y, x, z) (je t'invite peut-être à faire un dessin sur une plan). Ce n'est pas évident tout de suite, mais il s'agit d'une symétrie axiale. On peut réaliser un grand nombre de transformations de cette manière, y compris les incontournables rotations. (La symétrie axiale n'est pas très utile pour un moteur 3D, en revanche la rotation est fondamentale !)

Maintenant que tu comprends (enfin, je l'espère !) le principe des transformations, voyons ce qui se passe quand ton personnage (supposons qu'il se trouve pour l'instant au centre du monde et regarde dans la direction des x positifs) recule d'une unité. Le personnage devrait alors se trouver en x = - 1. Le moteur 3D ne va cependant pas vraiment déplacer le personnage, il va plutôt déplacer le monde autour de lui. Du point de vue du personnage, tout se passe comme si le monde avait avancé de 1 dans la direction des x (oui, dans l'autre sens !). Le moteur 3D va donc se contenter de transformer le monde à l'aide de la fonction g de toute à l'heure, translatant le monde de 1 sur l'axe x : une fois cette transformation faite, le nouveau centre du monde tombera pile sur la position du joueur.

Tout va se passer de cette manière : si le personnage regarde dans une autre direction, le moteur 3D opérera une rotation sur le monde en sens inverse ; le personnage ne se déplace jamais vraiment, c'est le monde autour de lui qui se transforme. À chaque image, le monde transformé aura pour centre la position du joueur, et pour direction les x croissants. Cela signifie que le moteur 3D n'a plus besoin de gérer toutes les directions : une fois le monde transformé, il se résume toujours à « le joueur est en (0, 0, 0), il regarde dans la direction des x croissants ». Il n'y a donc qu'une direction fixe et simple à gérer

Les matrices interviennent ici. Les fonctions de l'espace dont je t'ai parlé tout à l'heure vérifient certaines propriétés, et en conséquence on peut les représenter dans des matrices (des matrices carrées, d'ailleurs). Le contenu de la matrice en elle-même, si tu la vois, ne te parlera sans doute pas : sache simplement qu'on peut l'obtenir avec des maths. On peut aussi représenter les points dans des matrices : il suffit de faire une colonne qui contient x, y, z, 1 (oui, le 1 est de retour : ne me demande pas pourquoi). Et alors ce qui tombe bien, c'est que les matrices c'est un peu comme des nombres : on peut les multiplier. Il y a plein de règles bizarres qui font qu'on peut pas les multiplier n'importe comment, et le calcul d'une multiplication de matrices est assez bizarre, mais on peut. Et là (retiens ton souffle, je vais sortir un truc extrêmement important mais sans le justifier du tout), il se trouve tu peux faire ça :

[                   ]     [  x1  ]     [  x2  ]
[    Une matrice    ]  ×  [  y1  ]  =  [  y2  ]
[  de taille 4 * 4  ]     [  z1  ]     [  z2  ]
[                   ]     [  1   ]     [  1   ]

Ce que cette ligne de maths veut dire, c'est que si tu représentes ta fonction de l'espace dans une matrice 4 * 4 (j'ai dit qu'on pouvait le faire), et que tu la multiplies (par un procédé que je ne te détaille pas) avec un point de l'espace, que j'ai écrit (x1, y1, z1) et que je vais nommer p1, alors tu vas obtenir quelque chose qui ressemble aussi à un point, un point (x2, y2, z2) que je vais nommer p2. La magie c'est que p2 est le point image de p1 par la fonction qui est représentée dans la matrice. Autrement dit la multiplication des matrices permet de transformer les points du monde.

Ce message est beaucoup plus long que l'ancien en fin de compte ! Il y a encore plein de choses à dire mais je vais m'arrêter là pour l'instant. Si tu ne comprends pas tout, n'hésite pas à me demander des précisions : je pense que tout le message est compréhensible avec un peu d'efforts. Et si tu as tout compris, bravo !
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 17/02/2017 20:01 | #


Merci beaucoup beaucoup pour ces informations très précieuses, je pense quelles me feront bien avancer. Je les lis ce soir. Apprentissage garanti !
Salut
DISPERSEUR


Ajouté le 18/02/2017 à 18:43 :
Autre petite question (possible que se soit la derniere ): Quand tu dit : "une fois le monde transformé, il se résume toujours à « le joueur est en (0, 0, 0), il regarde dans la direction des x croissants ». Il n'y a donc qu'une direction fixe et simple à gérer ",
je ne comprend pas trop de quoi tu parle... .
aussi quand tu dit :
"Le moteur 3D va donc se contenter de transformer le monde à l'aide de la fonction g de toute à l'heure, translatant le monde de 1 sur l'axe x : une fois cette transformation faite, le nouveau centre du monde tombera pile sur la position du joueur.",
les points qui constituent le paysage (aussi le lignes) comment on peut les faires s'afficher a la suite et de maniere fluide...? Je pense qu'il faudrait les sauvegardés dans une matrice, mais j'ai de gros doutes...


Ajouté le 18/02/2017 à 18:46 :
Prend ton temps pour me répondre....economise de l'encre , je continue d'etudier ce que tu m'as précédemment ecrit...alors a plus.
Lephenixnoir En ligne Administrateur Points: 24556 Défis: 170 Message

Citer : Posté le 18/02/2017 21:07 | #


En principe on devrait pouvoir faire un moteur 3D sans transformer le monde. Le monde serait un ensemble de points fixes qu'on relie et qu'on affiche (avec des textures disons). Alors on ferait les calculs en disant « dans le repère fixe de centre (0, 0, 0) et de directions x / y / z, le joueur se trouve en (12, 0, -4) et regarde avec un angle horizontal de 30° et un angle vertical de 0° ». Mais en fait c'est dur de faire les calculs en prenant en compte tous ces paramètres en même temps ; trouver une formule qui permet de savoir quel point est visible et comment il est perçu avec l'effet de perspective, quand on a une position qui change et deux angles, c'est dur.

Alors on simplifie le problème en modifiant le monde : on calcule un nouveau monde, identique au premier, mais légèrement décalé ou tourné. Par exemple, imaginons que le personnage est sur un tonneau, aux coordonnées (12, 0, -4) et qu'il regarde une auberge à 30° sur la gauche. C'est compliqué de tenir compte de la position variable du joueur : on aurait envie qu'il soit en (0, 0, 0). Mais bien sûr on ne peut pas déplacer le joueur, sinon ben, on n'affiche plus la même chose. Alors du coup on calcule un nouveau monde dans lequel le tonneau est en (0, 0, 0) : on translate touts les points du monde de -12 sur l'axe x, et 4 sur l'axe z. Un point qui était anciennement aux coordonnées (x, y, z), devient donc (x - 12, y, z + 4) (par le procédé de transformation de l'espace que j'ai évoqué plus haut). Et alors miracle, le tonneau se trouve en (0, 0, 0). Après cette transformation du monde, on a éliminé le facteur « position ». Au lieu d'afficher le monde d'origine, qu'il faudrait calculer en considérant que le joueur est en (12, 0, -4), on affiche le monde transformé, dans lequel le joueur est en (0, 0, 0). Dès lors, tous les mondes affichés à l'écran sont vus depuis la position (0, 0, 0).

Il en va de même pour les angles. Si le personnage regarde de 30° vers la gauche, alors on va tourner le monde de 30° vers la droite ; on a alors deux copies du même monde avec des systèmes de coordonnées différents : si on travaille dans l'ancien, alors l'auberge est à 30° sur la gauche du personnage ; mais si on travaille dans le deuxième, alors elle est tout droit devant le personnage On a inversé la transformation provoquée par la rotation de la tête du joueur. Et on fait pareil avec l'angle vertical. En fait on peut fait pareil avec toutes les rotations qu'on veut. Tu veux tourner la tête de sorte à poser ton oreille sur ton bureau ? C'est encore une rotation différente. Un moteur 3D qui n'utiliserait qu'un monde fixe devrait faire des calculs toujours plus compliqués pour satisfaire des rotations exotiques comme celle-ci, mais un moteur 3D qui transforme le monde n'a qu'à inverser la transformation pour redresser le monde, et peut ainsi prendre des points de vue plus complexes avec souplesse.

Pour ce qui est de la question plus pragmatique de « comment on stocke et affiche le monde », il y a plein de réponses possibles. La fluidité, elle vient uniquement de fait que le processeur et le matériel sont rapides. Jamais tu n'afficheras une salle avec une table et une porte de manière fluide en Basic Casio - autant retourner dormir tout de suite. Il n'y a pas de magie dans l'affichage : on prend une à une toutes les lignes et toutes les textures, et on les dessine pixel par pixel. Pour le stockage, il suffit de faire un tableau de points 3D à quatre coordonnées (x, y, z, 1) comme je l'avais évoqué précédemment. Une matrice avec quatre lignes est un bon choix. On pourrait aussi utiliser une matrice à quatre colonnes, ou bien quatre listes. Peu importe, dans le principe. Note juste, que si tu utilises une matrice pour stocker un ensemble de points, alors ta matrice n'est qu'un tableau à deux dimensions. Elle n'a plus aucune propriété mathématique comme celle de transformer les points comme je l'ai évoqué plus tôt.

Le principe de transformation est assez puissant à mon avis, et c'est sans doute ce qu'il y a de plus important. D'autant plus que les matrices cachent encore des petites surprises pour ce qui est de combiner différentes « corrections » : dis-moi si tu veux en savoir plus.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 19/02/2017 11:38 | #


Encore merci beaucoup.....


Ajouté le 19/02/2017 à 11:40 :
Merci du temps que tu m'à accordé, je vais étudier ce que tu m'as écrit, et encore merci....
Ninestars Hors ligne Membre Points: 2462 Défis: 24 Message

Citer : Posté le 19/02/2017 23:06 | #


lephenixnoir a écrit :
Mais en fait c'est dur de faire les calculs en prenant en compte tous ces paramètres en même temps ; trouver une formule qui permet de savoir quel point est visible et comment il est perçu avec l'effet de perspective, quand on a une position qui change et deux angles, c'est dur.
Je sais qu'on avait déjà discuté de cela par rapport à mon projet Lephé, mais je réitère. On peut savoir ce qu'on dessine à l'écran qu'après avoir calculé la transformée des points. C'est pas que c'est "dur" de savoir ce qu'on va dessiner à l'avance, c'est que ça n'est pas possible. (A moins que tu me montres le contraire, et j'en serais ravi )

Dans son cas, il ne sert à rien d'utiliser les vecteurs à 4 dimensions, ça n'apporte rien, car sa matrice sera une matrice d'Euler 3x3 dans le coin supérieur-gauche... le reste remplie de 0 avec un 1 en bas à droite. Donc aucun intérêt, surtout pour se retrouver avec un vecteur (x', y', z', 1) en sortie... Ajouter la perspective revient simplement à diviser le vecteur de sortie (x', y', z') par z, on obtient (x'/z', y'/z', 1).
Pour être plus précis: la quatrième coordonnées n'est pas toujours égale à 1 si on inclue la perspective dans les coefficients de la matrice. Dans ce cas il faut normer le vecteur de sortie en divisant toutes les coordonnées par la 4ème (x', y', z', w) devient (x'/w, y'/w, z'/w, 1). Ce qui revient à toujours faire les divisions, on ne peut pas y échapper.
Et c'est tout

Un moteur 3D, c'est 5 lignes de calcul :
3 pour avoir x', y' et z'
2 pour calculer x'/z' et y'/z'

C'est un projet ambitieux Disperseur, surtout au vu de ton age/niveau scolaire
Lephenixnoir En ligne Administrateur Points: 24556 Défis: 170 Message

Citer : Posté le 20/02/2017 09:39 | #


Alors là, je ne faisais aucunement référence à nos discussions précédentes, Ninestars. Je me suis abstenu de prétendre que c'était impossible puisque l'on peut toujours refaire les mêmes calculs dans la base d'origine (c'est juste bourrin, stupide et opaque) et faire des projections bizarres, mais il faut comprendre de tout ça, que c'est impossible. Pour la démonstration, eh bien... le fait que le système de coordonnées d'origine soit également une base orthonormée (comprends : donc avantageuse) ne te suffit-il pas ? Tous les calculs que tu peux faire dans une base, tu peux aussi les faire dans un autre. Ta projection finale se fera simplement sur un plan quelconque.

Les quatre dimensions, il semble que tu l'aies oublié, c'est nécessaire pour les translations. Avec des vecteurs à 3 coordonnées on ne peut que représenter les applications linéaires et les translations n'en sont pas. Du reste, la composition des matrices se montre utile pour éviter de séparer la transformation en plusieurs parties dans le code. Donc, ses matrices ne seront pas uniquement des matrices d'Euler (qui, si j'ai bien compris ce que j'ai lu, sont des composées de rotations sur trois axes). Je citerai également (par pure forme) que toutes les accélérations matérielles fonctionnent sur du 4x4 (je renvoie à la seule instruction de produit matriciel du SH4 qui prend du 4x4 par du 4x1), et que ça me semble donc une bonne habitude à prendre.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ninestars Hors ligne Membre Points: 2462 Défis: 24 Message

Citer : Posté le 20/02/2017 10:56 | #


lephenixnoir a écrit :
Tous les calculs que tu peux faire dans une base, tu peux aussi les faire dans un autre.
Certes, mais au final il faut les faire, c'est ce que je dis. Il n'y a pas de solution miracle qui te donne que les points à calculer qui seront à l'écran après projection

C'est vrai, je ne l'ai pas précisé pour les translations. Je pensais les inclure dans le calcul de x', y' et z'
x' = a11 * (x - camera_x) + a12 * (y - camera_y) + a13 * (z - camera_z)
Mais du coup, ce n'est plus du calcul matriciel et on perd les avantages que tu cites, exactement !
OpenGL et ses amis utilisent les 4x4 en effet

Pour revenir à son problème, je ne sais pas si en Basic, passer par les matrices sera plus rapide
Lephenixnoir En ligne Administrateur Points: 24556 Défis: 170 Message

Citer : Posté le 20/02/2017 11:05 | #


Ah ben tu ne peux pas éviter la projection, non : peu importe la base dans laquelle tu la fais. x) Cela dit tu pourrais la faire au dernier moment et penser ton programme en déplaçant ta caméra et tes angles ; c'est plus une question de « philosophie » et de conceptuel, comment on décide de voir le problème.

Dans mes propres tests (pas très poussés pour l'instant), j'ai en effet fait les translations comme tu le proposes. Mais je pense que conceptuellement c'est moins clair. Pour la projection, je n'ai pas cherché en détail mais je ne crois pas que ce soit possible.

Pour ce qui est du Basic, tu es plus expérimenté que moi, mais je sais que plus le système en fait et mieux c'est. S'il faut effectuer trois soustractions, mon « pronostic » et qu'on perdra du temps par rapport au cas où la translation est déjà inclue dans le produit matriciel.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 20/02/2017 18:11 | # | Fichier joint


En tout cas, les infos et les précisions que tu m'as.....eu pardon, que vous m'avez donner (Lephenixnoir et Ninestars) mon permises de coder, en m'y inspirant, une petit "moteur" je ne pense pas que l'on peut appler ça comme ça ...mais en tout cas je voulais juste savoir si c'était une bonne base (voir fichier joint). Sur ce, a plus

PS: le fichier joint est sur graph 35+ et c'est le prog : "3D WORLD"



Ajouté le 20/02/2017 à 19:42 :
Wow, Ninestars, je suis aller voir ta page sur ton moteur 3d, super impressionnant, je comprend maintenant quand tu me dit que c'est ambitieux de concevoir un moteur 3D......
Au fait, le programme demo de ton 11eme jet est t il compatible graph35. ..?


Ajouté le 21/02/2017 à 18:06 :
J'ai trouvé moi mème la réponse.... , il suffit d'essayer.

Ajouté le 22/02/2017 à 10:36 :
Et pour le bidon de 5 litres, je pense que quelques guttes devraient suffirent. ..
Lephenixnoir En ligne Administrateur Points: 24556 Défis: 170 Message

Citer : Posté le 22/02/2017 10:42 | #


Hmm, ton programme est pas moche, mais tu ne peux pas gérer toutes les coordonnées des points à la main comme ça -- d'ailleurs je parie que tu n'arriverais pas à gérer un personnage qui tourne à l'intérieur de la pièce pour cette simple raison (les formules seraient hyper compliquées). Le problème le plus important, c'est que comme tu déplaces tes points de petites quantités « arbitraires », on voit (forcément) des choses un peu déformées. Si tu laissais faire les calcul à une fonction de transformation, tu n'aurais pas ce problème. Par ailleurs, tu as quelque peu « hardcodé » la structure de la pièce et le point de vue ! ^^'
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 22/02/2017 15:26 | #


Quand tu dit que j'ai "hardcodé" la structure de la piece, tu veut dire quoi.....? Je voyais pas trop comment je pouvais faire autrement, mais je vais creuser un peut plus du côté de la fonction de transformation.
Lephenixnoir En ligne Administrateur Points: 24556 Défis: 170 Message

Citer : Posté le 22/02/2017 15:32 | #


C'est pas vraiment du hardcode. La définition exacte du hardcode, c'est quand ton programme fait des suppositions inappropriées sur l'environnement dans lequel il tourne. Par exemple, un programmeur qui part du principe que son programme fonctionnera sous Windows et qui modifie son code en conséquence, « hardcode » dans son programme le fait qu'il tournera sous Windows.

Dans ton cas, ton programme suppose en quelque sorte que le monde est une pièce rectangulaire et que la direction de vision est parallèle à l'un des cotés ; il ne sait pas faire de choses plus générales.

Commence à penser ton monde comme un ensemble de points reliés par des lignes. Décide d'un repère à trois directions et crée une matrice, comme tu l'as dit Darks, avec une ligne (ou une colonne, mais je pense qu'une ligne ce sera mieux ) par point. Par exemple pour un cube centré sur l'origine avec une largeur de 2, tu obtiens la matrice suivante (l'ordre n'importe pas) :
+1 +1 +1
+1 +1 -1
+1 -1 +1
+1 -1 -1
-1 +1 +1
-1 +1 -1
-1 -1 +1
-1 -1 -1

Pense à ajouter une quatrième colonne avec uniquement des 1 si tu veux pouvoir appliquer les translations avec la matrice de transformation de monde dont je t'avais parlé. Ninestars se demandait si ce serait plus efficace, alors autant tester.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 22/02/2017 15:48 | #


Tu m'excuse mais j'ai des leçons à apprendre, je verrai ça après. ...
Au fait, je pense que ça va me prendre beaucoup de temps pour faire ça, car j'ai pas tout suivi précédemment....
Lephenixnoir En ligne Administrateur Points: 24556 Défis: 170 Message

Citer : Posté le 22/02/2017 15:52 | #


Aucun problème. x)
Pour le coup c'est vraiment pas un exercice trivial. Ce serait déjà génial si t'arrivais à implémenter un truc simple, alors n'hésite pas si tu as des questions.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 22/02/2017 16:24 | #


Les points que tu m'as proposés, je les traces en drawstats ou en f-line...?


Ajouté le 22/02/2017 à 16:25 :
Tu m'as complètement perdu là....
Lephenixnoir En ligne Administrateur Points: 24556 Défis: 170 Message

Citer : Posté le 22/02/2017 16:31 | #


En fait... pour l'instant je n'ai rien proposé qui permette de tracer les lignes ; je me suis juste occupé des points. Voici par exemple comment un moteur classique pourrait fonctionner :
→ Le monde est représenté par un ensemble de points repérés dans un repère fixe (par exemple une matrice) ;
→ Le programme calcule une matrice de transformation qui dépend de la position du joueur et de la direction dans laquelle il regarde ;
→ Il calcule ensuite l'image de chaque point du monde par la transformation et forme un nouvel ensemble de points représentant le monde transformé ;
→ Il applique ensuite un effet de perspective (il suffit pour cela de diviser quelques coordonnées) ;
→ Il affiche enfin le résultat à l'écran.
À ce moment-là, on a des points (juste des points). Si tu veux les relier pour obtenir des lignes, il faut stocker quelque part d'autres une liste des numéros des points qu'il faut relier (le numéro d'un point servant à le localiser dans la matrice du monde).

Ce procédé est assez important, prends le temps de bien le comprendre. (Sinon je peux tenter de faire des schémas, mais j'ai peur du résultat. )
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
1, 2, 3, 4, 5, 6 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 117 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd