【发布时间】:2017-08-12 01:42:38
【问题描述】:
我目前正在为我的项目开发自己的 2D 数学库,以提高我对底层矩阵数学的理解。 过去我使用过诸如 GLM 之类的库,但我觉得它可能值得作为一种学习体验来研究。
其中大部分都很简单,我的大多数数学课程都与 OpenGL 集成并运行良好,但是我的视图矩阵似乎在窗口边缘拉伸了我的四边形。
请注意,这不是透视问题,我不仅使用正交矩阵,而且我已将其与 MVP 分开,使用视图矩阵代替 MVP,问题仍然存在。
下面是我的视图矩阵生成代码:
Matrix4x4 GenerateView(const Vector2f &cameraPosition)
{
Matrix4x4 mat;
//Right
mat.elements[0][0] = 1;
mat.elements[0][1] = 0;
mat.elements[0][2] = 0;
mat.elements[0][3] = -Dot(cameraPosition.x, cameraPosition.y, 10, 1, 0, 0);
//Up
mat.elements[1][0] = 0;
mat.elements[1][1] = 1;
mat.elements[1][2] = 0;
mat.elements[1][3] = -Dot(cameraPosition.x, cameraPosition.y, 10, 0, 1, 0);
//Look
mat.elements[2][0] = cameraPosition.x;
mat.elements[2][1] = cameraPosition.y;
mat.elements[2][2] = -1;
mat.elements[2][3] = -Dot(cameraPosition.x, cameraPosition.y, 10, cameraPosition.x, cameraPosition.y, -1);
//Last Column
mat.elements[3][0] = 0;
mat.elements[3][1] = 0;
mat.elements[3][2] = 0;
mat.elements[3][3] = 1;
return mat;
}
矩阵主要是列(如果我理解正确的话)。 我不清楚“看”是否指的是前向单位向量,所以我尝试了它以及“中心”,但问题仍然存在。
//Look
mat.elements[2][0] = 0;
mat.elements[2][1] = 0;
mat.elements[2][2] = -1;
mat.elements[2][3] = -Dot(cameraPosition.x, cameraPosition.y, 10, 0, 0, -1);
最后,万一有人怀疑 Dot 产品的实现不正确:
float Dot(float x1, float y1, float z1, float x2, float y2, float z2)
{
return x1 * x2 + y1 * y2 + z1 * z2;
}
【问题讨论】:
标签: c++ opengl matrix coordinate-transformation