一项大学作业要求我使用“顶点坐标”,我必须根据“法线”值计算“法线”和“切线”,以便可以创建“对象空间到纹理空间”矩阵。
我有制作矩阵所需的代码,还有双态的,但我没有计算切线的代码。我试图上网查看,但是答案通常使我感到困惑。您能清楚地向我解释它是如何工作的吗?
编辑:我已经更正了我以前写的内容,因为我显然误解了作业。谢谢大家的帮助。
最佳答案
数学上的切线是几何对象的属性,而不是法线贴图的属性。在法线贴图的情况下,我们还要搜索一个非常特定的切线(每个点无限多,基本上,法线定义的平面中的每个向量都是一个切线)。
但是让我们退后一步:我们需要一个空间,纹理的u方向映射到切线方向,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/)
关于c++ - 获取对象空间的切线到纹理空间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35723318/