在TBN矩阵中,法向量、切线向量和副切线向量是否总是垂直的?

5
这与另一个问题中描述的问题有关(图片在此):Opengl shader problems - weird light reflection artifacts 我有一个.obj导入程序,它创建了一个数据结构并计算切线和副切线。这是我的对象中第一个三角形的数据: Data Structure 我对切线空间的理解是,法线从顶点向外指向,切线垂直(正交?)于法向量,并朝着纹理中S轴的正方向指向,而副切线则垂直于两者。但我不确定应该如何称呼它,我认为这3个向量形成了旋转或变换后的x、y、z轴,它们不会是3个随意定向的向量,对吧?
此外,我的理解是:法线贴图中的法线提供一个新的法向量。但在切线空间纹理映射中,RGB编码的法向量与每个顶点的法向量之间没有内置的方向。因此,您需要使用TBN矩阵来弥合差距并将它们放在相同的空间中(或以正确的空间获得光照)。
但后来我看到了对象数据...我的结构有270个顶点,它们都有0的切向量Y值。这对于切向数据来说正确吗?它们是在像顶点法线空间之类的空间中吗?还是它们看起来完全错误?或者我对其工作原理的理解有误,我的数据是正确的?
要更接近解决我在其他问题中的问题,我需要确保我的数据正确,并了解切线空间光照数学的工作原理。

根据定义,这3个向量是垂直的。当然,由于各种原因它们可能不垂直,但这将导致一个扭曲/变形的纹理空间。 - Damon
那么你的意见是我的正切数据有误吗? - badweasel
1
切线和法线相同看起来像是有问题(至少非常不寻常)。这基本上意味着你得到的任何纹理样本都在由切向量定义的直线上。这看起来非常奇怪。 - Damon
Y的所有零使它们都成为真正的二维向量。那么切向量通常在哪个空间中?“切空间”但这是什么意思?纹理图像空间?它们不应该在三角形所代表的平面内,即纹理被映射到的平面内吗?我想我必须自己重新计算它们并看看它们如何比较。 - badweasel
1个回答

10
切线和副切线向纹理坐标的S和T分量方向指向。对于不熟悉OpenGL术语的人来说,切线向量指向S,副切线向量指向T。
所以,是的,它们不一定要与法线或彼此正交。它们遵循纹理映射的方向。事实上,这就是它们的目的:允许您将法线从模型空间转换为纹理空间。它们定义了从模型空间到纹理空间的映射。
如果顶点处的S和T分量正交,切线和副切线将彼此正交。也就是说,如果纹理映射没有剪切。虽然大多数纹理映射算法会尽量减少剪切,但并不是所有情况下都能消除剪切。在这些情况下,准确的矩阵将在剪切位置包含非正交的切线和副切线。

@badweasel:我无法控制这个程序生成的内容;我只能告诉你正确答案应该是什么。你需要查看你的数据,看看是否符合你得到的结果。 - Nicol Bolas
@badweasel:“切线是在二维纹理的空间/坐标系中,还是在由三角形创建的平面中?” 它都不是。切线与法线处于同一空间中,通常是模型空间。切线指向S纹理坐标分量移动的方向。 - Nicol Bolas
2
换句话说,在计算顶点处的切线向量时,通常会使用在纹理空间和模型空间中表示相邻边的向量,以将一个空间映射到另一个空间。这里有一篇很好的文章:http://www.terathon.com/code/tangent.html - JasonD
@badweasel: "那为什么不根据t和s的方向计算bitan呢?" 给定的网站正是这样做的;它在页面顶部的数学部分中。后面还说:“切向量彼此垂直或与法向量垂直并不一定成立[...]然而,可以安全地假设这三个向量至少接近于正交”。最后一部分的准确性取决于你的网格。 - Nicol Bolas
@NicolBolas:您在此处的评论应该包含在您的答案中,因为它可能对许多人有帮助。你还应该在你的答案中加入另一件事:如果不使用叉乘,如何计算“正确”的双切线?是否只需交换 此页面 中的S和T,并将重新计算的“切线”视为双切线就可以了? - Peter O.
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接