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 En ligne Administrateur Points: 24678 Défis: 170 Message

Citer : Posté le 10/12/2017 09:38 | #


Il y a deux indices qui te montrent que ça ne peut pas être les coordonnées de ton point !

2. On calcule M = Mφ × Mθ × Mt comme ça on aura moins de multiplications à faire plus tard
3. Pour chaque point de l'espace [...]

Si je peux calculer M avant de commencer à boucler, c'est que M est la même pour tous les points.

Et :

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 [...]

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 10/12/2017 09:42 | #


Ah et la matrice dans laquelle j'ai mis mes points (1 ligne=à point 3D) , comme celles qui la transforment, comment je peut faire pour pouvoir mettre plus que 4 points car c'est la taille des matrices de transformations et quand j'en met plus, il me fait une erreur..?
Lephenixnoir En ligne Administrateur Points: 24678 Défis: 170 Message

Citer : Posté le 10/12/2017 09:45 | #


Tu peux pas faire ça !

Une transformation, c'est une matrice 4×4 multipliée à droite par un vecteur 4×1. Tu dois extraire chaque point 3D de ta grosse matrice de stockage, le charger dans une matrice colonne, faire la multiplication, afficher le résultat à l'écran. Et recommencer avec un autre point.

Il y a peut-être une méthode d'optimisation qui te permettrait de faire ça plus vite, mais ce n'est pas le principe. (Je vais y réfléchir)
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 12/12/2017 18:55 | #


Merci, mais maintenant, j'aimerais en savoir un peut plus sur la pratique (meme si c'est ce que l'ont fit depuis un temps et je sais que ce n'est pas le meilleur support mais c'est bien pour commencer..)

Avant tout je veut juste te prévenir: il y a un truc que je déteste: piquer les idées des autres et dire que ce sont les nôtres.. bref, j'apprécie avant tout les idées qui viennent de moi (bien sur j'accepte celles des autres).. je veut trouver les solutions moi même.. donc, je voulais te demander si il n'y avait pas un programme sur ce site sur lequel je pourrait voir un peut a quoi ressemble la pratique.. et en basic casio si possible.. j'ai pensé a certains utilitaires en 3D mais je ne sais pas si c'est un bon support. (par exemple: until 3d de Neuronix ou encore Graph 3D de..Neuronix aussi Anapi 3d de Nowix ou Real 3d de Simsoft..) ?

merci de ta future réponse

PS: ton aide m'est très précieuse merci
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 12/12/2017 19:01 | #


Il y a le moteur 3D de ninestars : http://www.planet-casio.com/Fr/forums/topic14525-8-Windmill,:,moteur,graphique,3D.html
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 12/12/2017 19:04 | #


Je te remercie mais j'ai déjà vu ce programme et il est très impressionnent, mais j'ai dit plus haut:
Disperseur a écrit :
je voulais te demander si il n'y avait pas un programme sur ce site sur lequel je pourrait voir un peut a quoi ressemble la pratique.. et en basic casio si possible..


....
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 12/12/2017 19:07 | #


Déjà que ça lague en C, en basic casio ça va tourner à 1 fps
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Disperseur Hors ligne Membre Points: 1830 Défis: 1 Message

Citer : Posté le 12/12/2017 19:11 | #


ouais, je sais... 8) mais tu vois je suis plutôt fort en Basic (même si ça ne se voit pas trop au travers mes programme.. ) et je n'ais presque aucune connaissance en C (je me penche dessus en ce moment). Et je veut outrepasser la vitesse du Basic. C'est juste pour apprendre la base. En gros je m'en fous si ça lague ..

Ajouté le 13/12/2017 à 07:28 :
La il y a un truc qui m'échappe : plus haut tu m'as dit que je devais charger mes points dans une autre matrice un par un.. .ais c'est la que ça ne vas plus car maintenant la matrice qui contient le point est maintenant trop petite pour être multipliee à d'autres..? Du coup en plus je ne voyais pas du tout comment on pourrait transférer une seule ligne sur une autre matric..?e
Lephenixnoir En ligne Administrateur Points: 24678 Défis: 170 Message

Citer : Posté le 13/12/2017 07:49 | #


Mais c'est la que ça ne vas plus car maintenant la matrice qui contient le point est maintenant trop petite pour être multipliee à d'autres..?

