Tangent Space Calculation

1 de 3

http://www.terathon.com/code/tangent.html

Computing Tangent Space Basis Vectors for an Arbitrary Mesh Modern bump mapping (also known as normal mapping) requires that tangent plane basis vectors be calculated for each vertex in a mesh. This article presents the theory behind the computation of per-vertex tangent spaces for an arbitrary triangle mesh and provides source code that implements the proper mathematics. Transvoxel Algorithm Tangent Basis Oblique Frustum Polygon Clipping Edge List

Mathematical Derivation [This derivation also appears in Mathematics for 3D Game Programming and Computer Graphics, 3rd ed., Section 7.8 (or in Section 6.8 of the second edition).] We want our tangent space to be aligned such that the x axis corresponds to the u direction in the bump map and the y axis corresponds to the v direction in the bump map. That is, if Q represents a point inside the triangle, we would like to be able to write Q − P0 = (u − u0)T + (v − v0)B,

Vector2D Class Vector3D Class Vector4D Class

where T and B are tangent vectors aligned to the texture map, P0 is the position of one of the vertices of the triangle, and (u0, v0) are the texture coordinates at that vertex. The letter B stands for bitangent, but in many places it is stilled called binormal because of a mix-up in terms when tangent-space bump mapping first became widespread. (See “Bitangent versus Binormal” below.) Suppose that we have a triangle whose vertex positions are given by the points P0, P1, and P2, and whose corresponding texture coordinates are given by (u0, v0), (u1, v1), and (u2, v2). Our calculations can be made much simpler by working relative to the vertex P0, so we let Q1 = P1 − P0 Q2 = P2 − P0 and (s1, t1) = (u1 − u0, v1 − v0) (s2, t2) = (u2 − u0, v2 − v0). We need to solve the following equations for T and B. Q1 = s1T + t1B Q2 = s2T + t2B This is a linear system with six unknowns (three for each T and B) and six equations (the x, y, and z components of the two vector equations). We can write this in matrix form as follows. (Q1)x (Q1)y (Q1)z

=

(Q2)x (Q2)y (Q2)z

s1 t1

Tx Ty Tz

s2 t2

Bx By Bz

Multiplying both sides by the inverse of the (s, t) matrix, we have Tx Ty Tz Bx By Bz

=

1

t2

−t1

(Q1)x (Q1)y (Q1)z

s1t2 − s2t1

−s2

s1

(Q2)x (Q2)y (Q2)z

.

This gives us the (unnormalized) T and B tangent vectors for the triangle whose vertices are P0, P1, and P2. To find the tangent vectors for a single vertex, we average the tangents for all triangles sharing that vertex in a manner similar to the way in which vertex normals are commonly calculated. In the case that neighboring triangles have discontinuous texture mapping, vertices along the border are generally already duplicated since they have different mapping coordinates anyway. We do not average tangents from such triangles because the result would not accurately represent the orientation of the bump map for either triangle. Once we have the normal vector N and the tangent vectors T and B for a vertex, we can transform from tangent space into object space using the matrix Tx Bx Nx Ty By Ny

.

Tz Bz Nz To transform in the opposite direction (from object space to tangent space—what we want to do to the light direction), we can simply use the inverse of this matrix. It is not necessarily true that the tangent vectors are perpendicular to each other or to the normal vector, so the inverse of this matrix is not generally equal to its transpose. It is safe to assume, however, that the three vectors will at least be close to orthogonal, so using the Gram-Schmidt algorithm to orthogonalize them should not cause any unacceptable distortions. Using this process, new (still unnormalized) tangent vectors T′ and B′ are given by

02/10/2012 19:32

Tangent Space Calculation

2 de 3

http://www.terathon.com/code/tangent.html

T′ = T − (N · T)N B′ = B − (N · B)N − (T′ · B)T′/T′2 Normalizing these vectors and storing them as the tangent and bitangent for a vertex lets us use the matrix T′x T′y T′z B′x B′y B′z

(*)

