获取对象 Space 到纹理 Space 的切线

Getting the Tangent for a Object Space to Texture Space

一项大学作业要求我使用顶点坐标,我必须根据法线值计算法线和切线,以便我可以创建对象 Space 到纹理 Space 矩阵。

我有制作矩阵和副法线所需的代码,但我没有计算正切的代码。我试图在网上查看,但答案通常让我感到困惑。你能给我解释清楚它是如何工作的吗?

编辑:我已经更正了我之前写的内容,因为很明显我误解了作业。谢谢大家帮我看看。

数学意义上的切线是 属性 几何对象的切线,而不是法线贴图的切线。在法线贴图的情况下,我们还要寻找一个非常具体的切线(每个点都有无限多条,基本上法线定义的平面中的每个向量都是切线)。

但让我们退后一步:我们想要一个 space,其中纹理的 u 方向映射到切线方向,v 方向映射到 bitangent/binormal 和向上 -法线贴图的矢量到对象的法线。因此,具有 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/)