Debut de modeleur 3d

Soyez le premier à donner votre avis sur cette source.

Vue 10 031 fois - Téléchargée 913 fois

Description

c'est un debut seulement mais la structure y est :
j'utilise Qt et QGLviewer (un QGLWidget amelioré) pour afficher

Features :
-creation d'un cube à partir d'un fichier
-fichier(qui n'est plus Xml mais un melange xml/binaire (le xml est plus pratique pour deboguer mais le binaire est plus facile à gerer)
-calcul de normal
-node de transformation(Scale,translation,rotation) mais la combinaison scale+rotation ne donne pas le bon resultat
-label 3D / texte 2D
-Structure de la scene en arbre

Source / Exemple :


/*!
CNode Definition
!*/

//traverse Dom to load
bool CNode::Load(QDomNode node,CNode* caller)
{
    QDomNode child;
    setName( node.toElement().attribute("name","defaultCNode"));

    for(int i=0;i<node.childNodes().length();i++)
    {
        child = node.childNodes().item(i);

        logstr << "Node::Load->" << child.nodeName() << "(" << name << ")" << endl;

        CNode* ptr = caller->Spawn(child.nodeName()); //new child type nodename
        if(ptr)
            ptr->Load(child,ptr); //child load event(new child,glinit)
        else
            logstr << "Node::Error->" << child.nodeName() << "(" << name << ")" << endl;
    }
}

CNode* CNode::Spawn(QString type)
{
    logstr << "No Spawn for:" << type;
    return 0;
}

// add a child to our custody
void CNode::AddChild( CNode* pNode )
{
    Children.push_back(pNode);
}

// update our scene node //scene node traversal //bounding box,animation //done once per frame
bool CNode::Update()
{

    // loop through the list and update the children
    for( std::list<CNode*>::iterator i = Children.begin();
            i != Children.end(); i++ )
    {

        (*i)->Update();
    }

}

Conclusion :


il faut que je fasse les premiers outils de modelisation et l'application de texture maintenant
j'essaye de ne plus utiliser QT petit à petit

Codes Sources

Ajouter un commentaire Commentaires
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
Oui c'est difficile a expliquer comme ca...mais tu te rendras compte du probleme plus tard.

Dans des modeleurs tels que 3dsmax ou maya tu as cette implementation des groupes de lissage ( et je suppose dna stous les autres modeleurs 3d).
Et en fait les normales sont plutot associées a chaque triangle car les triangles que tu dessines ont bien souvent des sommets en commun; et si tu veux montrer a l'eclairage une rupture de pente nette comme l'arete d'un cube entre deux faces tu as necessairement besoin de 2 normales (ou plus) par sommet de l'arete...
C'est pour ca que les normales ne doivent pas etre associées aux sommets mais au sommets.
Messages postés
46
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
31 juillet 2006

je n'ai pas bien compris l'histoire du groupe de lissage mais je ferai une recherche google
pour le probléme d'éclairage c'est reglé, il fallait juste éliminer les normales en double(car le cube est fait avec des triangles)
et je fais les normales par vertex car j'utilise des tableaux de vertex(asssocié à un tableau de normals) je ne sais pas comment asssocié les normales à chaque index pourtant je vais devoir le faire pour les coordonnées de texture)
sinon j'ai implémenter un node de transformation(translation,rotation,scale) mais lors d'une rotation+scale mon cube se deforme je ne sais pas pourquoi
maintenant j'essaye de remplacer la gestion des nodes(que je faisais avec QT Xml) par ma propre gestion mais j'ai un probléme avec les strings(depassement mémoire pour des raisons inconnu)
j'updaterai le code quand tout fonctionnera correctement
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
Je ne peux pas tester pour l'instant ton appli mais il y a manifestement un probleme avec les normales de ton parallelépipède...
L'eclairage devrait etre uniforme sur chaque face et ici il y a un espece de degradé...

Cela viens sans doute du fait que pour calculer les normales des sommets tu fais la moyenne des normales des faces qui le ontient...
Ce qu'il faudrais que tu fasses c'est d'implementer des groupes de lissage c'est a dire des groupes de polygones qui dont les normales au sommets sont la moyenne des normales des faces le contenant...les sommets aux extrémités des groupes n'utilisant pas les normales des faces voisines. ( j'espere que c'est comprehensible...c'est pas evident a expliquer avec du texte! :) )

Ainsi dans le cas present tu cré un groupe de lissage par face du parallelépipède qui peuvent etre formées de un ou plusieurs polygones.

Voila bonne continuation!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.