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!
Wie berechnet man einen Tangentenvektor?
-
- Beiträge: 92
- Registriert: 26.02.2009, 22:09
Re: Wie berechnet man einen Tangentenvektor?
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
Siehe z.B. http://www.terathon.com/code/tangent.html
-
- Beiträge: 92
- Registriert: 26.02.2009, 22:09
Re: Wie berechnet man einen Tangentenvektor?
Wie darf ich das jetzt verstehen?
Die Steigungen der Achsen der Textur im Pixelshader nehmen zwischen zwei Pixel oder wie?
Die Steigungen der Achsen der Textur im Pixelshader nehmen zwischen zwei Pixel oder wie?
Re: Wie berechnet man einen Tangentenvektor?
Holla nein, den Tangentspace berechnest Du normalerweise pro Vertex und verwendest ihn im Pixelshader nur interpoliert.
-
- Beiträge: 92
- Registriert: 26.02.2009, 22:09
Re: Wie berechnet man einen Tangentenvektor?
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)?:
Wobei P die jeweiligen Positionen und UV die Texturkoordinaten der Vertices.
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();
}
}
Zuletzt geändert von Gelöschter Benutzer am 07.06.2009, 19:47, insgesamt 1-mal geändert.
Re: Wie berechnet man einen Tangentenvektor?
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 :)
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 :)