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 - Projets de programmation


Index du Forum » Projets de programmation » Kubic3D
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Kubic3D

Posté le 04/06/2014 14:46

Je me suis lancé ce matin dans la création du moteur 3D pour prizm. Nommé Kubic3D (en hommage de ce super sport que j'ai fait, le Rubik's Cube), je l'utiliseraispour mon jeu YuGiOh sur prizm (je trouve la 3D des Graphs pas très jolie même si des efforts sont fait dessus).

Ce moteur sera codé en C++ pour que ça me fasse de l'entrainement.

Je laisse les sources du moteur ici:
http://pastebin.com/ZcPFY57w
http://pastebin.com/bsWbC31m
http://pastebin.com/cRa3sL3R


Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 03/07/2014 17:37 | #


petite erreur de ma part, M' n'est pas fixe, par contre, il appratient à la droite(AM) dont M est fixe.

Et A n'est pas fixe non plus
Lephenixnoir En ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 03/07/2014 17:40 | #


Donc voilà ce que tu connais/sais :
→ La position de O
→ La position de M
→ La position de A' ?
→ (AM) // (A'M')

Et tu veux A t.q. (OA) soit perpendiculaire à (AM) ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 03/07/2014 17:43 | #


oui, ainsi que AO est perpendiculaire à (AM)

on ne connait pas A', mais on connait [OA] (distance focale)
Lephenixnoir En ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 03/07/2014 17:44 | #


Lephenixnoir a écrit :
Et tu veux A t.q. (OA) soit perpendiculaire à (AM) ?

Intelligide a écrit :
oui, ainsi que AO est perpendiculaire à (AM)

Que cherches-tu exactement alors ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 03/07/2014 17:46 | #


la position de A, comme ça, je peux savoir [AM] et [AO]
Lephenixnoir En ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 03/07/2014 18:00 | #


Tu connais l'angle (OM;OA) ?

Ajouté le 03/07/2014 à 18:05 :
Bon, j'ai une solution, mais géométrique -- il faudra la simplifier ensuite pour pouvoir l'implémenter de manière optimisée.

Ajouté le 03/07/2014 à 18:16 :
On va décomposer α : α = γ + β.
Avec H projeté orthogonal de M sur (O;vec{x}), γ sera l'angle (vec{OH};vec{OM}) et β sera (vec{OM};vec{OA}).
On a donc H(xM-xO;0).
Ensuite, γ = arctan(sin γ / cos γ) = atan2(sin γ, cos γ) = atan2(yM;xM).
Du coup, on a β = α - γ.
Une fois que tu as β, comme OAM est rectangle, tu peux établir que AM = OM * sin β et que AO = OM * cos β.
Par conséquent, A est l'intersection des cercles de centres M et O est de rayons respectifs MA et OA.
Le couple(x;y) solution de
{ (x-xM)² + (y-yM)² = MA²
{ (x-xO)² + (y-yO)² = OA²
sera donc les coordonnées de A.

C'est probablement pas ce qu'il y a de mieux, mais c'est déjà ça.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 03/07/2014 18:44 | #


Une petite erreur, tu as mi 2fois sigma

Sinon, c'est bien explicité

Ajouté le 04/07/2014 à 16:47 :
c'est bon,

AM=√( ( Xm-X0 )² + ( Ym-Yo )² ) * sin( α - atan( (Ym-Yo)/(Xm-Xo) ) )


et

OA=√( ( Xm-X0 )² + ( Ym-Yo )² ) * cos( α - atan( (Ym-Yo)/(Xm-Xo) ) )
Lephenixnoir En ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 04/07/2014 17:32 | #


Comme je l'ai dit, faire la division pour appeler atan() n'est pas forcément une bonne idée.
Voilà comment je l'implémenterais :
int x = M.getX() - O.getX();
int y = M.geyY() - O.getY();
int h = sqrt(x*x+y*y);
double gamma = alpha - atan2(y,x);
int AM = h * sin(gamma);
int OA = h * cos(gamma);

Ainsi, on ne répète aucun calcul.

J'ai quand même un peu peur pour la vitesse, mais je te laisse tester...
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 04/07/2014 17:52 | #


atan2(x,y) = tan(x/y)
Lephenixnoir En ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 04/07/2014 18:02 | #


Non, atan2(y,x) = atan(y/x).
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 05/07/2014 09:14 | #


l'angle est en radians ou en degré?
Lephenixnoir En ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 05/07/2014 09:21 | #


Ah, l'angle est toujours en radians, du coup tu es obligé de faire du calcul flottant.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 05/07/2014 16:08 | #


alors,
[i][b][u][big][comic][red]int[/red][/comic][/big][/u][/b][/i] gamma = alpha - atan2(y,x);


angle en radians
Lephenixnoir En ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 05/07/2014 16:09 | #


Ben oui, de quoi tu parles ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 05/07/2014 16:12 | #


de ça
[/HS]

Ajouté le 05/07/2014 à 16:17 :
et comme les radians c'est moins représentatif, j'ai mis un
#define RADIANS *3.14159265359/180
Lephenixnoir En ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 05/07/2014 16:37 | #


D'une part, si tu divises d'abord, tu perds de la précision. D'autre part, tu aurais pu mettre
#define RADIANS *0.017453293

pour simplifier au moins les constantes -- sinon je peux t'assurer que tu vas lagger.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Eiyeron Hors ligne Ancien modérateur Points: 5525 Défis: 57 Message

Citer : Posté le 07/07/2014 13:40 | #


#define RADIANS *0.017453293

C'est moche... Et si jamais j'ai une variable/macro qui s'appelle (par exemple) CONVERSION_RADIANS? Utilise une macro de type fonction plutôt.
#define RAD(a) ((a)*0.017453293)


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