Nx Ny Nz to transform the direction to light from object space into tangent space. Taking the dot product of the transformed light direction with a sample from the bump map then produces the correct Lambertian diffuse lighting value. It is not necessary to store an extra array containing the per-vertex bitangent since the cross product N × T′ can be used to obtain mB′, where m = ±1 represents the handedness of the tangent space. The handedness value must be stored per-vertex since the bitangent B′ obtained from N × T′ may point in the wrong direction. The value of m is equal to the determinant of the matrix in Equation (*). One may find it convenient to store the per-vertex tangent vector T′ as a four-dimensional entity whose w coordinate holds the value of m. Then the bitangent B′ can be computed using the formula B′ = T′w(N × T′), where the cross product ignores the w coordinate. This works nicely for vertex programs by avoiding the need to specify an additional array containing the per-vertex m values.

Bitangent versus Binormal The term binormal is commonly used as the name of the second tangent direction (that is perpendicular to the surface normal and u-aligned tangent direction). This is a misnomer. The term binormal pops up in the study of curves and completes what is known as a Frenet frame about a particular point on a curve. Curves have a single tangent direction and two orthogonal normal directions, hence the terms normal and binormal. When discussing a coordinate frame at a point on a surface, there is one normal direction and two tangent directions, which should be called the tangent and bitangent.

Source Code The code below generates a four-component tangent T in which the handedness of the local coordinate system is stored as ±1 in the w-coordinate. The bitangent vector B is then given by B = (N × T) · Tw. #include "Vector4D.h"

struct Triangle { unsigned short };

index[3];

