2011-01-15 6 views
5

J'ai un objet avec lequel je voudrais faire suivre une courbe de bezier et je suis un peu perdu maintenant quant à la façon de le faire faire en fonction du temps plutôt que les points qui composent la courbe.Déplacer un objet dans le sens d'une courbe de Bézier?

. :: Système actuel ::. Chaque objet de mon graphe de scène est constitué de vecteurs de position, de rotation et d'échelle. Ces vecteurs sont utilisés pour former leurs matrices correspondantes: échelle, rotation et translation. Qui sont ensuite multipliés dans cet ordre pour former la matrice de transformation locale. Une transformation de monde (généralement la matrice d'identité) est ensuite multipliée par rapport à la transformée de matrice locale.

class CObject 
{ 
public: 
// Local transform functions 
Matrix4f GetLocalTransform() const; 
void SetPosition(const Vector3f& pos); 
void SetRotation(const Vector3f& rot); 
void SetScale(const Vector3f& scale); 

    // Local transform 
    Matrix4f m_local; 
    Vector3f m_localPostion; 
    Vector3f m_localRotation; // rotation in degrees (xrot, yrot, zrot) 
    Vector3f m_localScale; 
} 

Matrix4f CObject::GetLocalTransform() 
{ 
    Matrix4f out(Matrix4f::IDENTITY); 

    Matrix4f scale(), rotation(), translation(); 

    scale.SetScale(m_localScale); 
    rotation.SetRotationDegrees(m_localRotation); 
    translation.SetTranslation(m_localTranslation); 

    out = scale * rotation * translation; 
} 

La grande question que je

sont

1) Comment puis-je orienter mon objet pour faire face à la tangente de la courbe de Bézier?

2) Comment est-ce que je déplace cet objet le long de la courbe sans juste placer la position d'objets à celle d'un point sur la cuve de bezier?

Heres un aperçu de la fonction jusqu'à

void CNodeControllerPieceWise::AnimateNode(CObject* pSpatial, double deltaTime) 
{ 
    // Get object latest pos. 
    Vector3f posDelta = pSpatial->GetWorldTransform().GetTranslation(); 

    // Get postion on curve 
    Vector3f pos = curve.GetPosition(m_t); 

    // Get tangent of curve 
    Vector3f tangent = curve.GetFirstDerivative(m_t); 

} 

Edit: désolé son pas très clair. Cela fait des années que je travaille là-dessus et que mon cerveau se transforme en bouillie.

Je souhaite que l'objet soit attaché à la courbe et fasse face à la direction de la courbe. En ce qui concerne le mouvement, je veux m'opposer à suivre la courbe en fonction de l'heure de cette façon, il crée un mouvement fluide tout au long de la courbe.

+0

J'ai la courbe dans sa forme complète. J'ai une position sur la courbe basée sur la valeur de t (voir la fonction AnimateNode), qui se situe entre 0 et 1. La fonction "curve.GetPosition (m_t)" est basée sur l'équation paramétrique de la courbe. – Sent1nel

Répondre

2

Vous devriez avoir une courbe sous forme paramétrique et utiliser un vecteur dérivé pour évaluer la rotation de votre objet (angle de rotation = angle dérivé) comme @etarion dit. Pour déplacer l'objet sur une courbe avec la vélocité désirée (je pense que c'est ce que vous voulez), à chaque étape de la simulation, vous devez estimer la distance que le point doit parcourir à cette étape.

L'estimation la plus simple est dist = derivative.length()*TIMER_STEP. Lorsque vous savez que la dist doit être parcourue sur l'étape en cours et t0 - le paramètre actuel de la courbe, vous pouvez simplement incrémenter t0 par une petite valeur epsilon et vérifier que la distance parcourue est encore plus petite qu'estimée. Répétez ceci jusqu'à ce que la distance parcourue (tout en augmentant t0) soit> = estimée. Ce sera le nouveau t0 paramètre en cours pour la prochaine étape

EDIT:

