Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

16.10.2009, 16:51

Tangenten Berechnnen D3DXComputeTangent alternative

Tag,

ich versuche momentan Normal-Mapping zu Implementieren. Doch dazu brauch man ja die Tangente an die Oberfläche. Doch ich weiß nicht, wie man die Berechnen soll.

Deshalb suche ich eine Funktion wie z.B. D3DXComputeTangent (...), die Jedoch keinen IDXMESH* als Parameter brauch, sondern nur die Vertices und Indices.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

16.10.2009, 17:19

Es gab da mal nen netten Artikel zu Per Pixel Lighting in der msdn, aber ich find ihn nimmer...

Jedenfalls kannst du die so berechnen (faces.vertices sind die indices der 3 vertices eines Dreiecks):

C-/C++-Quelltext

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
  for (i = 0; i < face_count; i++)
  {
    float du0, du1;
    D3DXVECTOR3 T, B, p0, p1, p2, v0, v1;

    p0 = vertices[faces[i].vertices[0]].vecPos;  // Vertex 0

    p1 = vertices[faces[i].vertices[1]].vecPos;  // Vertex 1

    p2 = vertices[faces[i].vertices[2]].vecPos;  // Vertex 2


    du0 = vertices[faces[i].vertices[1]].u - vertices[faces[i].vertices[0]].u;
    du1 = vertices[faces[i].vertices[2]].u - vertices[faces[i].vertices[0]].u;

    v0 = p1 - p0;
    v1 = p2 - p0;


    T = D3DXVECTOR3(du0 / v0.x, du0 / v0.y, du0 / v0.z) + D3DXVECTOR3(du1 / v1.x, du1 / v1.y, du1 / v1.z);

    D3DXVec3Normalize(&T, &T);
    D3DXVec3Cross(&B, &T, &vertices[faces[i].vertices[0]].vecNormal);

    vertices[faces[i].vertices[0]].vecTangent = T;
    vertices[faces[i].vertices[0]].vecBinormal = B;
    vertices[faces[i].vertices[1]].vecTangent = T;
    vertices[faces[i].vertices[1]].vecBinormal = B;
    vertices[faces[i].vertices[2]].vecTangent = T;
    vertices[faces[i].vertices[2]].vecBinormal = B;
  }

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

16.10.2009, 17:40

Und dann noch per Vertex ausrichten.

4

16.10.2009, 17:43

was ist vertices[faces.vertices[2]].u ?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

16.10.2009, 17:50

Die u-Komponente von deinen Texturekoordinaten des Vertex.

Hier noch ein paar gute Links zum Thema:
http://www.blacksmith-studios.dk/projects/downloads/tangent_matrix_derivation.php
http://www.terathon.com/code/tangent.html
http://www.gamasutra.com/view/feature/1515/messing_with_tangent_space.php?page=4

6

16.10.2009, 18:29

Bei mir funkts irgendwie net:

Wert von T (0.0f, #INF, #INF)

Alle ausgangswerte sind gültig.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

16.10.2009, 18:59

Zitat von »"E122"«

Alle ausgangswerte sind gültig.


Sind sie das? Sicher dass du keine Division durch 0 drin hast? ;)

8

17.10.2009, 10:22

Doch, ein paar werte sind 0;

v0.y und v0.z. Aber das ist doch eigentlich normal.

Frage: Soll ich die transformierten Vertices nehmen, oder die Normalen Koordinaten.

Hier die Daten meiner Dreiecke.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        v[0].Normal = tbVector3 (0.0f, 0.0f, 1.0f);
        v[1].Normal = tbVector3 (0.0f, 0.0f, 1.0f);
        v[2].Normal = tbVector3 (0.0f, 0.0f, 1.0f);
        v[3].Normal = tbVector3 (0.0f, 0.0f, 1.0f);
        v[4].Normal = tbVector3 (0.0f, 0.0f, 1.0f);
        v[5].Normal = tbVector3 (0.0f, 0.0f, 1.0f);
        
        //              /----------------------------------------------/

        //             /                                              /

        //            /----------------------------------------------/

        v[0].Position = tbVector3 (-4.0f, 1.0f, 1.0f);
        v[1].Position = tbVector3 ( 4.0f, 1.0f, 1.0f);
        v[2].Position = tbVector3 (-4.0f, 1.0f, 5.0f);
        v[3].Position = tbVector3 (-4.0f, 1.0f, 5.0f);
        v[4].Position = tbVector3 ( 4.0f, 1.0f, 1.0f);
        v[5].Position = tbVector3 ( 4.0f, 1.0f, 5.0f);
        v[0].Texture = tbVector2 (0.0f, 1.0f);
        v[1].Texture = tbVector2 (1.0f, 1.0f);
        v[2].Texture = tbVector2 (0.0f, 0.0f);
        v[3].Texture = tbVector2 (0.0f, 0.0f);
        v[4].Texture = tbVector2 (1.0f, 1.0f);
        v[5].Texture = tbVector2 (1.0f, 0.0f);

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

17.10.2009, 13:06

Du nimmst die Koordinaten im Objektspace.

P.S.: Dot's Methode liefert bei mir nur wirres Zeug. :-)

10

17.10.2009, 13:08

Aber wo liegt der Fehler ? oder Besserer Vorschlag als Dots methode ?
Ich will jetzt mal weiterkommen. Dieses Normalmapping nervt mich schon seit 3 Tagen :evil: :cry:

Werbeanzeige