2012-01-12 1 views
1

내 메쉬의 모든 정점에 대한 접선 (범프 매핑에 필요)을 계산하려고합니다. v1, v2 및 v3은 삼각형의 정점이고 t1, t2 및 t3은 각각의 텍스처 좌표입니다. 내가 이해하는 바로는 삼각형의 세 꼭지점에 대한 접선을 출력해야합니다.접선 계산 OpenGL

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) 값이 때로는 것입니다. 내 메쉬는 단순한 원반 인 슈퍼 콤플렉스가 아니지만 모든 메쉬에서 범프 매핑을 가능하게하는 접선을 계산하는 보편적 인 공식을 원합니다.

답변

1

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입니다.

관련 문제