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


Lephenixnoir Hors ligne Administrateur Points: 24574 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)
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 22/02/2017 17:41 | #


Je suis désolé, je pige pas tout, je suis sans doute un peu fatigué....Je m'arrête là ce soir, je me pencherai là dessus un peu plus demain. Bonne soirée.

PS: Le prog que j'ai déja fait, faut-il que je le recode.... Si oui, ça va etre un peu galère.....je me rapelle pas tout a fait de ce que j'ai fait..

Ajouté le 22/02/2017 à 18:13 :
Dernière petite question, pour les rotation, je peu utiliser les matrices..?, ou...les fonctions..?
Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

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


Une rotation, c'est une fonction. Et cette fonction, on peut la représenter... par une matrice !

En pratique tu utiliseras des matrices et tu transformeras le monde en utilisant le produit matriciel Par contre il faut que tu calcules les valeurs (on dit aussi les coefficients) de la matrice, et pour ça, il faut qu'on te donne les formules : tu ne les trouveras pas tout seul.
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 23/02/2017 09:42 | #


Wow, mon père me les as données, elles sont très compliquées....

La 3D c'est assez compliqué, à la base, je voulais faire un jeu avec, pas tout à fait en 3D, j'ai appelé ça,: la 2.5D, en gros, on a une vue superieure par rapport au monde (une piece) Mais cette vue ne bouge pas, c'est le personnage à l'intérieur qui bouge. Je sais pas si tu comprend, mais moi je voyais ça comme ça... . En attendant de connaître les formules mathématiques(niveau d'études supérieures ) pour manipuler la 3D, je pense que je vais me restreindre à ça.
Avec les infos que vous m'avez donner, je peu déjà faire des trucs plutôt pas mal(en 3D). Avec ce que j'ai déjà fait, je voulais mettre en place les drawsats. Beaucoup plus rapide et optimisant. J'ai regardé le tuto de TOTOYO vraiment bien fait, ce qui m'à permis de comprendre le fonctionnement des drawsats. Je vais donc les mettre en place et voir ce que ça donnera... :E.
Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

Citer : Posté le 23/02/2017 10:18 | #


Compliqué ? Bah, au fond, c'est juste des formules. C'est pas extrêmement compliqué à comprendre (avec un schéma, c'est assez simple) mais voilà.

La 2.5D c'est limite un terme technique ; regarde sur Internet, tu trouveras pas mal de choses là-dessus.

Je crois que ce que tu proposes correspond au système qu'a utilisé Ninestars dans les premiers « jours » de son moteur 3D (regarde dans son topic, tu pourrais trouver). Il a quand même utilisé la méthode complète enfin...

Le Drawstat c'est puissant ; mais il existe mieux (même principe, mais plus rapide) : le Super DrawStat de Ninestars, qui est aussi plus facile à utiliser. Jette donc un coup d'oeil de ce côté-là
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 23/02/2017 13:43 | #


J'ai essayé le drawsats avec un petit programme, et je me demandais comment on pouvais incrémenter ou décrémenter une liste pour déplacer ce qui est affiché sur l'ecran....moi j'ai essayé ça: list1[1]+1->list1[1]
list1 [1]-1->list1 [1]
Après je me demandais si il n'y avait pas une solution un peu plus propre...?

Ajouté le 23/02/2017 à 13:46 :
Excuse, je suis aller trop vite.... , mais malgré tout ,je me pose quand même cette question pour le super drawsats.
Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

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


La solution que tu as utilisée est non seulement propre, mais c'est aussi la plus puissante qu'on ait ! Certaines opérations scalaires (i.e. faites sur des nombres), quand on les applique à des listes, sont répercutées sur tous les éléments. On dit aussi que les opérations sont mappées sur la listes. C'est d'autant plus rapide que le système fait tous les calculs d'un coup au lieu de devoir parcourir une boucle For, tester la condition de sortie à chaque tour, ...

Règle générale : moins il y a de code Basic, plus c'est rapide. Le Super DrawStat est en un parfait exemple.
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 23/02/2017 15:26 | #


OK, merci j'aurais pensé que l'on pouvais faire: list1+1->list1 ; list1-1->list1, ou autre chose dans le genre
Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

Citer : Posté le 23/02/2017 15:28 | #


Mais... mais oui, on peut justement. Je te cite :
Disperseur a écrit :
Après je me demandais si il n'y avait pas une solution un peu plus propre...?

Donc tu sous-entends que ça marche -- et ça marche.
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 23/02/2017 18:05 | #


Super efficace le super drawstats !!!! et superr pratique pour le monde....

Ajouté le 27/04/2017 à 12:13 :
Re sur ce topic, je me remets à bosser la dessus, je me demandais si il y avait un programme dont je pourrai voir le code sachant que je ne plagie jamais.

Ajouté le 27/04/2017 à 12:14 :
Pour m'i'spire et apprendre de ça, d'avoir un support d'exemples
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 27/04/2017 12:17 | #


Frachement, je ne connais pas de programme 3D en basic, vu qu'il est trop limité et trop lent, mais si tu t'y connais en C, tu peux te pencher sur windmill, un moteur 3D créé pour un membre talentueux
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 27/04/2017 16:12 | #


Désolé, mais je n'ai aucune competence en programmation C, je ne connais même pas le langage

Ajouté le 27/04/2017 à 16:35 :
Pour Lephenixnoir: précédemment dans la discussion, tu me donnais un exemple de tracé de cube 3d en me donnant les coordonnées de ces derniers à placées dans une matrice sous forme de 1ou-1, je sais que ce sont les coordonnées de points à partir d'un repère dans l'espace en 3D, donc il y a 3 coordonnées, seulement, j'ai peut être mal lu tes precedents messages, je me demandais comment je pouvais faire comprendre à la machine un espace 3d alors qu'evidemment, l'ecran est en 2d et qu'elle n'accepte donc que 2 coordonnées. Bref, comment tu rajoute la profondeur.

Je vais évidemment re, re, et relire tes messages en attendant une réponse de ta part.

Merci d'avanne.
Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

Citer : Posté le 27/04/2017 19:59 | #


Eh bien, il y a une « projection » : c'est comme si tu avais un espace en 3D, et un plan au milieu de cet espace, et que tous les points de l'espace se retrouveraient projetés (perpendiculairement, par exemple) sur le plan.

Sauf que là il y a en plus la perspective : en gros, ce qui est plus loin est affiché plus petit. Une fois ton repère mis en état et normalisé, de sorte que tu as deux axes qui sont dans la direction de l'écran (par exemple x et y) et le troisième fuyant vers l'avant (par exemple z), la technique commune pour simuler la profondeur est de diviser les deux premières coordonnées par la troisième (donc ici diviser x et y par z).
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 28/04/2017 10:46 | #


OK mais z doit avoir une valeur, sinon, ben on ne peut pas afficher la profondeur car la division par z donnera 0:

F-line x , y , x÷z , y÷z. (Par exemple)
?
Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

Citer : Posté le 28/04/2017 19:59 | #


Non, pas comme ça. Tu ne peux pas tracer une ligne avec un seul point Ce serait plutôt :
F-Line X/Z, Y/Z, A/C, B/C

pour relier les points (X,Y,Z) et (A,B,C).
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 29/04/2017 18:06 | #


Heu.., OK. Je pense que c'est bon je crois que j'ai compris. Au passage, je travaille sur un projet de petit fps 3d en reprenant le contexte de mon 1er jeu : D-DAY. j'ai rebabtisé le jeu en : D-DAY ÉVOLUTION. le jeu est en fait un petit jeu "flash" dans lequel on doit affronter des hordes d'enemis de plus en plus nombreux, leur positions générées aléatoirement dans une matrice, avec pour seuls déplacements les rotations... bon, elles sont par "etapes", je veut dire qu'il n'y a que 3 côtés bien définis.
+les décors
+des évolutions possibles d'armes (actuellement 1 seule: mitrailleuse)
+des défis. ....etc
Une fois que je l'aurais posté, tu pourra me dire ce que tu en pense...

Ajouté le 29/04/2017 à 18:07 :
Au fait, je vais réfléchir à une application de ce que tu m'as dit
Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

Citer : Posté le 29/04/2017 18:08 | #


Si tu veux plus d'infos sur la manière de faire ton moteur 3D ou que je regarde si ce que tu fais est conforme à la théorie, n'hésite pas à demander.

Et ouais, sinon, je voudrai bien 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 29/04/2017 18:11 | #


Pas trop d'entousiasme, c'est pas tout à fait un moteur 3d, bon j'ai pour projet d'en faire un,...mais je pense que j'aurais encore un peu de travail avant de poster ce programme, sachant que je reprend les cours dans 4 jour
Mais merci pour tes conseils et encouragements, je m'y met

Ajouté le 29/04/2017 à 18:14 :
PS: les textures son délicieuses ! Fait maison

Ajouté le 02/05/2017 à 13:18 :
Pgrm posté hier, enjoy.

(Voir D-DAY Evolution)

Ajouté le 02/05/2017 à 13:19 :
A oui et j'ai commencé à bosser le principe de transformation avec les ÷ et les × , c'est super efficace ! On peut aller loin avec ça


Ajouté le 05/05/2017 à 18:15 :
Slt, j'ai coder un petit algo de traçâge 3D à partir des listes 1 (X), 2 (Y), et 3 (Z).
Avec, on peut tracer un carré et un triangle (figures pré codées), et pleins d'autres (vous devrez rentrer les coordonnées X, Y et Z dans les listes respectives vous même. ElLes sont demandées en début de prog. /!\ il faut rajouter une dernière coordonnée à la fin des listes(la même que la précédente). Puis, on vous demande la taille des listes. Surtout ne prenez pas en compte la dernière rajoutée. Gros bugs )).
Je souhaitais pouvoir les faire tourner (d'abord le carré ). Mon père m'à fait part des formules seulement, je ne sait pas les inclure dans un programme. (Je vais jeter un oeil au programme utilitaire: 3d cube (rotation)).

Merci d'un coup de pouce.
Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

Citer : Posté le 05/05/2017 18:44 | #


Les faire tourner est tout le problème du moteur 3D ! x)

Voilà en quelques étapes comment ça marche. Ce que je cite là est le fonctionnement interne de mes propres tests (un peu simplistes). N'hésite pas à relire mes longs posts page précédente si tu as oublié :

1. Calcul de la matrice de transformation

On définit les matrices correspondant aux trois transformations à appliquer pour passer du repère absolu au repère de la caméra, située en (xc, yc, zc), orientée de θ par rapport à l'horizontale et φ par rapport à la verticale :

Matrice de translation pour ramener le centre du monde à l'endroit où se trouve la caméra :
|  1  0  0  -xc  |
|  0  1  0  -yc  |
|  0  0  1  -zc  |
|  0  0  0   1   |

Matrice de rotation pour ramener la direction θ = 0 devant la caméra :
|  cos(-θ)  -sin(-θ)  0  0  |
|  sin(-θ)   cos(-θ)  0  0  |
|     0        0      1  0  |
|     0        0      0  1  |

Matrice de rotation pour ramener la direction φ = 0 devant la caméra :
|  1     0        0      0  |
|  0  cos(-φ)  -sin(-φ)  0  |
|  0  sin(-φ)   cos(-φ)  0  |
|  0     0        0      1  |

Puisque la caméra est décalée de (cx, cy, cz), est orientée de (θ, φ), on effectue les transformations inverses pour revenir à un repère normalisé, ce qui explique tous ces signes moins. On multiplie ensuite ces trois matrices (dans n'importe quel ordre) pour obtenir la matrice de transformation M.


2. Passage des coordonnées absolues (x, y, z) au coordonnées de l'écran (x", z")

On va maintenant considérer un point (x, y, z) et le transformer pour obtenir ses coordonnées à l'écran. On commence par le transformer en utilisant la matrice M pour obtenir le point (x', y', z') dans une position relative par rapport à la caméra et non plus par rapport au centre d'origine :
    | x |   | x' |
M × | y | = | y' |
    | z |   | z' |
    | 1 |   | 1  |

Ensuite, on veut projeter tout ce qui se trouve devant la caméra sur le plan de la caméra. Actuellement, x' est orienté sur la droite de l'écran, y' est orienté dans le profondeur et z' est orienté vers le haut. Ça nous va car (x', z') pourra facilement se placer sur le graphe géré par ViewWindow. On divise donc x' et z' par y' pour avoir le résultat projeté (bien sûr, les points situés à y' ≤ 0 sont en-dehors de notre champ de vision) :
(x", z") = (x' / y', z' / y')



3. Affichage des points obtenus avec le ViewWindow

On va profiter de ce que le graphe de ViewWindow peut, si on le configure bien, posséder son origine au centre de l'écran et avoir une échelle arbitraire. Par exemple pour voir sur quelques unités de distance :
ViewWindow -4, 4, 0, -2, 2, 0

Ensuite on peut afficher les points avec PlotOn et les lignes avec F-Line.


C'est encore assez simple comme méthode. J'aurais bien agrémenté ça d'une image ou quelque chose provenant de mes tests, mais je me rends compte qu'ils ont tendance à mal fonctionner dans des cas limites, donc je vais éviter.

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 06/05/2017 08:29 | #


ok merci
pour l'application dans le programme, je vais jeter un oeuil dans le programme: 3d cube qui se trouve dans la section des utilitaires. lui il traite que les rotations .

Ajouté le 06/05/2017 à 08:32 :
ps: la tu n'utilise que des 1 et des 0. je pense que je devrait les remplacer par mes coordonnés.
Lephenixnoir Hors ligne Administrateur Points: 24574 Défis: 170 Message

Citer : Posté le 06/05/2017 09:51 | #


Mais non, laisse ces pauvres 1 et 0, la matrice les contient vraiment !
Tes coordonnées c'est les (x, y, z) (pour chaque point) ; le programme les transforme en (x', y', z') puis en (x", z"). Mais les 0 et les 1 font partie de la transformation, si tu les changes tu obtiendras n'importe quoi.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)

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 211 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