Math 摄影机原点通过投影矩阵可见

Math 摄影机原点通过投影矩阵可见,math,opengl,matrix,graphics,camera,Math,Opengl,Matrix,Graphics,Camera,在上面的图像中,我显示了将相机定位在与鼠标覆盖的顶点相同的位置的结果。使用正交矩阵也会得到类似的结果。我的问题是,旋转摄影机时,它会围绕摄影机的可见原点旋转。我想要的是视图像普通FPS相机一样旋转 我认为有用的信息: 我正在手动计算并使用OpenGL渲染到屏幕上 立方体的顶点从{0,0,0}到{1,1,1} 相机定位在{0,0,0} 我的(4x4)矩阵在主列中,我通过统一将单个矩阵上传到着色器并按相同顺序相乘,得到相同的结果 即使在平移摄影机时,移动和旋转也是可以感知的,只是摄影机的原点是可见

在上面的图像中,我显示了将相机定位在与鼠标覆盖的顶点相同的位置的结果。使用正交矩阵也会得到类似的结果。我的问题是,旋转摄影机时,它会围绕摄影机的可见原点旋转。我想要的是视图像普通FPS相机一样旋转

我认为有用的信息:

  • 我正在手动计算并使用OpenGL渲染到屏幕上
  • 立方体的顶点从{0,0,0}到{1,1,1}
  • 相机定位在{0,0,0}
  • 我的(4x4)矩阵在主列中,我通过统一将单个矩阵上传到着色器并按相同顺序相乘,得到相同的结果
  • 即使在平移摄影机时,移动和旋转也是可以感知的,只是摄影机的原点是可见的
这最后一点在数学上对我来说是有意义的,但是,由于近剪裁平面应该稍微在相机前面,我希望鼠标附近的点被剪裁。我知道它没有被剪裁,因为如果我旋转相机向下看立方体(不平移它),剪裁平面大约会在立方体垂直边缘的一半处被剪切

我认为我的困惑可能是因为对透视投影矩阵的数学原理有一个根本性的误解,但也可能是因为我的代码,所以让我包括:

静态内联constexpr自动正交(tl,tr,tb,tt,tn,tf){
返回矩阵x4x4{{(T)2/(r-l),0,0,0},
{0,(T)2/(T-b),0,0},
{0,0,(T)2/(n-f),0},
{(l+r)/(l-r),(b+t)/(b-t),(f+n)/(n-f),1};
}
静态内联constexpr自动透视图(T视野、T方向、T近、T远){
常数tq=(T)1.0/std::tan(0.5*fov),
a=q*相位,
b=(近+远)/(近-远),
c=近*远*2/(近-远);
返回矩阵x4x4{
{q,0,0,0},
{0,a,0,0},
{0,0,b,-1},
{0,0,c,1},
};
}

如果有人需要关于正在发生的事情的额外信息,请在评论中告诉我,我会很高兴地回答问题或对问题进行补充。

阅读评论中提供的链接,并将我的方法与我编写的代码进行比较后,我意识到我在将数学转录到代码中时犯了一个错误。我不小心在透视矩阵最后一列的最后一行中放了一个1,而它应该是一个0

更正后的代码如下所示:

静态内联constexpr自动透视图(T视野、T方向、T近、T远){
常数tq=(T)1.0/std::tan(0.5*fov),
a=q*相位,
b=(近+远)/(近-远),
c=近*远*2/(近-远);
返回矩阵x4x4{
{q,0,0,0},
{0,a,0,0},
{0,0,b,-1},
{0,0,c,0},
};
}

您正在使用一个非常不寻常的投影矩阵,其中投影中心不在眼睛空间原点。所以这要么只是一个bug,要么你的数学不是你想要的。@derhass,人们通常怎么做透视投影矩阵的数学?我发现一些资源使用的矩阵在数学上与此等价,这就是为什么我使用它,然而,我不完全理解它是如何工作的。你有一个你会使用的公式的链接吗?这里的GL已经过时了,但是数学是可靠的,今天和当时一样重要:非常感谢@derhass,我犯了一个愚蠢的错误,并在我的回答中为其他有这个问题的人更正了它。我一定是复制了创建身份矩阵的代码,忘记了更改1!