Math 切线计算OpenGL

Math 切线计算OpenGL,math,3d,geometry,Math,3d,Geometry,我试图计算网格中每个顶点的切线(凹凸贴图所需)。v1、v2和v3是三角形中的顶点,t1、t2和t3是各自的纹理坐标。据我所知,这应该输出三角形三个顶点的切线 Vec3f va = Vec3f{vertexData[a * 3 + 0], vertexData[a * 3 + 1], vertexData[a * 3 + 2]}; Vec3f vb = Vec3f{vertexData[b * 3 + 0], vertexData[b * 3 + 1], vertexData[b * 3 + 2]

我试图计算网格中每个顶点的切线(凹凸贴图所需)。v1、v2和v3是三角形中的顶点,t1、t2和t3是各自的纹理坐标。据我所知,这应该输出三角形三个顶点的切线

Vec3f va = Vec3f{vertexData[a * 3 + 0], vertexData[a * 3 + 1], vertexData[a * 3 + 2]};
Vec3f vb = Vec3f{vertexData[b * 3 + 0], vertexData[b * 3 + 1], vertexData[b * 3 + 2]};
Vec3f vc = Vec3f{vertexData[c * 3 + 0], vertexData[c * 3 + 1], vertexData[c * 3 + 2]};

Vec2f ta = (Vec2f){texcoordData[a * 2 + 0],texcoordData[a * 2 + 1]};
Vec2f tb = (Vec2f){texcoordData[b * 2 + 0],texcoordData[b * 2 + 1]};
Vec2f tc = (Vec2f){texcoordData[c * 2 + 0],texcoordData[c * 2 + 1]};

Vec3f v1 = subtractVec3f(vb, va);              
Vec3f v2 = subtractVec3f(vc, va);  

Vec2f t1 = subtractVec2f(tb, ta);
Vec2f t2 = subtractVec2f(tc, ta);

float coef = 1/(t1.u * t2.v - t1.v * t2.u);

Vec3f tangent = Vec3fMake((t2.v * v1.x - t1.v * v2.x) * coef,
                          (t2.v * v1.y - t1.v * v2.y) * coef,
                          (t2.v * v1.z - t1.v * v2.z) * coef);

我的问题是,
coef
变量有时是导致乘法关闭的
nan(不是数字)
值。我的网格不是超级复杂的,一个简单的圆柱体,但我想要一个通用公式来计算切线,以便在我的所有网格上启用凹凸贴图。

coef
使用NaN表示输入数据存在一些数值问题,如退化三角形或纹理坐标。确保表达式
(t1.u*t2.v-t1.v*t2.u)
不会(几乎)消失,即其绝对值大于某个合理的阈值


良好的健全性检查是
| vb va |>0^ vc va |>0
| tb ta |>0 ^ tc ta |>0
|规范化(vb va)。标准化(vc va)|<1
和标准化(tb ta)。标准化(tc-ta)|<1

coef
成为NaN表示输入数据存在一些数值问题,如退化三角形或纹理坐标。确保表达式
(t1.u*t2.v-t1.v*t2.u)
不会(几乎)消失,即其绝对值大于某个合理的阈值

良好的健全性检查是
| vb va |>0^ vc va |>0
| tb ta |>0 ^ tc ta |>0
|规范化(vb va)。标准化(vc va)|<1
和标准化(tb ta)。标准化(tc-ta)|<1