
Tangent calculation
Posted Thursday, 5 May, 2011 - 02:03 by Radar inHi all,
I am stuck with tangents. For some reason the just don't work perfectly. They are like 90% correct...
I really tried to get the hang of it for the past view days. But i guess i am too stupid for that.
I use the code below that i found on the internet. Is that one correct?
I get very strange lightning results when i have discontinous UV-Maps. And i am also not sure what to do with that.
If the surface is smoothed the vertex-normal is the sum of all surrounding surface-normals. Is is the same for tangents? Do i sum them too?
public static Vector4 CalculateTangentBinormal(Vector3 surfaceNormal, Vector3 v1Pos, Vector3 v2Pos, Vector3 v3Pos, Vector2 v1UV, Vector2 v2UV, Vector2 v3UV) { Vector4 tangent = new Vector4(); Vector3 side_0 = v1Pos - v2Pos; Vector3 side_1 = v3Pos - v2Pos; float delta_U_0 = v1UV.X - v2UV.X; float delta_U_1 = v3UV.X - v2UV.X; float delta_V_0 = v1UV.Y - v2UV.Y; float delta_V_1 = v3UV.Y - v2UV.Y; tangent = new Vector4( new Vector3(delta_V_1 * side_0 - delta_V_0 * side_1), 0f); Vector3 biNormal = Vector3.Normalize(delta_U_1 * side_0 - delta_U_0 * side_1); Vector3 tangentCross = Vector3.Cross(tangent.Xyz, biNormal); tangent.Normalize(); //wind the tangent into the other direction if necassary if (Vector3.Dot(tangentCross, surfaceNormal) < 0.0f) { biNormal = -biNormal; tangent *= -1.0f; tangent.W = -1.0f; } else tangent.W = 1.0f; return tangent; //binormal not stored atm. }
If you need other code (like shaders) to help me with the problem please tell me.
Thank you very much!!!

