Seite 1 von 1
Wie berechnet man einen Tangentenvektor?
Verfasst: 07.06.2009, 18:05
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!
Re: Wie berechnet man einen Tangentenvektor?
Verfasst: 07.06.2009, 19:21
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
Re: Wie berechnet man einen Tangentenvektor?
Verfasst: 07.06.2009, 19:24
von Gelöschter Benutzer
Wie darf ich das jetzt verstehen?
Die Steigungen der Achsen der Textur im Pixelshader nehmen zwischen zwei Pixel oder wie?
Re: Wie berechnet man einen Tangentenvektor?
Verfasst: 07.06.2009, 19:30
von Jörg
Holla nein, den Tangentspace berechnest Du normalerweise pro Vertex und verwendest ihn im Pixelshader nur interpoliert.
Re: Wie berechnet man einen Tangentenvektor?
Verfasst: 07.06.2009, 19:41
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.
Re: Wie berechnet man einen Tangentenvektor?
Verfasst: 07.06.2009, 19:47
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 :)