Après avoir loader un mesh, je souhaiterais calculer la tangente de chacun de ses vertex. J'ai trouvé quelques sources sur le net mais rien qui me conviennent, quelqu'un pourrait-il m'aider?
Merci d'avance.
Après avoir loader un mesh, je souhaiterais calculer la tangente de chacun de ses vertex. J'ai trouvé quelques sources sur le net mais rien qui me conviennent, quelqu'un pourrait-il m'aider?
Merci d'avance.
Oyo ! Voilà j'ai une petite fonction pour toi
Calcul de la matrice TBN:
T0 B0 N0
T1 B1 N1
T2 B2 N2
Pris sur le forum du site : http://brugevin.boris.free.fr/
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
71
72 #include <iostream> #include <windows.h> #include "Vector.h" // Structure d'un vertex et de ses coordonn?es de texture struct Vecteur3st { float x,y,z; float s,t; }; // Calcul la tangente & la binormal au polygon void ComputeTangent(Vecteur3st v0, Vecteur3st v1, Vecteur3st v2, Vector *tangent, Vector *binormal) { // On calcul les diff?rents vecteurs pour effectuer le calcul Vector vx0(v0.x, v0.s, v0.t); Vector vx1(v1.x, v1.s, v1.t); Vector vx2(v2.x, v2.s, v2.t); Vector vy0(v0.y, v0.s, v0.t); Vector vy1(v1.y, v1.s, v1.t); Vector vy2(v2.y, v2.s, v2.t); Vector vz0(v0.z, v0.s, v0.t); Vector vz1(v1.z, v1.s, v1.t); Vector vz2(v2.z, v2.s, v2.t); // Calcul des 3 equation de plan Vector abc0((vx0-vx1) ^ (vx0-vx2)); Vector abc1((vy0-vy1) ^ (vy0-vy2)); Vector abc2((vz0-vz1) ^ (vz0-vz2)); if(tangent) { tangent->VecteurNew(-abc0.y/abc0.x,-abc1.y/abc1.x, -abc2.y/abc2.x); tangent->normalize(); } if(binormal) { binormal->VecteurNew(-abc0.z/abc0.x,-abc1.z/abc1.x, -abc2.z/abc2.x); binormal->normalize(); } } // Fonction principale int main() { // vertex Vector V0(0.0f, 0.0f, 0.0f); Vector V1(1.0f, 0.0f, 0.0f); Vector V2(0.0f, 1.0f, 0.0f); // vertex et coord texture Vecteur3st v0={V0.x, V0.y, V0.z, 0.0f, 0.0f }; Vecteur3st v1={V1.x, V1.y, V1.z, 1.0f, 0.0f }; Vecteur3st v2={V2.x, V2.y, V2.z, 0.0f, 1.0f }; // On cr?e les vecteurs Vector tangent, binormal, normal; // on les calcul ComputeTangent(v0, v1, v2, &tangent, &binormal); normal = ((V1-V0)^(V2-V0)); normal.normalize(); // affichage du r?sultat printf("Tangente : x : %f, y : %f, z : %f\n",tangent.x, tangent.y, tangent.z); printf("Binormal : x : %f, y : %f, z : %f\n",binormal.x, binormal.y, binormal.z); printf("Normal : x : %f, y : %f, z : %f\n",normal.x, normal.y, normal.z); return 0; }
Pensez aux tutoriels programmation : http://programmation.developpez.com/cours-tutoriels/
En cherchant comment calculer les TBN je suis tombé sur cette approche.
Après avoir tester le soucis est qu'elle n'est qu'un cas particulier. C'est à dire que si la normale est issue d'un lissage ( avec ou sans angle limite ), la tangente elle ne l'est pas. Ce qui fait des coupures net entre les différents polygones.
"Quand le monde est dangereux, l'humilité est un facteur de longévité." ( Baxter "Evolution" )
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager