坚持在C ++中实现View和Projection Matrices

时间:2014-09-29 07:36:38

标签: c++ matrix graphics camera render

朋友。关于计算机图形学中的矩阵存在很多问题,但是我还没有找到解决方案。我对视图和投影矩阵实现中的一些值非常困惑。我正在使用C ++使用CPU渲染(以更清楚地了解它是如何工作的)。

如果我错了,请纠正我:如果我使用它自己的点和面渲染模型 - 这是模型空间。如果我制作一个由平移,旋转和缩放组成的变换矩阵并通过它传递模型值 - 我得到了世界空间,对吧?

如果我制作一个View矩阵,并将世界空间中的点乘以它,那么我们得到一个视图空间,我假设这意味着我们将从摄像机所在的位置看到该对象,我们将看到仅当相机面向该物体时才对象,对吗?

问题1:如果上面的所有内容都是正确的,那么为什么当我增加视图矩阵的Y值时相机不会上升?相反,对象上升了。我已经实现了逆矩阵。它工作正常,我在这里查看Matrix Inverse Online这是视图矩阵的代码

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);

"在"顺便说一下是0,0,0。当我正常化矢量时,它也正确地执行了,我也在Wolfram Alpha中检查过它。但是我有另一个问题:我应该在规范化向量时考虑w分量吗?我不这样做,只使用x,y,z。

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

0 个答案:

没有答案