J'essaie de faire une simulation d'hélicoptère simplifiée (pour le moment, c'est un cube) en 3D et j'ai des problèmes de rotation. Un hélicoptère peut pivoter selon les trois axes:
- tourner sur lui-même à l'aide de l'hélice arrière: rotation de l'axe y
- incliner à gauche et à droite pour aller à gauche ou à droite: rotation de l'axe z
- incliner vers le haut et vers le bas pour reculer ou avancer: rotation de l'axe x
J'ai besoin de pouvoir contrôler chaque axe individuellement. Jusqu'à présent, j'ai essayé d'utiliser des angles euler, mais quel que soit l'ordre de rotation que j'utilise, je tombe sur un verrou de cardan ou sur certains axes "changer de place".
Il me semble que j'ai besoin d'utiliser des quaternions, mais je ne sais pas comment contrôler chaque axe individuel, car les quaternions utilisent une direction et un angle. Dois-je créer trois quaternions et les multiplier ensemble? Ne pourrais-je pas me retrouver avec les mêmes problèmes?
La chose étrange est que si j'utilise mon doigt pour représenter les trois axes de mon hélicoptère (pouce vers le haut = y, index = z, milieu = x), je ne semble pas rencontrer ces problèmes. Pourquoi?
Réponses:
Vous devriez pouvoir utiliser une matrice ou un quaternion pour stocker l'orientation actuelle de votre hélicoptère. Le problème que vous rencontrez est de savoir comment appliquer un changement de tangage / lacet / roulis à l'hélicoptère.
Je pense que vous voulez appliquer un tangage / lacet / roulis à l'hélicoptère dans l'espace local à chaque image. Vous pouvez le faire en prenant le changement de tangage / lacet / roulis pour cette image et en construisant une matrice de rotation (vous pouvez le faire avec des angles d'Euler). Ensuite, vous faites pivoter l'orientation précédente de l'hélicoptère par cette matrice (avec l'orientation précédente représentée soit comme une matrice soit comme un quaternion). Il vous donnera l'orientation du nouveau cadre.
Représenter l'orientation de l'hélicoptère comme un quaternion a l'avantage que l'interpolation entre les quaternions est beaucoup plus facile que l'interpolation entre les matrices. Donc, si à l'avenir vous avez une orientation actuelle et que vous souhaitez déterminer la rotation par image qui vous amènera à une nouvelle orientation à un moment souhaité, la représentation quaternion peut être plus conviviale pour vous.
la source
Fondamentalement, vous pouvez utiliser toutes les autres représentations de rotations, sauf Euler Angles. Les matrices, les quaternions et même les angles d'axe feront ce que vous voulez.
Vous avez raison, vous vous retrouveriez avec les mêmes problèmes. La clé est de stocker l'orientation actuelle (matrice, quaternion) de votre objet et d'appliquer uniquement un delta lors du changement d'orientation.
Lorsque vous souhaitez faire un virage de 10 degrés autour de y, créez simplement une matrice delta / quaternion pour cela et post-multipliez-la avec votre orientation actuelle (si vous utilisez la post-multiplication pour les matrices). Si vous le multipliez dans l'autre sens, il fera pivoter le système autour de l'axe y du monde plutôt que autour de l'axe y de l'objet.
Je trouve cette ressource très utile, elle est également fournie avec du code source et explique très bien la théorie.
la source
Le problème que je pense que vous pourriez voir est une différence de rotation d'axe et de vecteurs de vitesse (et aussi qu'il vous manque une direction). Lorsqu'un hélicoptère s'incline vers l'avant pour avancer, la propulsion des pales de l'hélicoptère pousse l'air vers le bas et vers l'arrière à un angle perpendiculaire à ce que vous avez appelé l'axe X.
Vous avez un quatrième degré de liberté que vous avez manqué: la vitesse des pales contrôle le volume d'air poussé, ce qui contrôle également la quantité de portance générée par l'hélicoptère.
Mais même ainsi, votre "inclinaison gauche et droite" et "inclinaison haut et bas" contrôlent généralement l'hélicoptère sur un avion donné. C'est-à-dire qu'un hélicoptère ne devrait pas voler vers le bas lorsqu'il s'incline vers l'avant, vers l'arrière ou sur le côté - mais la quantité de portance pourrait devoir changer et la vitesse sera contrôlée par le côté "opposé" du triangle rectangle formé par reliant l'hélicoptère au sol avec une ligne droite vers le bas (gravité) et l'hypoténuse (portance). Cela devrait donner votre vecteur de vitesse à utiliser.
Vous devriez pouvoir utiliser des quaternions pour ce faire, mais ne basez pas vos valeurs de quaternion sur l'inclinaison de l'hélicoptère lui-même - essayez plutôt d'utiliser les forces de mouvement générées par l'hélicoptère.
la source