我正在尝试计算网格中每个顶点的切线(凹凸贴图所需)。 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 (not a number)
值导致乘法关闭。我的网格不是超级复杂,是一个简单的圆柱体,但我想要一个通用公式来计算切线以在我的所有网格上启用凹凸贴图。
答案 0 :(得分:1)
coef
成为NaN表示输入数据存在一些数值问题,如退化三角形或纹理坐标。确保表达式(t1.u * t2.v - t1.v * t2.u)
没有(几乎)消失,即其绝对值大于某个合理的阈值。
良好的理智检查是|vb-va|>0 ^ |vc-va|>0
,|tb-ta|>0 ^ |tc-ta|>0
,|normalized(vb-va) . normalized(vc-va)| < 1
和|normalized(tb-ta) . normalized(tc-ta)| < 1
。