Wie berechnet man einen Tangentenvektor?

Einstiegsfragen, Mathematik, Physik, künstliche Intelligenz, Engine Design
Antworten
Gelöschter Benutzer
Beiträge: 92
Registriert: 26.02.2009, 22:09

Wie berechnet man einen Tangentenvektor?

Beitrag von Gelöschter Benutzer »

Hallo,

im Netz suche ich wie Wild :roll: , finde aber keine brauchbaren hinweise wie ich eine Tangente für ein Triangle berechne. Weiß jemand wie ;) ?
Der Shader zum Normal Mapping und Parallax Occlusion Mapping ist zwar schon fertig, aber für ein :| dynamisches Objekt fehlen mir einfach die Tangenten.
Wenn ich mich richtig erinnere ist die Binormale das normalisierte Kreuzprodukt aus Normale und Tangente oder?

Vielen Dank im Voraus!
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: Wie berechnet man einen Tangentenvektor?

Beitrag von Jörg »

Die Tangenten und/oder Bi-Normalen (sag lieber Bi-Tangente dazu) errechnest du aus dem Texturemapping der Normal-Map des Dreiecks. Da beide in der Ebene des Dreiecks liegen, kannst Du Dir aussuchen, welche du nimmst. Ja nach Mapping kann es aber auch von Vorteil sein, beide zu berechnen, statt ueber das Kreuzprodukt zu gehen (z.B. bei argen Verzerrungen im Mapping).
Siehe z.B. http://www.terathon.com/code/tangent.html
Gelöschter Benutzer
Beiträge: 92
Registriert: 26.02.2009, 22:09

Re: Wie berechnet man einen Tangentenvektor?

Beitrag von Gelöschter Benutzer »

Wie darf ich das jetzt verstehen?

Die Steigungen der Achsen der Textur im Pixelshader nehmen zwischen zwei Pixel oder wie?
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: Wie berechnet man einen Tangentenvektor?

Beitrag von Jörg »

Holla nein, den Tangentspace berechnest Du normalerweise pro Vertex und verwendest ihn im Pixelshader nur interpoliert.
Gelöschter Benutzer
Beiträge: 92
Registriert: 26.02.2009, 22:09

Re: Wie berechnet man einen Tangentenvektor?

Beitrag von Gelöschter Benutzer »

Das ist gut und auch meine Frage. Nur wie? Aus dem sample aus dem Buch werde ich irgendwie nicht wirklich schlau. Wie sieht denn dazu die mathematische Anweisung aus (also für 3D-Vektoren)?

Edit:

Moment, so (Basierend: http://www.3dkingdoms.com/weekly/weekly.php?a=37)?:

Code: Alles auswählen

void CalculateTangent(
      const float3 &P1, const float3 &P2, const float3 &P3, 
      const float2 UV1, const float2 UV2, const float2 UV3,
      Vec3 &tangent, Vec3 &bitangent )
{
   float3 Edge1 = P2 - P1;
   float3 Edge2 = P3 - P1;
   float2 Edge1uv = UV2 - UV1;
   float2 Edge2uv = UV3 - UV1;

   float cp = Edge1uv.y * Edge2uv.x - Edge1uv.x * Edge2uv.y;

   if ( cp != 0.0f )
   {
      float mul = 1.0f / cp;
      tangent   = (Edge1 * -Edge2uv.y + Edge2 * Edge1uv.y) * mul;
      bitangent = (Edge1 * -Edge2uv.x + Edge2 * Edge1uv.x) * mul;

      tangent.Normalize();
      bitangent.Normalize();
   }
}
Wobei P die jeweiligen Positionen und UV die Texturkoordinaten der Vertices.
Zuletzt geändert von Gelöschter Benutzer am 07.06.2009, 19:47, insgesamt 1-mal geändert.
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: Wie berechnet man einen Tangentenvektor?

Beitrag von Jörg »

Ganz einfach: Du suchst die Loesung T,B fuer das Gleichungssystem
P1 = P0 + (u1-u0)*T + (v1-v0)*B
P2 = P0 + (u2-u0)*T + (v2-v0)*B

wobei P0,P1,P2 die Dreieckseckpunkte in Objektkoordinaten sind, und u und v deren Mapping.

2x3 Gleichungen fuer 6 Unbekannte :)
Antworten