La multiplication de matrices est une opération un peu bizarre si l'on n'est pas habitué. Normalement on note la dimension d'une matrice (n, p) où n est le nombre de lignes et le nombre de colonnes. On peut multiplier une matrice de taille (n, p) par une matrice de taille (n', p') si et seulement si p = n', et alors on obtient une matrice de taille (n, p').

En particulier tu peux voir que multiplier un matrice colonne (4, 1) par une matrice ligne (1, 4) donne une matrice carrée (4, 4), mais le même calcul dans l'autre sens donne une matrice carrée (1, 1). Il faut donc toujours surveiller l'ordre dans lequel on multiplie des matrices car l'opération n'est pas commutative (y compris quand la dimension est la même dans les deux sens).

Ton vecteur 4D est une matrice (4, 1). Ta matrice de transformation est une matrice (4, 4). Tu multiplies la seconde à gauche par la première à droite, et tu obtiens un autre vecteur 4D qui décrit le point transformé ; rien d'autre.

Ta matrice (N, 4) où N est le nombre de points dans ton monde est adaptée pour stocker des données, mais a priori pas pour faire les calculs car tu n'as pas de garantie que tu pourras faire un produit matriciel, ni qu'il te donnera le bon résultat.

En fait ça va marcher, mais je veux être sûr que le principe soit très clair pour toi avant d'attaquer sur ce qui est optimisable ou pas.
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 13/12/2017 12:45 | #


En fait, sur l'application, j'ai déjà testé plusieurs choses, mais le tout reste quand meme un peut flou quand à la mise en forme dans un programme. En effet, pour les optimisations, il est plus sage d'attendre que j'ai réussit à obtenir un résultat, ... sur le côté des matrices c'est très flou, en effet ce n'est pas clair pour moi la manière de les multipliées et de calculer l'affichage sans Graph (x,y)=() (se que j'ai fait jusque là,...). C,est vraiment l'application sur basic qui me pose problème (bien sûr je ne te demanderais jamais de me cracher un programme comme ça, je veut comprendre...).

Donc si tu veut bien préciser l'application ce serait génial

Merci beaucoup


Lephenixnoir En ligne Administrateur Points: 24678 Défis: 170 Message

Citer : Posté le 13/12/2017 17:40 | #


Pour multiplier des matrices, c'est Mat A×Mat B→Mat C... rien de plus. Tu n'as pas besoin de savoir comment on calcule le produit de deux matrices. Tu pourrais (tu le sais peut-être), mais de là à expliquer pourquoi les matrices que je t'ai données marchent, il y a un peu trop d'algèbre linéaire...

Tu fais du graphe paramétrique si tu le veux en fait. C'est indépendant de la méthode de calcul. Moi je te dis comment calculer la position des points sur l'écran, toi tu les affiches comme tu veux.

Par contre tu ne peux pas faire un Graph(X,Y)=(...) direct avec la méthode de calcul à l'intérieur de la fonction. Il faut que tu calcules les points d'abort et que tu fasses tes dessins après. La démarche serait en gros :

1. Vider la liste/matrice/paire de listes dans laquelle tu stockes les coordonnées des points à tracer
2. Pour chaque point du monde, lu dans la matrice de la map (qui ne change jamais) :
3. Transformer le point à l'aide d'un produit matriciel
4. Projeter le point sur l'écran en divisant deux coordonnées par la troisième
5. Ajouter le résultat à la liste/matrice/paire de listes dans laquelle tu stockes les points à tracer
6. Utiliser le Super DrawStat pour afficher d'un coup tous les points calculés

Je pense qu'en croisant tous les listings de ce genre que j'ai postés sur ce topic, tu dois pouvoir obtenir quelque chose de relativement précis pour ton programme. N'hésite pas à redemander des détails.
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 13/12/2017 17:47 | #


Ok je vois ça des que j'ai du temps, ce que j'ai fait c'est d'imprimer tous tes gros posts pour avoir un accès encore plus rapide...
En ce moment je révise la brevet blanc... mardi !

Ajouté le 17/12/2017 à 11:15 :
Dis, pour le Drawstat, on peut utiliser les matrices au lieu des listes ?
Lephenixnoir En ligne Administrateur Points: 24678 Défis: 170 Message

Citer : Posté le 17/12/2017 14:33 | #


Tu fais ce que tu veux, le Super DrawStat n'a pas de notions de listes ; seulement de fonctions (paramétriques). Tant que l'évaluation des expressions que tu fournis pour les différentes valeurs de T données par le range (que tu fournis aussi, dans le View-Window) se termine sur les abscisses et les ordonnées que tu veux, le système s'en fout.
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/12/2017 17:25 | #


Ouais, mais là, je veut afficher des points et les relier, points qui se trouvent dans une matrice de 4x1 (1 colone et 4 lignes) et j,ai essayé pleins de trucs pour afficher mes points mais je n,ai rien trouvé qui fonctionne bien.... une idée là dessus..?

