4

为什么在 OpenGL ES 1.x 中缩放(均匀)对象会导致对象更轻?

更有意义的是它会变暗,因为法线不是按比例缩小也会使物体变暗吗?但由于某种原因,物体变得更轻了。当我放大时,物体变得更暗。在我看来,这应该是相反的。

请不要建议使用 GL_NORMALIZE 等。我只是好奇为什么 OpenGL 实现会这样工作。

4

2 回答 2

7

简单的问题,复杂的答案。这是红皮书的相关摘录:

转换法线

法线向量的变换方式与顶点或位置向量不同。在数学上,最好不要将法线向量视为向量,而是将其视为垂直于这些向量的平面。然后,法向量的变换规则由垂直平面的变换规则描述。齐次平面由行向量 (a , b, c, d) 表示,其中 a、b、c 或 d 中的至少一个为非零。如果 q 是非零实数,则 (a, b, c, d) 和 (qa, qb, qc, qd) 表示同一平面。如果 ax+by+cz+dw = 0,则点 (x, y, z, w)T 在平面 (a, b, c, d) 上。(如果 w = 1,这是欧几里得的标准描述平面。)为了让 (a, b, c, d) 表示欧几里得平面,a、b 或 c 中的至少一个必须为非零。如果它们都为零,那么 (0, 0, 0,

如果 p 是齐次平面且 v 是齐次顶点,则语句“v 位于平面 p 上”在数学上写为 pv = 0,其中 pv 是正常矩阵乘法。如果 M 是一个非奇异顶点变换(即具有逆 M-1 的 4 × 4 矩阵),则 pv = 0 等价于 pM-1Mv = 0,因此 Mv 位于平面 pM-1 上。因此,pM-1 是顶点变换 M 下的平面图像。

如果您喜欢将法线向量视为向量而不是垂直于它们的平面,则设 v 和 n 为向量,使得 v 垂直于 n。那么,nTv = 0。因此,对于任意非奇异变换 M,nTM-1Mv = 0,这意味着 nTM-1 是变换后的法向量的转置。因此,变换后的法向量是(M-1)T n 。换句话说,法线向量是通过变换点的变换的逆转置来变换的。哇!

简而言之,位置和法线的变换方式不同。如前文所述,法线变换矩阵为(M-1)T。将 M 缩放到 sM 将导致(M-1)T/s:比例因子越小,转换后的法线越大……我们开始吧!

于 2009-05-26T10:13:59.063 回答
0

看起来法线没有随对象缩放。这意味着全尺寸对象的法线将大大覆盖较小尺寸的对象。这将导致光源和法线之间的角度完全相同,但表面要小得多。

于 2009-05-25T22:47:15.597 回答