void CalculateTangentArray(long vertexCount, const Point3D *vertex, const Vector3D *normal, const Point2D *texcoord, long triangleCount, const Triangle *triangle, Vector4D *tangent) { Vector3D *tan1 = new Vector3D[vertexCount * 2]; Vector3D *tan2 = tan1 + vertexCount; ZeroMemory(tan1, vertexCount * sizeof(Vector3D) * 2); for (long a { long i1 long i2 long i3

= 0; a < triangleCount; a++) = triangle->index[0]; = triangle->index[1]; = triangle->index[2];

const Point3D& v1 = vertex[i1]; const Point3D& v2 = vertex[i2]; const Point3D& v3 = vertex[i3]; const Point2D& w1 = texcoord[i1]; const Point2D& w2 = texcoord[i2]; const Point2D& w3 = texcoord[i3]; float float float float float float

x1 x2 y1 y2 z1 z2

= = = = = =

v2.x v3.x v2.y v3.y v2.z v3.z

-

v1.x; v1.x; v1.y; v1.y; v1.z; v1.z;

float float float float

s1 s2 t1 t2

= = = =

w2.x w3.x w2.y w3.y

-

w1.x; w1.x; w1.y; w1.y;

float r = 1.0F / (s1 * t2 Vector3D sdir((t2 * x1 - t1 (t2 * z1 - t1 * z2) Vector3D tdir((s1 * x2 - s2 (s1 * z2 - s2 * z1)

s2 * t1); * x2) * r, (t2 * y1 - t1 * y2) * r, * r); * x1) * r, (s1 * y2 - s2 * y1) * r, * r);

tan1[i1] += sdir; tan1[i2] += sdir; tan1[i3] += sdir; tan2[i1] += tdir; tan2[i2] += tdir;

02/10/2012 19:32

Tangent Space Calculation

3 de 3

http://www.terathon.com/code/tangent.html

tan2[i3] += tdir; triangle++; } for (long a = 0; a < vertexCount; a++) { const Vector3D& n = normal[a]; const Vector3D& t = tan1[a]; // Gram-Schmidt orthogonalize tangent[a] = (t - n * Dot(n, t)).Normalize(); // Calculate handedness tangent[a].w = (Dot(Cross(n, t), tan2[a]) < 0.0F) ? -1.0F : 1.0F; } delete[] tan1; }

How to cite this article Lengyel, Eric. “Computing Tangent Space Basis Vectors for an Arbitrary Mesh”. Terathon Software 3D Graphics Library, 2001. http://www.terathon.com/code/tangent.html Copyright © 2001–2008, Terathon Software LLC

02/10/2012 19:32

Tangent Space Calculation.pdf

Tangent Space Calculation http://www.terathon.com/code/tangent.html. 3 de 3 02/10/2012 19:32. Page 3 of 3. Tangent Space Calculation.pdf. Tangent Space ...

129KB Sizes 3 Downloads 347 Views

Recommend Documents

Tangent Space Calculation.pdf
There was a problem previewing this document. Retrying... Download. Connect more apps... Try one of the apps below to open or edit this item. Tangent Space ...

Geometry of the tangent bundle and the tangent ...
SASAKI METRIC. On the other hand, since (expx ◦R−u)∗u : TuTxM −→ TxM is isomorphism, dim ImK(x,u) = n. Now, we need only to show V(x,u) ∩ H(x,u) = {0}.

Stability of tangent bundle on the moduli space of ...
of stable bundles of rank r and of fixed determinant of degree d (such that (r, d) = 1), ...... The Institute of Mathematical Sciences, CIT Campus, Taramani, Chennai ...

10.1 Tangent Ratios.pdf
building does the ladder reach? HOMEWORK: pages 635-636 #13-33 odd. Page 2 of 2. 10.1 Tangent Ratios.pdf. 10.1 Tangent Ratios.pdf. Open. Extract.

Tangent-Corrected Embedding
lying instead on local Euclidean distances that can be mis- leading in image space. .... 0 means the pair is parallel (aligned) and 1 means the pair is orthogonal ...

Curvatures of Tangent Hyperquadric Bundles
on which we induce a pseudo-Riemannian metric from the Sasaki metric. Kowalski-Sekizawa [1] have shown how the geometry of the tangent sphere bundle. TrM over a Riemannian manifold (M,g) depends on the radius r. We generalize a part of their results

Curvatures of Tangent Hyperquadric Bundles
Aug 31, 2010 - of constant sectional curvature c = 0. ... ∀˜c ∈ R, ∃r > 0 s.t. ˜Sc(˜gr) ≡ ˜c. ˜Sc(˜gr)(x,u) : scalar ..... Vp,q : vector space of signature (p, q). ∃φ : (x.

geometry 6.2 Tangent Properties practice problems ANSWER KEY.pdf ...
geometry 6.2 Tangent Properties practice problems ANSWER KEY.pdf. geometry 6.2 Tangent Properties practice problems ANSWER KEY.pdf. Open. Extract.

Newton's Method and Tangent Line Approx wksht.pdf
Newton's Method and Tangent Line Approx wksht.pdf. Newton's Method and Tangent Line Approx wksht.pdf. Open. Extract. Open with. Sign In. Main menu.

Space Rock and Space Attack.pdf
Page 2 of 8. How would the. meaning be. different if the. author had written. “I strolled into the. kitchen” instead? www.scholastic.com/scope • SEPTEMBER 2013 21. Andrew Penner/E+/Getty Images (Background); istockphoto.com (Smiley Face). reali

View-based 3D Object Retrieval Using Tangent ...
this advantage, we propose a 3D object retrieval framework based on light field. ... In our experiment, a standard 3D object database is adopted, and our.

Fuss' Problem of the Chord-Tangent Quadrilateral Mgr. Barbora Stastna
e-mail: [email protected]. Nicolaus Fuss .... URL 1996. Electronic sources date from ...

Fuss' Problem of the Chord-Tangent Quadrilateral Mgr. Barbora Stastna
formed by tangency chords is designated ω (see figure 2). The lines AB and .... URL 1996.

THE TANGENT BUNDLE OF A MODEL CATEGORY ...
of simplicial sets over the twisted arrow category of C equipped with the covariant model structure. In particular, the underlying ∞-category. TC Cat∞. TC Set. Joy. ∆. ∞ is equivalent to the ∞-category of functors Tw(C) →. Spectra (see [H

tangent to Circle board2010 17-05-2009
a) Find the condition that the line y = mx + c is a tangent to the circle x2 + y2 = a2, hence find the equation of tangent in slope form. Also find the point of contact. b) Show that the circles x2 + y2 - 4x + 10y + 20 = 0 and x2 + y2 + 8x - 6y - 24

French Space Policy highlighted at the Washington Space Business ...
May 4, 2016 - CNES's President then turned his attention to NewSpace, or to be more ... more modular, more flexible and more diverse space systems, be it in ...

ETS Collaborative Service Space - Space & Service Strategy Report ...
ETS Collaborative Service Space - Space & Service Strategy Report 150515.pdf. ETS Collaborative Service Space - Space & Service Strategy Report 150515.

French Space Policy highlighted at the Washington Space Business ...
May 4, 2016 - Page 1. Office for Science & Technology at the Embassy of France in the United States. French Space Policy highlighted at the Washington ...