Déplacement d'un objet le long d'une courbe tout en le faisant pivoter


11

Je voudrais déplacer un objet le long d'une courbe . À des points particuliers de la courbe, je souhaite que l'objet change de vitesse et se tourne le long de son axe.

Imaginez un avion volant vers une destination. Il a son chemin qu'il doit suivre, en plus, il ajuste sa vitesse et son orientation à fond (cap, moelle, inclinaison).

Puis-je demander une information de démarrage sur les éléments suivants:

  • Quel type de courbes utiliser pour interpoler en douceur un objet
  • Quelles formules utiliser pour une interpolation fiable, où je pourrais contrôler la vitesse de déplacement de l'objet et la transition entre les nœuds de courbe serait transparente
  • Quelles informations doivent être exportées à partir d'une application de création 3D
  • Dois-je utiliser des quaternions slerp () pour cela?

Si vous connaissez un livre qui couvre ce sujet efficacement , ce serait le plus utile. Je vous remercie.

Réponses:


7

Pour la courbe de mouvement, je suggère d'utiliser des courbes Hermite. Vous donnez simplement un point / vitesse de départ et un point / vitesse de fin, et cela crée une courbe agréable et lisse entre ces deux. Utilisez le point de fin / vitesse de la première paire de points comme point de départ / vitesse de la prochaine paire de points et vous avez une belle courbe longue et sinueuse qui est transparente.

Cela gère parfaitement l'exigence de gérer la vitesse: vous donnez une liste de points dans le temps avec les vitesses que vous choisissez, et cela vous donne la position et les valeurs de vitesse interpolées de manière transparente. Si vous voulez aller avec cela, tout ce que vous devez extraire de l'application de création 3D est les points et les vitesses dans le chemin que vous désirez. Vous pouvez également les générer lors de l'exécution, peut-être en fonction des entrées de l'utilisateur.

Pour ajuster l'orientation, vous disposez d'un certain nombre d'options. Si l'avion pointe toujours vers où il va (ce qui est logique), vous pouvez utiliser le vecteur de vitesse interpolé de la courbe Hermite pour trouver où votre navire doit pointer. Si vous connaissez le vecteur haut (il se déplace dans un plan, ou vous savez quelle direction doit être vers le haut), vous pouvez calculer le troisième axe en croix (avant, haut) et là vous avez votre orientation.

Si vous voulez une orientation quelque peu "instable" de sorte que le plan s'écarte parfois de la direction avant dans le chemin, vous pouvez utiliser la direction avant comme direction souhaitée, et successivement faire un slerp en une étape entre l'orientation actuelle et l'orientation souhaitée.

Si vous voulez des orientations personnalisées qui n'ont rien à voir avec le chemin, vous pouvez bien sûr fournir une liste de quaternions d'orientation à cela. Vos points deviennent alors (point, vitesse, quaternion). Ensuite, vous pouvez utiliser un slerp entre deux quaternions successifs pour définir vos orientations en cours de route. N'oubliez pas que slerp est une méthode d'interpolation linéaire . Cependant, cela devrait généralement être bien. Si vous trouvez que les rotations ne sont pas assez lisses dans les coutures, vous pouvez essayer d'interpoler la liste des quaternions avec une courbe de Bézier, comme expliqué ici à la section 7.

Voici un code source qui peut vous aider à démarrer. Il a un certain nombre de techniques d'interpolation lisse pour une liste de quaternions (escouade, bezier, etc.).

Faites moi savoir si vous avez des questions!


+1 - Merci, votre réponse couvre essentiellement tout. Il répond à toutes les questions que j'ai posées, en plus, vous fournissez d'autres éléments à étudier. Maintenant, j'ai suffisamment de matériel pour commencer. Par conséquent, je ne vois aucune raison de ne pas marquer cela comme réponse acceptée .
Bunkai.Satori

@ Bunkai.Satori merci, heureux de vous aider :) J'aimerais voir ce que vous créez à la fin.
Gazihan Alankus
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.