IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API graphiques Discussion :

Réalisation d'un loader 3ds (normales)


Sujet :

API graphiques

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Points : 40
    Points
    40
    Par défaut Réalisation d'un loader 3ds (normales)
    Bonjour, non, ce n'est pas un message pour demander pour la 50e fois comment charger un fichier 3ds sous tel ou tel API.

    Je suis actuellement en train de réaliser un loader 3ds (j'aime réinventer la roue, allez savoir pourquoi) et je rencontre certaines difficultés pour le calcul des normals.

    J'arrive bien à lire les sommets, les faces, et comme les normales ne sont pas fournies. Pas grave, je les calculs. Et là... C'est le drame, certaines sont bonnes et d'autres sont inversés. Donc je viens poster ici voir si quelqu'un a déjà eu ce problème.

    Voici le code pour calculer ma normale de surface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    void calc_surface_normal(float v1[3], float v2[3], float v3[3], float normal[3])
    {
        float u[3];
        float v[3];
        u[0] = v1[0] - v3[0];
        u[1] = v1[1] - v3[1];
        u[2] = v1[2] - v3[2];
        v[0] = v3[0] - v2[0];
        v[1] = v3[1] - v2[1];
        v[2] = v3[2] - v2[2];
        normal[0] = u[1] * v[2] - u[2] * v[1];
        normal[1] = u[2] * v[0] - u[0] * v[2];
        normal[2] = u[0] * v[1] - u[1] * v[0];
     
        float temp = sqrt(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]);
        normal[0] /= temp;
        normal[1] /= temp;
        normal[2] /= temp;
    }
    L'ordre des sommets (v1, v2, v3) est celui dans lequel je les lis et je pense qu'il est bon (après différents tests).

    Voila, merci d'avoir au moins lu ce message jusqu'au bout

  2. #2
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void calc_surface_normal(float v1[3], float v2[3], float v3[3], float normal[3])
    {
        float u[3];
        float v[3];
        u[0] = v1[0] - v3[0];
        u[1] = v1[1] - v3[1];
        u[2] = v1[2] - v3[2];
        v[0] = v3[0] - v2[0];
        v[1] = v3[1] - v2[1];
        v[2] = v3[2] - v2[2];
        normal[0] = u[1] * v[2] - u[2] * v[1];
        normal[1] = u[2] * v[0] - u[0] * v[2];
        normal[2] = u[0] * v[1] - u[1] * v[0];
     
        float temp = sqrt(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]);
        normal[0] /= temp;
        normal[1] /= temp;
        normal[2] /= temp;
    }
    Pour calculer les deux vecteurs, c'est ça :

    a.x = v[0].x - v[1].x;
    a.y = v[0].y - v[1].y;
    a.z = v[0].z - v[1].z;
    // b
    b.x = v[1].x - v[2].x;
    b.y = v[1].y - v[2].y;
    b.z = v[1].z - v[2].z;

    Bref, d'après moi ça devrait être ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void calc_surface_normal(float v1[3], float v2[3], float v3[3], float normal[3])
    {
        float u[3];
        float v[3];
        u[0] = v1[0] - v2[0];
        u[1] = v1[1] - v2[1];
        u[2] = v1[2] - v2[2];
        v[0] = v2[0] - v3[0];
        v[1] = v2[1] - v3[1];
        v[2] = v2[2] - v3[2];
        normal[0] = u[1] * v[2] - u[2] * v[1];
        normal[1] = u[2] * v[0] - u[0] * v[2];
        normal[2] = u[0] * v[1] - u[1] * v[0];
     
        float temp = sqrt(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]);
        normal[0] /= temp;
        normal[1] /= temp;
        normal[2] /= temp;
    }
    Or toi tu as l'air de faire v0 - v2 et v2 - v1... Peut-être que ça vient de la.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 58
    Points : 40
    Points
    40
    Par défaut
    J'ai essayé différentes possibilités dont celle la, et le problème reste le même

Discussions similaires

  1. Loader 3ds(ou autre) OpenGL ES (iphone)
    Par kiki1234 dans le forum OpenGL
    Réponses: 0
    Dernier message: 04/10/2008, 01h28
  2. aide loader 3ds sur opengl
    Par dkg77 dans le forum Delphi
    Réponses: 4
    Dernier message: 12/03/2007, 15h22
  3. [DX9] Mesh.FromFile et Loader 3DS
    Par funkydata dans le forum DirectX
    Réponses: 1
    Dernier message: 28/09/2006, 14h20
  4. [Truevision3D] Loader .3ds ??
    Par fokx666 dans le forum Moteurs 3D
    Réponses: 3
    Dernier message: 12/07/2006, 12h48
  5. loader 3ds
    Par god dans le forum OpenGL
    Réponses: 8
    Dernier message: 24/02/2005, 09h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo