Rollercoaster part II [presque resolu le prob voir en bas] [Algo] - Algo - Programmation
Marsh Posté le 28-09-2003 à 23:44:28
Est-ce que tu connais le principe de bases d'orientation?
(Peut-etre introduit en physique ou en mécanique ?)
T, N, B est ce que j'appelerais une base locale. Tu peux aussi l'appeler x',y',z' par opposition à la base qui définit les coordonnées de ton monde x,y,z.
NB: Tu peux en trouver d'autres: Tangente, rayon de courbure et normale au plan de courbure constituent une autre base locale tirée de ta courbe paramétrée. Mais celle ci est peu interessante parce que le rayon de courbure a une facheuse tendance à passer par l'infini.
Ce que j'expliquais dans mon post c'est qu'on pourrait idealement faire varier l'orientation independamment de la position.
Ton systeme deviendrait : { x(t), y(t), z(t), theta(t) }
NB: Pour des raisons de simplicité j'ai relié l'une des orientations du vehicule à la tangente à la trajectoire des rails. Mais on pourrait imaginer un manege un peu plus évolué ou l'orientation du module soit dépendant d'un nouveau parametre phi(t). Ainsi le vehicule pourrait pointer dans des directions opposées ou perpendiculaires à son déplacement.
exemple de fonction theta(t): une simple
rampe entre 0(au moment t0) et 2 * pi (au moment t1)
theta(t) = 2 * pi * (t - t0)/ (t1 - t0)
Ainsi tes rails peuvent aller en ligne droite et le vehicule faire un tour complet sur lui-meme.
LeGreg
Marsh Posté le 29-09-2003 à 01:18:24
mhhh jcommence a capter merci bien
donc en fait on oriente le point grace a 3 vecteurs :
T, B et N
on fait de meme pour le point suivant (p+1)
puis on essaie de faire la transition entre les 2 orientations grace a un quaternion, une matrice....
oki(bon jespere que c a peu pres ca)
-----------
donc on a pour orienter le point on a
-> la tangente au point
-> la normale
-> l'orientation (pour langle )
c bon la ?
Marsh Posté le 29-09-2003 à 01:22:47
je c jai du mal mais jai jamais eu de cours la dessus et je fait juste ca comme ca pour le fun qd j'ai un peu de temps libre
Marsh Posté le 29-09-2003 à 23:04:39
Tu va ici :
http://www.nolimitscoaster.de/
Tu télécharges la version démo, tu désassemble le .exe, tu cherches ce qui t'intéresses, tu traduit en C++, et pis voilà
Marsh Posté le 29-09-2003 à 23:27:18
Le Castor a écrit : Tu va ici : |
Sympa comme truc, à quand le même pour un jeu ?
Marsh Posté le 29-09-2003 à 23:49:20
Le Castor a écrit : Tu va ici : |
jconnais ce prog c justement de la que lidee m'est venue et que je me suis un peu inspiré
Marsh Posté le 30-09-2003 à 03:04:49
red faction a écrit : je projete 2 points de la courbe sur le sol (donc je tient uniquement compte de X et Z , Y -> poubelle ca donne un peut comme la vue du dessus)[...] |
Ta méthode d'orientation m'a l'air bien compliquée, je ferais plutôt ça avec tangentes + coords sphériques.
Pour trouver la tangente d'une courbe C à un temps t, tu fais la méthode bourrin ( C(t+epsilon) - C(t-epsilon) ), ou la méthode clean (si ta courbe est du genre x = x^3 + 2*x + 4, x' = 3x^2 + 2).
Ensuite, tu normalises ta tangente puis tu la passes en coords sphériques http://mathworld.wolfram.com/SphericalCoordinates.html . Ça te donne deux angles, qui seront en fait les rotations à faire subir à chaque 'cercle de points' de ton rollercoaster.
Marsh Posté le 01-10-2003 à 08:52:14
si qqn pouvait me dire si lhistoire dorientation T B N est correct
Marsh Posté le 05-10-2003 à 00:41:05
Bon on prend un point de la courbe (croix bleue sur le dessin du premier post)
Ensuite on calcule la tangente de ce point par rapport a la courbe.
je normalise cette tangente et jobtient un vecteur ( appellons le vect a)
On fait la meme chose pour un autre point de la courbe (la croix bleue suivante) (jobtient vect b).
bon vect a et vect b oriente differement l'un de l'autre. On peut imaginer que vect a à subit plusieurs rotations pour donner vect b ok?? je voudrait appliquer à un vecteur ce qu'on a fait subir à vect a pour donner vect b.
Marsh Posté le 05-10-2003 à 14:21:41
Reformule ta question, c'est incompréhensible. Relis-toi et utilise la ponctuation.
Marsh Posté le 05-10-2003 à 15:04:43
Haaa !
Si tu bosses en coords sphériques, tu convertis chaque vecteur en paire d'angles, la différence te donne la transformation.
ou
arcos(produitScalaire(a, b)) te donne un angle de rotation autour de l'axe formé par produitVectoriel(a, b).
Mais je ne vois pas pourquoi tu veux faire ça. Je reste sur la méthode que j'ai expliqué plus haut : coords sphériques pour tourner les 'cercles de points'.
Marsh Posté le 05-10-2003 à 15:14:31
le vecteur auquel jaimerai appliquer "ce qu'on a fait subir à a pour obtenir b" c un vecteur qui correspond a la premiere croix et qui pointe vers le haut (vers le ciel quoi).
En lui appliquant les trans jobtient le meme vecteur mais pour b
Marsh Posté le 05-10-2003 à 15:18:11
red faction a écrit : le vecteur auquel jaimerai appliquer "ce qu'on a fait subir à a pour obtenir b" c un vecteur qui correspond a la premiere croix et qui pointe vers le haut (vers le ciel quoi). |
Pourquoi veux-tu faire ça ?
Marsh Posté le 05-10-2003 à 15:22:55
comme ca jobtient a chaque fois lorientation de mes rails
definie par 2 vecteurs : la tangente et le vecteur que jai calculé par la methode dont je viens de parler
(ce vecteur correspont a peu pres a la facon dont les gens sont positionnes dans le wagon sil se tenaient debout)
Marsh Posté le 05-10-2003 à 15:24:34
red faction a écrit : comme ca jobtient a chaque fois lorientation de mes rails |
Tu n'as pas besoin de faire ça pour connaître ton vecteur, c'est le perpendiculaire à la tangente.
Marsh Posté le 05-10-2003 à 15:26:01
des perpendiculaires yen a plein non ?
suffit de considerer la tangente comme un axe de rotation
Marsh Posté le 05-10-2003 à 15:37:45
red faction a écrit : des perpendiculaires yen a plein non ? |
En 3d, oui. Ensuite, celle le plus simple à obtenir est celle dont je parlais en coords sphériques. Fais déjà ça, ça règlera ton problème de renversement.
Ensuite, tu peux prendre un point de la courbe, un devant, un derrière. S'ils ne sont pas alignés, ces trois points forment un plan. Trouve la normale à ce plan, c'est ta perpendiculaire.
Marsh Posté le 05-10-2003 à 15:47:02
youdontcare a écrit : En 3d, oui. Ensuite, celle le plus simple à obtenir est celle dont je parlais en coords sphériques. Fais déjà ça, ça règlera ton problème de renversement. |
c pas con du tout ca reste que les points risque detre souvent alignes mais bon jvais essaye qd meme
Marsh Posté le 05-10-2003 à 15:48:32
polo021 a écrit : c'est le vampire |
ouais ben jespere faire ca mais en 4k avec de la zik et tout
pour linstant jsuis a 3,5k a peu pres meme si ya des trucs qui me servent juste pour le debug a retirer
Marsh Posté le 05-10-2003 à 17:43:01
nempeche que pour la montee de depart, pour determiner le plan c mal parti
Marsh Posté le 28-09-2003 à 17:00:38
J'avais deja demande une fois mais personne navait compris alors jvais essaye de nouveau
PS : je c mon schema est digne dun gamin de 5 ans mais jai fait ca en 2min
Au depart j'ai les points par lequels passe la courbe (carré rouge) et les points de controle (carré vert)
de la je peut calculer une courbe (que je ne stocke pas) grace au cubic splines
bon les point sur cette courbe donne par la formule ne sont pas equidistants (plus concentres lorsque ca courbe, c logique)
pour avoir des points equidistants je calcule la distance du point de depart au points courant et lorsque que une certaine valeur a ete atteinte je place le point (croix bleu)
de cette facon jobtient des points equidistants (les croix bleues que je stocke)
-------------------------------------
ce que jaimerai maintenant c trouver lorientation du rail
bon certains vont dire c pas difficile tu prend la tangente a la courbe puis la perpendiculaire a cette tangente oui mais ici c en 3D
ce que je faisais au depart :
je projete 2 points de la courbe sur le sol (donc je tient uniquement compte de X et Z , Y -> poubelle ca donne un peut comme la vue du dessus)
je calcule le vecteur des 2 points projetes
je prend la perpendiculaire de ce vecteur (en bleu clair sur le schema du bas)
appelons le vect1
je prend le vecteur formé par deux points qui se suivent dans la courbe de depart ( sur le schema de dessus en rose)
appelons le vect2
jai deux vecteur vect1 et vect2 -> je prend la normale et jai mon vecteur qui mindique lorientation du rail (les traits sur le looping)
ca marche tres tres bien sauf dans les boucles ou a mi hauteur ca foire car le sens du tracé s'inverse...
------------------------------
Le greg mavait donné une solution mais je ne comprends pas tout... Je ne comprends deja pas le debut avec T , N et B
T ok mais pour les autres ...
Le greg :
il te manque une info.
effectivement il te faut un point de départ sur le cercle pour déterminer un angle !
L'idéal c'est qu'en plus du déplacement entre p1 et p2 tu aies aussi paramétré le changement d'orientation du systeme
(T,N) avec T, le vecteur tangent à la courbe de ton déplacement et N, un vecteur qui représenterait ton orientation. (il manque un vecteur à ta base mais il découle de T et de N, du moment que tu sais si tu es gaucher ou droitier ce qui déterminera dans quel sens tourneront r1 et r2 en fonction de ton angle Theta).
C'est pas aussi simple qu'en 2D mais en 3D il faut changer de systeme de pensée.
Attention à la façon dont tu parametres ta courbe de déplacement et à la gestion des points critiques (j'espere que si c'est un ride et que tu as des points critiques tu ne vas pas faire subir des accelerations infinies aux clients de tes montagnes russes ).
Le greg 2:
Peut-etre que je n'étais pas clair alors on va la refaire.
A ton point de départ (appelons le p0)
tu as l'orientation de ton rail défini par (T0,N0,B0).
Information que tu connais précisemment.
pour passer du point n au point n+1,
tu as besoin de plusieurs choses: le déplacement p(n+1) - p(n)
que tu obtiens en échantillonnant ta courbe paramétrée.
Et le changement de l'orientation de ton système (Tn, Nn, Bn).
Pour calculer Tn+1 c'est tres facile il s'agit de la tangente à ta courbe au point p(n+1). (si tu as du mal a calculer la tangente, fais moi signe). Le passage de Tn à Tn+1 constitue un premier changement d'orientation. Tu peux construire une matrice, un quaternion ou ce que tu veux pour passer de l'un à l'autre.
(si tu as de la misere pour construire la matrice de passage de Tn à Tn+1 fais moi signe).
Tu as aussi fait le choix d'avoir un deuxième changement d'orientation représenté par un angle Théta. Cet angle Théta tout seul ne veut pas dire grand chose, donc on va dire que ça représente un angle de rotation selon l'axe ORIENTÉ par Tn+1 (après que tu aies appliqué la première transformation donc.. le résultat ne sera évidemment pas le même si tu changes l'ordre d'application des transformations).
Cela constitue une deuxieme matrice de passage ou un deuxième quaternion. (si tu as de la misère à calculer cette deuxieme matrice de passage fait moi signe)
Pour obtenir la transformation globale de ton système (Tn,Nn,Bn) tu dois donc composer ces deux transformations dans le bon ordre.
Maintenant comment calculer la position des rails ?
C'est simple si r est ton rayon, le premier rail est en pn + r*Bn et le deuxieme est en pn - r*bn.
Message édité par red faction le 05-10-2003 à 02:08:51