在C++中粘贴实现视图和投影矩阵

在C++中粘贴实现视图和投影矩阵,c++,matrix,graphics,camera,render,C++,Matrix,Graphics,Camera,Render,朋友们。关于计算机图形学中的矩阵有很多问题,但是我还没有找到答案。我对视图和投影矩阵实现中的一些值感到非常困惑。我在C++中使用CPU渲染来更清楚地理解它是如何工作的。 如果我错了,请纠正我:如果我使用模型自己的点和面渲染模型,这就是模型空间。如果我做一个变换矩阵,它由平移、旋转和缩放组成,并通过它传递模型值,我得到世界空间,对吗 如果我做一个视图矩阵,将世界空间中的点乘以它,我们就得到了一个视图空间,我假设这意味着我们将从摄像机的位置看到物体,并且只有当摄像机面对那个物体时,我们才能看到物体,

朋友们。关于计算机图形学中的矩阵有很多问题,但是我还没有找到答案。我对视图和投影矩阵实现中的一些值感到非常困惑。我在C++中使用CPU渲染来更清楚地理解它是如何工作的。 如果我错了,请纠正我:如果我使用模型自己的点和面渲染模型,这就是模型空间。如果我做一个变换矩阵,它由平移、旋转和缩放组成,并通过它传递模型值,我得到世界空间,对吗

如果我做一个视图矩阵,将世界空间中的点乘以它,我们就得到了一个视图空间,我假设这意味着我们将从摄像机的位置看到物体,并且只有当摄像机面对那个物体时,我们才能看到物体,对吗

问题1:如果上面的一切都是正确的,那么为什么当我增加视图矩阵眼睛的Y时,相机不会上升?相反,物体上升。我已经实现了逆矩阵。它工作正常,我在这里检查了视图矩阵的代码

Vertex eye = Vertex(0.0f, 0.0f, 1.0f);
Vertex reference = Vertex(0.0f, 0.0f, 0.0f);
Vertex up = Vertex(0.0f, 1.0f, 0.0f);

Vertex view = eye - reference;
Vertex::Normalise(view);

Vertex::Normalise(up);

Vertex right = Vertex::CrossProduct(up, view);
Vertex::Normalise(right);

float tempMatrix[4][4];
tempMatrix[0][0] = right.x;
tempMatrix[0][1] = right.y;
tempMatrix[0][2] = right.z;
tempMatrix[0][3] = eye.x;

tempMatrix[1][0] = up.x;
tempMatrix[1][1] = up.y;
tempMatrix[1][2] = up.z;
tempMatrix[1][3] = eye.y;

tempMatrix[2][0] = view.x;
tempMatrix[2][1] = view.y;
tempMatrix[2][2] = view.z;
tempMatrix[2][3] = eye.z;

tempMatrix[3][0] = 0.0f;
tempMatrix[3][1] = 0.0f;
tempMatrix[3][2] = 0.0f;
tempMatrix[3][3] = 1.0f;

CalculateMatrixInverse(tempMatrix, viewMatrix);
顺便说一下,at是0,0,0。当我规范化向量时,它也能正确地进行,我也在Wolfram Alpha中检查了这一点。然而,我还有一个问题:当向量归一化时,应该考虑W分量吗?我不这么做,用x,y,z来表示

另一个问题:在我将点与视图矩阵相乘之后,我是否将得到的点与投影矩阵相乘重要吗?问题是我已经实现了透视投影矩阵,但是在解决这些问题之后,我将讨论很多显示问题。所以,如果我没有应用投影矩阵,这个简单的矩阵看起来像是缩放矩阵,所以我认为如果不应用它,我们仍然应该从相机的角度来看,我应该看到相机前面的东西吗?如果是这样,为什么我看不到呢?如果我理解正确的话,眼睛是相机的位置,在它看的地方,对吗?但是,无论使用什么值,更改at值都不会影响图像。提前谢谢

看这里。还要检查是否混合了行和列定向矩阵/运算,还要检查矩阵和向量的乘法顺序是否正确。