Author Topic: Speed Discontinuity in bezier interpolation for camera  (Read 3338 times)

0 Members and 1 Guest are viewing this topic.

KONI

  • Associate
  • Posts: 4
Speed Discontinuity in bezier interpolation for camera
« on: April 13, 2006, 10:54:34 PM »
Salut,

j'ai voulu m'exercer avec un système de caméra et je me débrouille pas mal. Je définis quelques points, des waypoints, et ensuite j'utilise GetTickCount pour calculer un facteur mu entre 0 et 1 que j'utilise pour une interpolation de bézier pour calculer la position de la caméra.

Le code pour l'interpolation d'un axe est le suivant:

Code: [Select]

float interpolate(float mu, float p0, float p1, float p2, float p3){
/*
 Piecewise cubic bezier curve as defined by Adobe in Postscript
 The two end points are p0 and p3
 Their associated control points are p1 and p2
*/
float a, b, c;

c = 3 * (p1 - p0);
b = 3 * (p2 - p1) - c;
a = p3 - p0 - c - b;

return (a * mu * mu * mu + b * mu * mu + c * mu + p0);
}


Si mu devient plus grand que 1, je le diminue et je rajoute le temps passé à mon temps de référence pour calculer le nouveau mu:

Code: [Select]

while (mu > 1){
mu -= 1;
waypointTickValue += 1000; //GetTickCount();
currentWayPoint =(++currentWayPoint)%NumWayPoint; // infinite loop
}


Le problème arrive au passage d'un waypoint, lorsque mu devient plus grand que 1 mais j'arrive pas à voir l'erreur.
En fait, il y a une différence de vitesse, la caméra semble ralentir, presque s'arreter et ensuite continue à vitesse constante de nouveau entre les prochains points.

Est-ce que quelqu'un aurait une idée comment faire ?

Merci de votre aide.

JeGX

  • Global Moderator
  • Capo Crimine
  • *****
  • Posts: 2357
    • oZone3D.Net
Speed Discontinuity in bezier interpolation for camera
« Reply #1 on: April 14, 2006, 07:44:13 PM »
Hello,

utilise la définition suivante de la spline de Bezier:

B(u) = P0 * ( 1 - u )^3 +
          P1 * 3 * u * ( 1 - u )^2 +
          P2 * 3 * u2 * ( 1 - u ) +
          P3 * u3

couplé au tutoriel suivant: http://www.gamedev.net/reference/programming/features/curvessurfaces/

et ca devrait rouler.  Si tu as des pb avec la gestion du temps, commence par faire varier toi-même ton paramètre mu de 0.0 à 1.0 par step de 0.05 par exemple et regarde ce que ca donne.

KONI

  • Associate
  • Posts: 4
Speed Discontinuity in bezier interpolation for camera
« Reply #2 on: April 15, 2006, 10:13:41 AM »
Merci de ta réponse.

J'ai essayé avec tes formules mais le résultat était le même. Je crois que le problème provient du fait que j'essaie de calculer les points de contrôle p1 et p2 moi-même, basé sur les end points p0 et p3.

Est-ce que tu as une méthode pour les calculer ou est-ce que tu les places toi-même ?

JeGX

  • Global Moderator
  • Capo Crimine
  • *****
  • Posts: 2357
    • oZone3D.Net
Speed Discontinuity in bezier interpolation for camera
« Reply #3 on: April 15, 2006, 10:30:57 AM »
Pour tes tests il te faut 4 points de controles. Si tu ne veux pas te prendre la tête à les definir toi même, utilise le tool Camera Path Editor.

Commence par créer une spline toute simple (bouton Create Spline) puis exporte la (bouton Export Selected Spline - ne pas cocher la case Weld...)
en choisissant Simple XML format. Tu devrais avoir un fichier ressemblant à:

Code: [Select]

<spline>
<spline_params name="curve_33" type="bezier" num_points_per_patch="2000" />
<spline_keyframe>
<spline_keyframe_key_position x="-94.8617" y="40.7115" z="-34.3874" />
<spline_keyframe_tangent_position x="-103.5573" y="20.1581" z="-130.0395" />
</spline_keyframe>
<spline_keyframe>
<spline_keyframe_key_position x="114.6245" y="11.0672" z="71.9368" />
<spline_keyframe_tangent_position x="185.7708" y="86.1660" z="191.6996" />
</spline_keyframe>
</spline>


Voilà tes 4 points de controle (P0, P1, P2 et P3). Copie ces points dans ton code et fais des tests avec.

P0:
Code: [Select]

<spline_keyframe_key_position x="-94.8617" y="40.7115" z="-34.3874" />



P1:
Code: [Select]

<spline_keyframe_tangent_position x="-103.5573" y="20.1581" z="-130.0395" />


P2:
Code: [Select]

<spline_keyframe_tangent_position x="185.7708" y="86.1660" z="191.6996" />


P3:
Code: [Select]

<spline_keyframe_key_position x="114.6245" y="11.0672" z="71.9368" />

KONI

  • Associate
  • Posts: 4
Speed Discontinuity in bezier interpolation for camera
« Reply #4 on: April 15, 2006, 12:20:49 PM »
J'ai finalement résolu le problème:

Mon but était de pouvoir seulement définir les points sans les tangentes et d'avoir un mouvement smooth qui passe à travers tous les points.

Je me suis basé sur un text très bien écrit qui se trouve ici:

http://astronomy.swin.edu.au/~pbourke/curves/bezier/cubicbezier.html

J'ai surtout essayé de réaliser ce qui se trouve en bas dans le FAQ, c'est-à-dire de calculer les tangentes en me basant sur les points.

J'ai essayé de mettre quelques points en utilisant ton logiciel et j'ai réécrit le programme pourqu'il utilise les tangentes définis dans un fichier. Ca marche très bien.

Le problème arrive lorsque j'essaye de calculer les tangentes moi-même, le mouvement n'est plus smooth, donc je sais qu'il y a une erreur sur comment je les calcule.

J'avais seulement essayé la première manière mais je vais encore essayer la deuxième en espérant que le résultat sera mieux.

Je te tiens au courant.