n'a pas remarqué d'abord, vous êtes en 3D. Dans l'espace 3D, vous ne pouvez pas définir sans ambiguïté la position d'un objet sur une courbe même si vous connaissez la position initiale. Imaginez juste que votre courbe est une ligne - l'objet peut toujours tourner autour de la ligne. Cet angle n'est pas défini par une courbe.

Je ferais quelque chose comme ça. Fixons un vecteur à l'objet de sorte que, au début du mouvement (paramètre de la courbe t = 0 par exemple), la direction du vecteur objet coïncide avec le vecteur dérivé. Ensuite, pendant le mouvement, ce vecteur devrait toujours coïncider avec la dérivée dans chaque point d'une courbe. Vous connaîtrez donc ce vecteur d'objet et pourrez configurer votre objet en fonction de ce vecteur. Mais vous aurez toujours un degré de liberté.

Par exemple, vous pouvez dire que l'objet ne tourne pas autour de ce vecteur. En connaissant le vecteur d'objet et l'angle de rotation qui l'entoure, vous pouvez restaurer l'orientation de l'objet dans le monde 3D. Un tel vecteur d'objet et un angle de rotation sont appelés quaternion - vous pouvez donc utiliser le math quaternion (copie simple de la formule requise) pour calculer la matrice de rotation de l'objet! voici les formules http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/index.htm

+0

Je ne suis pas sûr de ce que vous et 'etarion' voulez dire pour régler la rotation.L'angle dérivé est-il la tangente de la courbe? Si c'est le cas, comment transformer ce vecteur, la tangente, en angles d'image à utiliser avec la fonction "pSpatial-> SetRotation (Vector3f (?,?,?));" ? – Sent1nel

+0

J'ai mis à jour la réponse – Andrew

+0

Ce n'est pas tout à fait ce que j'ai fait, mais cela m'a beaucoup aidé. Je vais poster ma solution dans quelques jours. J'ai besoin de dormir tout à l'heure. – Sent1nel

2

Vous avez besoin d'une formulation paramétrique de votre courbe.

La grande question que je

sont

1) Comment puis-je orienter mon objet à face à la tangente de la courbe de Bézier?

Si vous avez la courbe sous forme paramétrique, la direction tangentielle est la dérivée de la position wrt. t.

2) Comment puis-je déplacer l'objet le long de la courbe sans fixer simplement des objets la position à celle d'un point sur la Bézier cuve?

Je ne suis pas sûr que je reçois votre question - que vous souhaitez augmenter t dans votre forme paramétrique dans une petite étape et la position de mise à jour et la direction. Vous avez encore un degré de liberté, d'ailleurs, la direction «ascendante» n'est pas déterminée à partir de la courbe, vous devez donc prendre soin de cela aussi.

0

Je suppose que vous avez tous les points dont vous avez besoin pour définir la courbe de Bézier. Ensuite, vous pouvez calculer chaque point de cette courbe. Calculer un point approprié en tenant compte de la vitesse à laquelle l'objet devrait se déplacer, et la synchronisation du cadre et vous devriez avoir un mouvement constant.

Le vecteur formé par les points de la dernière trame et de la trame courante peut être utilisé comme estimation grossière de la tangente dans la plupart des cas; par exemple. lorsque la courbe ne plie pas trop.

Modifier: également jeter un oeil ici how to calculate the length of a bezier curve. Vous aurez besoin de transformer cela, de sorte que vous pouvez calculer un point sur votre courbe (ou plutôt le t) pour une longueur donnée. Ensuite, déplacez simplement les distances par rapport au temps et ça devrait aller.

0

Une approche consiste à calculer une pyramide de points. La couche inférieure est vos points de contrôle transformés. Maintenant, pour un t donné, et pour chaque paire de points adjacents, créez un nouveau point sur ce segment de ligne pondéré par t. Ce nouvel ensemble de points forme la couche suivante dans la pyramide. Répétez jusqu'à ce que le calque courant a seulement 1 point. Ce point est votre position. Notez que la deuxième couche à partir du haut a 2 points, et détermine la ligne tangente.

Questions connexes