2010-12-03 9 views
3

J'ai un vaisseau spatial dans un environnement 3D. J'ai dessiné une courbe B-Spline en utilisant des points de contrôle (convertis en une courbe de Bézier pour pouvoir la dessiner). Chaque fois que l'événement de tirage est appelé, le navire se trouve au point (0,0,0) et est traduit à la coordonnée suivante sur la courbe. Maintenant, avant de faire cette traduction, je devrais faire une rotation de sorte que l'orientation du vaisseau soit le long de la tangente de la courbe à ce point.Courbe Trajectoire orientation objet

Je suis en mesure de rapprocher la tangente en trouvant un point sur la courbe qui est près de l'actuel en faisant cela. J'utilise OpenGL en C++

float mDifference[1][3] = {nearPoint[0][0] - currentPosition[0][0], 
          nearPoint[0][1] - currentPosition[0][1], 
          nearPoint[0][2] - currentPosition[0][2]}; 

float norm = sqrt(mDifference[0][0] * mDifference[0][0] 
      + mDifference[0][1] * mDifference[0][1] 
      + mDifference[0][2] * mDifference[0][2]); 

float tangent[1][3] = { mDifference[0][0]/norm, 
         mDifference[0][1]/norm, 
         mDifference[0][2]/norm}; 

//tangent = rotationVector? 
spacecraftTransformGroup->setRotationVector(tangent[0][0],tangent[0][1],tangent[0][2]); 

Je pense que le vecteur de rotation est la tangente, mais ne peut pas trouver l'angle nécessaire pour faire tourner le navire. Comment puis-je faire pivoter le vaisseau pour l'aligner avec la tangente?

+0

Rappelez-vous juste que dy/dx = (dy/dt)/(dx/dt). – Sjoerd

+0

Tout simplement parce que je ne savais pas ce que les fonctions mathématiques pour les dérivés étaient en C++. Je pourrais examiner cela pour le rendre plus précis. – Amaranth

Répondre

2

bien une matrice orthonormée (ie d'orientation) est composée des éléments suivants:

Direction, Tangent, bitangentes (Up vecteur).

Donc, si vous avez votre comme suit

Tx, Bx, Dx, Px 
Ty, By, Dy, Py 
Tz, Bz, Dz, Pz 
    0, 0, 0, 1 
direction et tangente, vous pouvez traverser le produit pour obtenir votre Bitangent former votre matrice à partir de 3 vecteurs de direction (D, T, B) et vecteur de position (P)

Votre objet est maintenant orienté le long du vecteur directionnel ...

+0

Je suis désolé, qu'est-ce que je fais avec cette matrice? la méthode de rotation opengl demande une rotation vecor (tableau 1x3) et un angle. – Amaranth

+0

@Mathieu - Ça fait longtemps, mais je me souviens qu'OpenGL vous permet de charger une matrice pré-calculée en tant que matrice ModelView, au lieu d'utiliser une série de rotations. – ysap

+0

@ysap: GLfloat M [16] = {Tx, Ty, Tz, 0, Bx, Par, Bz, 0, Dx, Dy, Dz, 0, Px, Py, Pz, 1}; glLoadMatrix (M); – datenwolf

1

Tout d'abord, voir this site pour plus d'informations sur la recherche de la tangente réelle à un point donné le long de la courbe B-Spline.

Deuxièmement, vous pouvez utiliser atan(y/x) pour obtenir l'angle (en radians) du vecteur de tangente. Utilisez cet angle pour faire pivoter votre vaisseau, en supposant que l'angle «zéro» fait pointer votre vaisseau le long de l'axe des x. Pourquoi approcher la tangente si vous pouvez en déduire analytiquement?

+0

Cela ne fonctionnerait-il pas seulement en 2d? Peut-être que je peux essayer cela et à une autre rotation avec l'angle entre les coordonnées y et z. – Amaranth