Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Resolu] Scene Graph 3D  (Lu 1701 fois)

0 Membres et 1 Invité sur ce sujet

Reycan

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
[Resolu] Scene Graph 3D
« le: Août 19, 2013, 03:55:05 pm »
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.
« Modifié: Août 21, 2013, 02:14:56 am par Reycan »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Scene Graph 3D
« Réponse #1 le: Août 19, 2013, 04:04:43 pm »
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.
Laurent Gomila - SFML developer

Reycan

  • Newbie
  • *
  • Messages: 49
    • Voir le profil
Re : Scene Graph 3D
« Réponse #2 le: Août 21, 2013, 02:14:30 am »
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.
« Modifié: Août 21, 2013, 02:25:24 am par Reycan »