在球体变形为椭圆形后重新计算法线和阴影线

时间:2015-04-21 10:33:05

标签: opengl 3d linear-algebra normals

我从一个正常的球体开始,我需要变形成椭圆形的形状。我通过拉伸一个轴来实现这一点,在我的代码中它将是 y 轴。

mat4 ToOvalMat = mat4(vec4(1., 0., 0., 0.),
                      vec4(0., 1.5, 0., 0.),
                      vec4(0., 0., 1., 0.),
                      vec4(0., 0., 0., 1.));

我将它拉伸1.5乘以一个名为a的输入。它适用于我的意图,但我仍然需要找到一个很好的方法来修正法线并获得适当的阴影,因为它们仍然与原始球体相关联。

在Google上寻找答案之后,我在GPU Gems - Deformers上遇到了与法线相关的问题,但我并不完全理解所解释的概念。雅可比矩阵似乎能够解决我的法线问题,但我不太确定并希望得到关于我的计算的某种帮助或反馈,因为在给定的测试程序中很难看到渲染。

由于我在 y 维度中伸展,因此我有一个大小为4的正常单位矩阵,我只需用 1.5a 替换 y 1 EM>。如果我理解正确的话,那将是我的雅可比矩阵。 反转然后转置这个矩阵将是我将我的法线乘以的。我还可以在我的 ShadowMatrix 上使用它吗?

Normal = (transpose(inverse(ToOvalMat)) * vec4(VertexNormal, 0.)).xyz;
Normal = normalize((ViewMatrix * WorldMatrix * vec4(Normal, 0.)).xyz);

我正在通过这些计算获得一些文物,并且它们并不是完全可靠的销售给我,这让我觉得我的矩阵或某些东西已经消失了。而且我完全猜到了ShadowMatrix,因为我还没有充分研究它,因为直到现在我一直被困在法线上。

1 个答案:

答案 0 :(得分:0)

我不确定阴影矩阵部分。对于法线,计算顶点着色器中的反转/转置是非常浪费的。这意味着可能为每个顶点计算矩阵。如果你幸运的话可能会被优化掉,但我自己也不会指望它。

更清洁的方法IMHO是将单独的正常变换矩阵传递到着色器,并使用它来变换法线。这可以是3x3矩阵(有关更多背景,请参阅我的答案:OpenGL ES 2.0 an Android: What dimensions should the normalMatrix have?)。

然后,您将在CPU上自己的代码中计算反转/转置。对于非均匀缩放,逆是缩放矩阵,其包含缩放因子的倒数,并且转置它不做任何事情。以你的例子:

mat3 ToOvalNormalMat = mat3(vec3(1.0f, 0.0f, 0.0f),
                            vec3(0.0f, 1.0f / 1.5f, 0.0f),
                            vec3(0.0f, 0.0f, 1.0f));

有关如何计算非均匀缩放的常规矩阵的详细信息,请参阅normal matrix for non uniform scaling