Ami*_*fer 0 opengl math graphics projection
我正在使用openGL,但这基本上是一个数学问题.我正在尝试计算投影矩阵,我在视图平面R(x,y,z)上有一个点和该平面N的法线向量(n1,n2,n3).我也知道眼睛在(0,0,0),我猜在技术术语中它是透视参考点.如何从这些数据中获得透视投影?我知道如何以常规方式进行FOV,纵横比以及近距离和远距离飞行.
我认为你把这个问题放在"opengl"标签下会引起一些混乱.问题在于,在计算机图形学中,术语投影不是严格意义上的数学意义.
在数学中,定义了一个投影(并且以下不是确切的数学定义,而只是我自己的释义)作为在应用两次时不会进一步改变结果的东西.想一想.当您将3d空间中的点投影到2d平面(仍然在该3d空间中)时,每个点的投影将最终在该平面上.但是已经在这个平面上的点数根本不再移动,所以你可以根据需要多次应用它,而不会进一步改变结果.
计算机图形学中的经典"投影"矩阵不能做到这一点.他们transfrom在一般的视锥被映射到一个立方体(或长方体)的方式的空间.为此,您基本上需要所有参数来描述平截头体,其通常是纵横比,视角,与近平面和远平面的距离,以及投影方向和中心点(后两者通常是隐含的)按惯例定义).对于一般情况,还有水平和垂直不对称组件(想象它像投影仪的"镜头移位").所有这些都是计算机图形学中典型的投影矩阵所代表的.
从你给出的参数构造这样的矩阵是不可能的,因为你缺少很多参数.而且 - 我认为这有点透露 - 你给了一个观景机.但到目前为止讨论的投影矩阵并没有定义一个视平面 - 任何平行于近或远平面并且在摄像机前面的平面都可以想象为观察平面(在摄像机后面也可以工作,但图像会被镜像) ),如果你需要一个.但从严格意义上讲,如果所有投影点也最终都在那个平面上,那么它只会是一个"视平面" - 计算机图形透视矩阵显然不会这样做.它改为保持它们的三维距离信息 - 这也意味着操作是可逆的,而经典的数学投影通常不是.
从所有这些,我只是猜测你正在寻找的是从3D空间到2D平面的透视投影,而不是用于计算机图形的透视变换.您需要的所有参数只是视点和平面.请注意,这正是您所拥有的:投影中心应为原点R并N定义平面.
这种投影也可以用4×4同质矩阵表示.在你的问题中有一件事没有定义:正常的方向.我再次假设标准数学约定并假设视图平面定义为<N,x> + d = 0.从使用R那个等式,我们可以得到d = -N_x*R_x - N_y*R_y - N_z*R_z.所以投影矩阵就是
( 1 0 0 0 )
( 0 1 0 0 )
( 0 0 1 0 )
(-N_x/d -N_y/d -N_z/d 0 )
Run Code Online (Sandbox Code Playgroud)
这个矩阵有一些属性.有一个零列,所以它不可逆.还要注意的是,对于(s*x, s*y, s*z, 1)你应用它的每一个点,结果(w当然,在得到除法之后)都是相同的s- 无论是什么- 因此原点之间的线上的每个点(x,y,z)都将产生相同的投影点 -这是透视投影应该做的事情.最后请注意w=(N_x*x + N_y*y + N_z*z)/-d,因此,对于满足上述平面方程的每个点,w= -d/-d = 1都会产生.与其他维度的身份变换相结合,这意味着这一点不变.