Bonjour, j'essaye de me lancer dans la 3D.
Il y a quelques temps, j'avais fait un petit "moteur" graphique en fesant le rendu en utilisant un Scene Graph.
Ici, j'essaye de faire +- la même chose en 3D et j'aimerai avoir un système me permettant d'appliquer les
transformations des Node parent aux enfants. En gros pouvoir faire un truc de style en SFML :
states.transform *= getTransform();
Je me suis aidé du code source de sf::Transform et sf::Transformable. En ce qui concerne les transformations en elle-même je crois avoir réussi et bien intégré les calculs de matrice.
Par contre pour la méthode const Transform& sf::Transformable::getTransform()const :
const Transform& Transformable::getTransform() const
{
// Recompute the combined transform if needed
if (m_transformNeedUpdate)
{
float angle = -m_rotation * 3.141592654f / 180.f;
float cosine = static_cast<float>(std::cos(angle));
float sine = static_cast<float>(std::sin(angle));
float sxc = m_scale.x * cosine;
float syc = m_scale.y * cosine;
float sxs = m_scale.x * sine;
float sys = m_scale.y * sine;
float tx = -m_origin.x * sxc - m_origin.y * sys + m_position.x;
float ty = m_origin.x * sxs - m_origin.y * syc + m_position.y;
m_transform = Transform( sxc, sys, tx,
-sxs, syc, ty,
0.f, 0.f, 1.f);
m_transformNeedUpdate = false;
}
return m_transform;
}
Je dois dire que je m'y perd. J'aimerai avoir quelques explications et si possible également un lien où cette méthode (si elle a un nom et qu'elle ne soit pas une simple méthode pondue de ton esprit) est expliquée mathématiquement.
En fait cette fonction est équivalente à ceci :
(pseudo-code)
Transform rotation = Rotation(m_rotation);
Transform scale = Scale(m_scale.x, m_scale.y);
Transform translation = Translation(m_position.x, m_position.y);
Transform origin = Translation(m_origin.x, m_origin.y);
Transform inverseOrigin = Inverse(origin);
m_transform = inverseOrigin * rotation * scale * translation * origin;
... en version simplifiée (j'ai pris un bout de papier puis j'ai développé et simplifié les multiplications de matrices).
Il se peut que ce ne soit pas tout à fait exact, j'ai sorti ça sans vérifier. Mais dans l'idée c'est ça.
Pour ce qui est des formulations des matrices de rotation / scale / translation, ça se trouve partout sur internet.
Merci, par contre ça marche mieux avec
m_transform = inverseOrigin * translate * rotation * scale * origin;
:P
Une vrai galère l'inverse d'une matrice 4x4 :o
Et pour la rotation, je vais d'abord me limiter uniquement à celles basées sur les 3 axes principaux X,Y,Z.