Si vous souhaitez faire pivoter un objet autour du centre du monde, vous devez mettre en place une matrice de rotation première:
float angle = ...;
glm::vec3 rotAxis(...);
glm::mat4 rotMat = glm::rotation(glm::mat4(1.0f), angle, rotAxis);
Notez la fonction glm::rotation
calcule le sinus et le cosinus de l'angle et définit les champs appropriés à l'intérieur de la matrice.
2 vous devez configurer vos objets de matrice de position, c'est la matrice qui décrit la position initiale de l'objet:
glm::vec3 position(radius, 0.0f, 0.0f);
glm::mat4 transMat = glm::translate(glm::mat4(1.0f), position);
Pour faire pivoter l'objet autour du centre du monde, vous devez multiplier la rotation matrice rotMat
par la matrice modèle transMat
, car la matrice de rotation définit le système de référence, pour placer l'objet.
glm::mat4 modelMat = rotMat * transMat;
Si vous souhaitez faire pivoter un objet autour de son propre origine, vous devez d'abord placer votre objet dans le monde et vous devez le faire pivoter:
glm::mat4 modelMat = transMat * rotMat;
Voir aussi la réponse à la question OpenGL transforming objects with multiple rotations of Different axis
Dans votre cas, où vous voulez que l'objet soit dirigé vers le centre du monde, vous devez d'abord traduire l'objet à sa place. 2ème vous devez calculer l'angle entre l'axe X du monde et la direction de l'objet au centre. Enfin, vous devez tourner l'objet dans le opposé direction.
glm::vec3 position(...);
glm::vec3 center(...);
glm::mat4 transMat = glm::translate(glm::mat4(1.0f), position);
float angle = atan2f(center.y - position.y, center.x - position.x);
glm::vec3 rotAxis(0.0f, 0.0f, 1.0f);
glm::mat4 rotMat = glm::rotation(glm::mat4(1.0f), -angle, rotAxis);
glm::mat4 modelMat = transMat * rotMat;
Pouvez-vous remarquer quelque chose de spécial au sujet de la mauvaise valeur? Peut-être que vous avez besoin d'inverser le signe ou ajouter 'pi/2' à lui ou quelque chose de similaire. – HolyBlackCat
@HolyBlackCat Merci pour votre réponse. J'ai 3 objet, si j'essaye de changer leur angle avec atan2f, j'en ai un reste à 0 degrés, un autre approximativement 120 degrés et un autre -120 degrés. La valeur des droits doit être de 90 degrés, 135 degrés environ, et la dernière environ -135 degrés aussi .. – Vitge