我正试图让我的脑袋缠绕在切线的空间里,我开始提出一些问题,我不能问我的同事,因为他们开始不知道我在说什么。我正在尝试在opengl上进行常规映射。我目前的计划是在几何着色器中计算切线 - 比特 - 法线矩阵。
为了回答我自己的问题,一位同事来到#2工作,他想出了一个优雅的证据。
表示这是有道理的,但足以说明这一点。答案 0 :(得分:1)
1)否和是。如果线性插值该矩阵,则生成的矢量仍然是正交的。在起始矩阵和结束矩阵之间的点处,幅度将小于1。您可以通过插入从(1,0,0)到(-1,0,0)的向量来看到这一点,其中某些点的长度实际上为零 - 这是您不应该遇到的情况,但是它显示了长度的变化。
如果行和列是正交单位向量,则它是正交矩阵。当从一个正交矩阵插值到另一个时,中间的矩阵将具有正交的行和列,但不是单位长度。我认为要求是矩阵内的向量都具有相同的长度,但不一定是单位长度。
2)单位向量乘以标准正交矩阵将是单位长度。你真的只是旋转到另一个参考框架。如果矩阵中的向量是正交但不正常,则您的向量将按相同的分数缩小。
3)如果你想用另一个地图替换一个地图,只需使用距观察者的距离函数在这些地图之间进行插值。不幸的是,这会导致矢量缩短(结果不会是单位长度)。
您应该能够插入法线贴图,使用插值矩阵应用结果(不重新规范化),并且只重新归一化最终的合成矢量。
答案 1 :(得分:1)
由于仍然没有完整的答案,我想我还有一个问题:
1)不,不。想象一下三个向量v1
,v2
和v3
,它们是成对正交的并且都是单位长度。当然,-v3
是单位长度,也与v1
和v2
正交。现在想象一下矩阵A=(v1|v2|v3)
和B=(v2|v1|-v3)
。如果你在两者之间进行插值,你将在中间得到C=((v1+v2)/2|(v1+v2)/2|0)
。很容易看出这不会保持长度:(0 0 1)^T
将成为零向量。而且,第一列和第二列将相等,这意味着它们的角度为0°。然而,在实践中,您将要插入的两个矩阵通常对于这种退化通常不会有足够的差异。如果你的表面是可定向的。如果您可以在表面内部和外部定义一致的表面,则表面是可定向的。 moebius-strip是一个常见的反例!
一种稍微更正确的方法是插值旋转(同样,表面需要可定向):你可以使用球面插值(谷歌!)或标准化插值(插值矩阵和正交化,但这也会因一些边缘情况而失败) 。然而,两种插值都很昂贵 - 实际上,人们只是将光源转换为顶点的TBN坐标并使用线性插值(相当于在TBN矩阵上使用线性插值)。
2。)肯定是的。事实上,这适用于任何长度,而不仅仅是一个。正交矩阵诱导同构映射,其保持向量之间的长度和角度。您可以使用这样的矩阵定义的两种转换是旋转和镜像,两者都直观地显示了这一点。
3。)就个人而言,我只是添加两个然后重新规范化。 Mipmapping通常会在距离内冲洗掉法线贴图,因为在平均过程中法线会变短。当然,您可以在mipmapping生成中重新规范化法线,但我会将其保留以防止锯齿并使此效果起作用。除此之外,它基本上是品味(和外观!)你如何结合这两者。说实话,它可能是一种更好的方法,根本不使用细节 - 法线贴图,只使用更高分辨率的纹理。图形硬件有足够的RAM用于现在的简单事情,如果您认为RAM正在成为一个问题,您可以随时传输内容。