【问题标题】:Tangent calculation OpenGL切线计算OpenGL
【发布时间】:2012-01-13 04:18:59
【问题描述】:

我正在尝试计算网格中每个顶点的切线(凹凸贴图所需)。 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) 值导致乘法被关闭。我的网格不是超级复杂,一个简单的圆柱体,但我想要一个通用公式来计算切线,以便在我的所有网格上启用凹凸贴图。

【问题讨论】:

    标签: math 3d geometry


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多