获取对象空间的切线到纹理空间

时间:2016-03-01 12:45:20

标签: c++ opengl bump-mapping

大学作业要求我使用我必须从正常值计算法线和正切的顶点坐标,以便我可以创建一个纹理空间矩阵的对象空间。

我有制作Matrix所需的代码和binormal,但我没有计算Tangent的代码。我试着在网上看,但答案通常会让我感到困惑。你能清楚地向我解释它是如何运作的吗?

编辑:我已经纠正了我之前写的内容,因为我明白我误解了这项任务。谢谢大家帮我看看。

1 个答案:

答案 0 :(得分:2)

数学意义上的切线是几何对象的属性,而不是法线贴图的属性。在正常映射的情况下,我们另外搜索一个非常特定的切线(每个点中有无数个,基本上由法线定义的平面中的每个向量都是切线)。

但是让我们后退一步:我们想要一个空间,其中纹理的u方向映射在切线方向上,bitangent / binormal上的v方向和法线贴图的向上矢量映射到法线物体。因此,具有uv坐标(uv1,uv2,uv3)的三角形(v0,v1,v2)的切线可以计算为:

dv1 = v1-v0
dv2 = v2-v0

duv1 = uv1-uv0
duv2 = uv2-uv0

r = 1.0f / (duv1.x * duv2.y - duv1.y * duv2.x);
tangent = (dv1 * duv2.y   - dv2 * duv1.y) * r;
bitangent = (dv2 * duv1.x   - dv1 * duv2.x) * r;

当对所有三角形完成此操作时,我们必须平滑共享顶点处的切线(非常类似于正常情况)。根据您的需要,有几种算法可以做到这一点。例如,可以通过相邻三角形的表面积或它们的入射角对切线进行加权。

这个整个计算的实现可以在[这里]找到更详细的解释:(http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-13-normal-mapping/