Sinon, au niveau des matrices et des transformations, tout est au point, il ne manque plus que l'affichage ! J,ai bien avancé

PS: les gens regardent souvent leurs messages privés ou non ? car là j'ai envoyé un message a Totoyo et il me répond pas..?
Lephenixnoir En ligne Administrateur Points: 24678 Défis: 170 Message

Citer : Posté le 17/12/2017 19:02 | #


Ben, si c'est la matrice A par exemple...
Graph(X,Y)=(Mat A[1][T], Mat A[2][T])

en supposant que tes les coordonnées à l'écran de tes points ce soit les deux premières composantes du vecteur. As-tu bien pensé à effectuer la projection ?

Par ailleurs ça ne joindra pas le premier point et le dernier ; le plus efficace pour cela serait de recopier le premier point à la fin de la matrice.

Totoyo passe souvent mais les messages privés non nuls ne s'affichent pas toujours comme tels (obscur bug vieux comme PC). Demande-lui sur le chat ou renvoie-lui un MP. Sinon, ping-le sur le forum approprié (s'il y en a un) en lui mettant @Totoyo.
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 18/12/2017 07:16 | #


La projection, j'avais prévu de la faire en même temps que ol'affichage. Du genre: x÷z,y÷z...?

Pour Totoyo, c'est bon, ça a marché merci
Lephenixnoir En ligne Administrateur Points: 24678 Défis: 170 Message

Citer : Posté le 18/12/2017 07:23 | #


Ouais, c'est ça. X/Z, Y/Z... à moins que la coordonnée qui donne la profondeur ne soit pas Z. J'ai très vite fait de me mélanger les pinceaux sur ce point. Il y a un de mes messages, peut-être en page 2, où j'ai fait le calcul.
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/12/2017 17:59 | # | Fichier joint


Alors là je suis complètement bloqué je n'arrive plus a faire quoi que ce soit...

Les matrices de mon programme sont en place, les calculs sont tous ok, et les points sont tous chargés d,une grande matrice de stokage. Les points originaux du mon de ne changent pas : ils sont tous recalculés un a un en passant par la matrice G. Matrice a partir de laquelle je les affiches. C'est une matrice de une colonne et 4 lignes. Les points qui y restent apres les calculs sont les derniers de la liste initiale.
Bref les calculs sont ok, manque que l'affichage.. mais c'est justement la que je rame.
(un coup de main n'est pas de refus.. stp )

Je mets le programme en lien (je ne suis pas sur de pour voir le mettre dans ce message.. déso ).

PS: j'affiche les dernieres valeurs de l matrice G pour mon test vu qu'il n'affiche rien.
Lephenixnoir En ligne Administrateur Points: 24678 Défis: 170 Message

Citer : Posté le 21/12/2017 13:24 | #


Ton programme perd un temps fou à calculer plein de fois les matrices de transformation A, B et C. Elles ne dépendent ni de M ni de N ; l'objectif est justement de les sortir de la boucle !

Ensuite, ton calcul Mat D×Mat E→Mat G n'est pas au bon endroit ! Voilà à quoi ça devrait ressembler...
Calcul de Mat A, Mat B, Mat C et Mat D

For 1→M To 5
  For 1→N To 4
    Mat F[M,N]→Mat E[N,1]
  Next

  Mat D×Mat E→Mat G
  Pour afficher des points, projeter et afficher avec Plot
Next

Pour afficher des droites, c'est plus subtil, parce qu'il faut afficher des paires de points... juste les points pour l'instant serait suffisant.
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 21/12/2017 19:28 | #


Ok. Sinon, les transformations c'est bon ? Si j'ai compris..
Lephenixnoir En ligne Administrateur Points: 24678 Défis: 170 Message

Citer : Posté le 21/12/2017 21:49 | #


Ah, j'ai oublié de préciser, tu multiplies tes matrices dans le mauvais sens :
Mat A×Mat B×Mat C→Mat D

Si tu réfléchis aux règles d'associativité dont j'ai parlé plus tôt :
cx = Mφ × (Mθ × (Mt × xa))
cx = (Mφ × Mθ × Mt) × xa

Tu te rends compte qu'on applique d'abord la matrice la plus à droite, puis on part vers la gauche... jusqu'à la « première ». La bonne manière de faire ta multiplication est donc :
Mat C×Mat B×Mat A→Mat D


À la réflexion, les deux matrices de rotation ne commutent pas, donc faudra surveiller l'ordre dans lequel tu les appliques, sans doute. Plus tard.

Sinon ça m'a l'air bien
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 144 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