|
Publicité | ||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription: février 2007
Messages: 13
|
Salut,
Je suis entrain d'écrie un programme qui me génère un script pour effectuer des " script cam " dans un environnement 3d ( Style quake ) à partir de coordonnées qu'on récupère dans cet environnement. Mais j'ai un soucis, les rotations de la camera ( pour l'instant je me contente des rotations de gauche à droite et inversement) sont " hachés ou Saccadé " lorsqu'on passe d'un point a l'autre. Connaissez vous un algo qui permet de rendre ces mouvements plus " Lisse " Merci |
|
|
00
|
|
|
#2 |
|
Invité régulier
![]() Inscription: mars 2007
Localisation: Berlin
Âge: 29
Messages: 19
|
Pour que le movement de la camera soitfluide utilise la formule suivante :
Camera1 à l'instant t1 Camera2 à l'instant t2 T = t2-t1 temps écoulé de la transition camera1->camera2 Camera à l'instant t = ((t2-t)*Camera1+(t-t1)*camera2)/T faite le calcule pour les 2 vecteurs Eye, Target |
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription: février 2007
Messages: 13
|
Merci pour la réponse mais si la valeur récupérée est l'angle de la caméra exemple .
P0 = 10° P1 = -92° P2 =-160° Je fait comment car dans le cas qui nous intéresse ce sont des angles qu'on récupère. |
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Inscription: mars 2007
Localisation: Berlin
Âge: 29
Messages: 19
|
faite la meme chose
- cas lineaire partitionne la fonction en 2 cycles 1 cycle t1<=t<=t2 T = t2-t1; P(t) = ((t2-t)*P0+(t-t1)*P1)/T 2 cycle t2<=t<=t3 T = t3-t2; P(t) = ((t3-t)*P1+(t-t2)*P2)/T sinon (cas non lineaire ) le nombre de points >=3 faite l'interpolation pour n points avec la fonction de Bezier P(t) = Somme[Combinatoire(n,i)*P[i]* t^i*(1-t)^(n-i), i=0 , i<=n-1] remarque : pour n = 2 on retombe sur le 1er cas |
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Inscription: février 2007
Messages: 13
|
Ok merci mais j'ai une question
Vue que je n'impose pas de temps, il faut déterminer un nombre de point max pour créer le script, plus il y a de point et plus le temps total de l'animation sera long ( c'est le Nb de FPS qui déterminera ça et c'est indépendant du script ) Je m'explique si j'ai pointé 10 points dans l'environnement, avant de créer le script on va lui donner le nombre total de points qu'on veut, admettons 1000 points. Ensuite je calcul la longueur total des segment de p0 à p0+10, et je reparti mes 1000 ponts entre mes segment en respectant la taille de chaque segment afin d'avoir une vitesse qui ne subit aucune variation de vitesse dans le temps et cela du 1er au dernier point. Jusqu'ici tout fonctionne comme prévu, que ce soit avec une interpolation linéaire ou autre. Mais a partir de là comment déterminer T ? pour l'instant je me dit si je suis sur P3, je me dit que T = Nbpoint de 0 à P3. est ce que mon raisonnement est juste ? |
|
|
00
|
|
|
#6 |
|
Invité régulier
![]() Inscription: mars 2007
Localisation: Berlin
Âge: 29
Messages: 19
|
si je comprend bien ne cherche pas à calaculer le temps
travail avec T = 1 est faite les interpolations pour chaque segment pour la ieme decoupe ton segment en n points 0=<t<=1 t = 0,1/n,2/n,.....,(n-1)/n, 1 Pi(t) = (1-t)*p(i)+t*p(i+1) et tu n'es pas obligé de travailer avec le temps |
|
|
00
|
|
|
#7 |
|
Invité régulier
![]() Inscription: février 2007
Messages: 13
|
Je vais résumer ce que je fait:
si on a P0 à P10 et qu'on veut 1000 points: Pour déterminer le nombre de points entre chaque segment: 1: je calcul la longueur total des segments comme suit Début Boucle = 0 à Nombre de point ( ici 10 ) Px = Pn+1x - Pnx py = Pn+1y - PnY pz = Pn+1z - Pnz Resultat = Math.Sqrt((X ^ 2) + (Y ^ 2) + (Z ^ 2)) puis on sauve Resultat du segment dans un tableau ( TabResult ) Boucle pour calculer la longueur suivante Je connais la taille de chaque segment Maintenant je peux savoir combien de point je doit repartir par " Unité de segment" 2 je calcule la somme de tout les segments = Taille Total des Segments puis je détermine le nombre de point par unité de segment Nb Point Par Unité = 1000 / Taille Tota des Segments 3 A partir de la je peux calculer les points intermédiaires NbPointsup = Nb Point Par Unité * Taille Segment ( de n à n+1 sauvé dans TabResult ) 4 Je peux Calculer mes point intermédiaire du segment en cours de traitement soit par interpolation linéaire soit par spline 5 et ici pour déterminer t je fais: t = t + (1 / NbPoitSup) Voilà pour les coordonnées X, Y et Z Tout ça marche très bien je peux faire ce que je veux les mouvement sont OK. --------------------------------------------------------------------- Ensuite il me reste à traite l'orientation de la camera, comme je l'ai dit je récupère X,Y, Z et l'angle ( entre 0) et 180 ° ) qui correspond à l'orientation de la camera lorsque j'ai pointé la coordonné Donc pour cette partie qui n'a pas était des plus simple il fallait que je détermine dans quel sens tourne ma caméra pour aller de l'AngleA à l'AngleB Exemple AngleA = -160° AngleB = 97° La camera doit tourner dans le sens horaire AngleA = -25° AngleB = 30° La camera doit tourner dans le sens trigo maintenant il me reste plus qu'à traiter les point entre ces angles pour que le mouvment soit " moins cassé " lors du passage d'un arc de cercle à à autre. Voilà j'ai donné tous les éléments qui explique le cheminement exact et il reste le dernier point à régler. Penses tu que l'algo que tu m'as donné peut être utiliser pour calculer le dernier point ? Merci |
|
|
00
|
|
|
#8 |
|
Invité régulier
![]() Inscription: mars 2007
Localisation: Berlin
Âge: 29
Messages: 19
|
faite attention pour les angles car si on passe de -160 à 97 tu as 2 choix pour le sens de la vitesse angulaire si
1 - omega>0 (sens trigo) ->detaTETA >0 -> angleB-angleA >0 -> angleA <angleB -160<97 aucun probleme mais si omega<0 ->detaTETA <0 -> angleB-angleA <0 -> angleA> angleB dans ce cas 97 doit etre convertie à une valeur negative 97 -> 97-360 pour remplire la condition et enfin l'interpolation ne casse pas tout depend du choix de la vitesse angulaire resumons la condition pour le control des angles omega>0 condition AngleB> AngleA omega<0 condition AngleB<AngleA |
|
|
00
|
|
|
#9 |
|
Invité régulier
![]() Inscription: février 2007
Messages: 13
|
En fait pour déterminer le sens de l'orientation je me sert du sens des segments et de l'angle récupéré et tout ça fonctionne très bien.
A aucun moment le sens de rotation calculé par rapport à la direction d'un segment à l'autre est erroné. Pour info supplémentaire, lors du calcul des angles je travail sur 360° avant de convertir la valeur calculée (entre 0, 90, -90 et +/-180° ) pour l'intégrer au script. Jusqu'ici tout est bon et je me heurte au seul problème du passage, lors d'un mouvement, "d'un arc de cercle" à un autre. Quand je calcul mes points j'ai une rotation normal et dès que je change d'angle ou de sens, il y a comme une cassure dans le mouvement ( comme quand on regarde une poule tourner la tète et c'est ça ce que je veux supprime, afin d'avoir un mouvement plus gracieux. Concernant le choix de la vitesse angulaire je n'ai rien defini carpour l'instant je ne sais pas quel algo utiliser pour parvenir à mes fins. Dernière modification par pkpas ; 31/07/2007 à 19h26. |
|
|
00
|
|
|
#10 |
|
Invité régulier
![]() Inscription: mars 2007
Localisation: Berlin
Âge: 29
Messages: 19
|
Jusqu'à maintenant je ne cerne pas exactement le probleme si tu peux me faire une representation graphique des 2 arcs avec un peu plus de detail ça sera tres simple d'éclaircir vos idées et peut etre on pourra trouver la faille
|
|
|
00
|