我怀疑我搞砸了我的数学,但我似乎无法弄清楚我哪里出错了。
这是我的场景:
绿色木质平面被定义为一组顶点:
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)}
答案 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);