我正在尝试对各种 3D 结构进行简单的透视投影,定义为多个 3D 多边形(不同的 z),每个多边形都包含多个点。该结构将由我定义的许多不同的相机查看。这些相机是通过将世界相机(眼睛)放置在我的世界坐标中的(0,0,z),look(0,0,0)和up(0,1,0)并将世界轴旋转alpha(约 x 轴)、beta(约 y)和 gamma(约 z),从而为该特定相机创建我的局部坐标系。[我意识到我可以使用 OpenGL 来做到这一点,但我想自己尝试并理解它,而不是使用黑匣子]
我的全局相机的基础是使用向量 u,v 和 w 定义的,其中 w=(eye-look).normalised =(0,0,1); u=up.cross(w)=(1,0,0) 和 v=w.cross(u)=(0,1,0)
我正在使用齐次坐标,因此 u_dashed、v_dashed、w_dashed 的变换矩阵如下所示:
T(px,py,pz) = [1,0,0,px;0,1,0,py;0,0,1,pz;0,0,0,1] 和 R = [u,0; v,0;w,0;0,0,0,1]
所以把它放在一起我得到
Tr=T(eye-look) x R' x R_zyx x R x T(-(eye-look)) 其中 R' 是 R 的转置,R_zyx 是组合的前向旋转矩阵(世界 => 局部坐标)我然后将正交投影矩阵 (O) 与透视变换矩阵 (P) ( http://www.cs.uu.nl/docs/vakken/gr/Slides/06-projection.pdf ) 相乘以确定组合变换:
C=O x P x Tr
最后 proj=(C x 4Dpoint) 并进行透视划分,即 (proj.x/proj.w, proj.y,pro.w)
或者我会更好地确定每个相机的坐标,即 R_zyx x [0;0;z;1] 和 u,v 和 w 通过 Rzyx x [ux,vx,wx,0;uy,vy,wy,0; uz,vz,wz,0;0,0,0,0]?