为什么我不能向下翻译我的飞机?

时间:2012-01-08 22:58:28

标签: math opengl linear-algebra

我怀疑我搞砸了我的数学,但我似乎无法弄清楚我哪里出错了。

这是我的场景:

绿色木质平面被定义为一组顶点:

    private Vertex[] planeVertices = new[]
        {
            /*0*/new Vertex(-1, 0, 1,  0,0,   0, 1, 0),
            /*1*/new Vertex( 1, 0, 1,  1,0,   0, 1, 0),
            /*2*/new Vertex( 1, 0,-1,  1,1,   0, 1, 0),
            /*3*/new Vertex(-1, 0,-1,  0,1,   0, 1, 0),
        };

Vertex的前3个数字是coords,后者可以忽略。然后我就像这样呈现:

        planeVao.Bind();
        textureSampler.Value = 1;
        modelMatrix.Value = new Matrix4(
            5, 0, 0, 0,
            0, 1, 0, -3,
            0, 0, 5, 0,
            0, 0, 0, 1);
        GL.DrawElements(BeginMode.Triangles, planeIndices.Length,
            DrawElementsType.UnsignedInt, IntPtr.Zero);

在顶点着色器中我得到了:

gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * vec4(Position, 1.0);

modelMatrix.Value赋值应该沿着X和Z轴将平面拉伸5倍(它会做,否则它将与立方体大小相同)然后-3应该是将它向下移动3个单位,但它没有效果。这是我无法弄清楚的部分。

在GLSL中ModelMatrix的值为modelMatrix.Value ...

因此,如果我们取第一个顶点例如(-1,0,0)并将它乘以该矩阵....对于y坐标,我们有[0,1,0,-3] ] T * [-1,0,0,1] =(0 * -1 + 1 * 0 + 0 * 0 + 1 * -3)= -3,不?看起来好像它现在已经零了。


将ModelMatrix更改为此(将右上角替换为T x ,替换为1):

        modelMatrix.Value = new Matrix4(
            5, 0, 0, 1,
            0, 1, 0, -3,
            0, 0, 5, 0,
            0, 0, 0, 1);

有这个效果:

根本看起来不像是翻译......不确定这里发生了什么。


好的,我检查过我的数学没错:

snip [图片略有错误]

这是我预期的结果......现在我想知道我的错误是否在其他地方。


好的视图矩阵是:

{(0.8192319, -0.2529707, 0.5146502, 0)
(0, 0.8974438, 0.4411287, 0)
(-0.5734624, -0.3613867, 0.7352146, 0)
(8.940697E-08, -2.235174E-07, -6.800735, 1)}

投影矩阵是:

{(1.299038, 0, 0, 0)
(0, 1.732051, 0, 0)
(0, 0, -1.020202, -1)
(0, 0, -2.020202, 0)}

2 个答案:

答案 0 :(得分:4)

您正在使用最后一列切换最后一行。视图矩阵在底行有一个平移向量,但你在最后一列创建了你的模型的翻译,它处理了我没有学过很多东西的偏斜/其他一些常见的东西。

只需切换翻译的位置即可。如果你的变换都是均匀的,你也可以采用矩阵的转置来得到相同的结果。

答案 1 :(得分:4)

你是在正确的轨道上,但你的矩阵应该如何转换。这就是为什么当你尝试不同的价值观时,你会发生疯狂的倾斜。 See this.

将翻译向量放在最后一行,而不是最后一列,你会很好。

modelMatrix.Value = new Matrix4(
        5, 0, 0, 0,
        0, 1, 0, 0,
        0, 0, 5, 0,
        0, 0, -3, 1);