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

DirectX Discussion :

Lumières mal calculées


Sujet :

DirectX

  1. #1
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 47
    Par défaut Lumières mal calculées
    Bonjour!

    Je cherche à éclairer un objet. Jusque là, rien d'exceptionnel.
    Mon objet en est réalité une image. Chaque ligne de l'image est gérée par un objet différent qui contient le couple Vertexbuffer/IndexBuffer nécessaire à la création de l'objet.

    Le hic, c'est que j'ai l'impression que du coup lors du calcul des normales les points liant chaque ligne ne sont pas pris en compte. Du coup, je me retrouve avec une lumière faciale qui n'éclaire pleinement mon objet que quand celui-ci est tourné de 3/4 environ

    Voici ce que j'attends :
    Ce que j'obtiens :
    Ce que j'obtiens en tournant un peu l'image, pour observer l'éclairage désiré :

    Help, please... [/img]

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 108
    Par défaut
    Rencontres-tu le problème si tu inclines ton objet à l'opposé ?

  3. #3
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    C'est toi qui les calcules les normales, non ?

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  4. #4
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 47
    Par défaut
    Oui c'est moi qui les calcule. Je viens de me rendre compte à l'instant (je passais en fait pour marquer ce sujet comme "résolu") que c'est dû à des tableaux non initialisés
    Mais si vous voulez m'aider, j'ai un autre problème
    Chaque bande de l'image n'étant pas dans le même objet, lorsque je calcule les normales, le compte de vertex partagés et donc la somme des normales des vertex n'est pas bon. Du coup, je me retrouve avec des lignes "foncées" entre chaque bande
    Voici comment je calcule mes normales :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    // Calculate normals for lightning
    void CIndexedVertexBuffer::ComputeNormals()
    {
    	BOOL bVertexBufferAlreadyLocked = m_pvVertices != NULL;
    	if (!bVertexBufferAlreadyLocked)
    		BeginVertexEdition ();
    	BOOL bIndexBufferAlreadyLocked	= m_pwIndices != NULL;
    	if (!bIndexBufferAlreadyLocked)
    		BeginIndexEdition ();
     
    	ASSERT (m_pvVertices);
    	ASSERT (m_pwIndices);
    	if (!m_pvVertices || !m_pwIndices)
    		return;
     
    	D3DXVECTOR3 vNormal;
    	DWORD 		dwVertex1;
    	DWORD 		dwVertex2;
    	DWORD 		dwVertex3;
     
    	//For each triangle, count the number of times each vertex is used and
    	//add together the normals of faces that share a vertex
    	for(DWORD dwCurrentVertex = 0; dwCurrentVertex < m_IndicesNumber.dwCur; dwCurrentVertex += 6)
    	{
    		dwVertex1 = m_pwIndices[dwCurrentVertex];
    		dwVertex2 = m_pwIndices[dwCurrentVertex + 1];
    		dwVertex3 = m_pwIndices[dwCurrentVertex + 2];
     
    		D3DXVECTOR3 v1 (m_pvVertices[dwVertex1].x, m_pvVertices[dwVertex1].y, m_pvVertices[dwVertex1].z);
    		D3DXVECTOR3 v2 (m_pvVertices[dwVertex2].x, m_pvVertices[dwVertex2].y, m_pvVertices[dwVertex2].z);
    		D3DXVECTOR3 v3 (m_pvVertices[dwVertex3].x, m_pvVertices[dwVertex3].y, m_pvVertices[dwVertex3].z);
     
    		vNormal = GetTriangeNormal(&v1, &v2, &v3);
     
    		m_pwNumOfSharedPolygons[dwVertex1]++;
    		m_pwNumOfSharedPolygons[dwVertex2]++;
    		m_pwNumOfSharedPolygons[dwVertex3]++;
     
    		m_pvSumVertexNormal[dwVertex1].x += vNormal.x;
    		m_pvSumVertexNormal[dwVertex1].y += vNormal.y;
    		m_pvSumVertexNormal[dwVertex1].z += vNormal.z;
     
    		m_pvSumVertexNormal[dwVertex2].x += vNormal.x;
    		m_pvSumVertexNormal[dwVertex2].y += vNormal.y;
    		m_pvSumVertexNormal[dwVertex2].z += vNormal.z;
     
    		m_pvSumVertexNormal[dwVertex3].x += vNormal.x;
    		m_pvSumVertexNormal[dwVertex3].y += vNormal.y;
    		m_pvSumVertexNormal[dwVertex3].z += vNormal.z;
    	}
     
    	//For each vertex, calculate the average normal
    	for(DWORD dwCurrentVertex = 0; dwCurrentVertex < m_VerticesNumber.dwCur; dwCurrentVertex ++)
    	{
    		vNormal.x = m_pvSumVertexNormal[dwCurrentVertex].x / m_pwNumOfSharedPolygons[dwCurrentVertex];
    		vNormal.y = m_pvSumVertexNormal[dwCurrentVertex].y / m_pwNumOfSharedPolygons[dwCurrentVertex];
    		vNormal.z = m_pvSumVertexNormal[dwCurrentVertex].z / m_pwNumOfSharedPolygons[dwCurrentVertex];
     
    		D3DXVec3Normalize(&vNormal, &vNormal);
     
    		m_pvVertices[dwCurrentVertex].nx = vNormal.x;
    		m_pvVertices[dwCurrentVertex].ny = vNormal.y;
    		m_pvVertices[dwCurrentVertex].nz = vNormal.z;
    	}
     
    	if (!bVertexBufferAlreadyLocked)
    		EndVertexEdition ();
    	if (!bIndexBufferAlreadyLocked)
    		EndIndexEdition ();
    }
    Une idée?

  5. #5
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 47
    Par défaut
    J'ai trouvé la solution Je n'utilise plus de lumières dynamiques
    Un petit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE/*TRUE*/ );
    accompagné d'un soupçon de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define IVB_FVF (D3DFVF_XYZ|/*D3DFVF_NORMAL|*/D3DFVF_DIFFUSE)
    et le tour est joué.
    Je sais, c'est radical comme solution, mais j'ai pas trouvé mieux.
    A première vue, je ne perds rien vu que de toute façon mon éclairage devait juste éclairer (aucun jeu de lumière spécial ou effet magique souhaité), quoique y'a pû trop de volume "visible" du coup
    Aurais-je raté des désavantages?

  6. #6
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    bah oui tu perds l'éclairage par vertex mais bon si tu t'en fous, tu t'en fous alors.

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

Discussions similaires

  1. calcule de date et mal de tête
    Par zerros dans le forum Langage
    Réponses: 2
    Dernier message: 16/03/2010, 16h05
  2. [AC-2003] Pied état mal calculé + usage en pied groupe
    Par rjl dans le forum IHM
    Réponses: 3
    Dernier message: 13/08/2009, 20h26
  3. Calcul lumière sur une seule face
    Par Pihtt dans le forum OpenGL
    Réponses: 1
    Dernier message: 16/11/2008, 23h27
  4. SUM calcule mal pas avec un COUNT
    Par tibofo dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/10/2008, 13h10
  5. LIMIT calcul mal avec des JOIN
    Par FMaz dans le forum Requêtes
    Réponses: 21
    Dernier message: 12/07/2006, 03h37

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