伪圆柱投影的投影矩阵

Bla*_*lia 5 projection webgl projection-matrix

想象一下,在一个球体中包含一组混合的3D物体,您的目标是创建整个场景的圆柱形等面积投影.使用OpenGL,你可能想从在后处理着色器旋转的摄像机绕中心轴线,然后校正径向失真缝合在一起的多个渲染目标纹理(4是精确的),因为上投影的平面上,而不是一个圆筒.理想情况下,你能够通过球的整个体积扫相机的平截头体,没有任何重叠,并且使得每个渲染填充矩形纹理的整个像素的空间(如圆柱形突起做).

因此,为了清楚起见,这里是球形场景(其中包含对象)的可视化,以及围绕Y轴跨越PI/2的相机平截头体. 圆柱投影相机视锥的可视化

请注意,"远"平面缩小为一条直线,该直线与球体的Y轴共线.在平截头体的外表面上形成"X"的白色相交线表示相机的原点,或者在眼睛空间中的(0,0,0).该外表面也是"近"平面,距离相机0 Z单位.

这个想法是,球体的中心轴项目光线向外,使得所有的光线行进平行于Y平面(即,具有正常的平面(0,1,0)),并且每个射线从球体发出的原点相交的球体的表面在垂直角度.

我的问题:

天真地,我认为OpenGL投影矩阵可以做到这一点 - 据我所知,我在这里的预测是线性的,因此可能吗?但是,我似乎无法正确解决方程式:

让我们s成为球体的半径.

因此,在眼睛空间,从相机的起源:
  • 近平面的左右边缘分别位于X轴-ssX轴的单位
  • 近平面的顶部和底部边缘分别位于Y轴s-sY轴的单位
  • 远平面的左右边缘共同位于-s沿Z轴的单位(请记住,在眼睛空间中,Z值在相机前面是负的)
在OpenGL投影矩阵中:
  • -w_c < x_c < w_c
  • x_n = x_c / w_c

由于左右平截头体平面汇聚在相机前面,我解决了一个方程式,将我的输入映射到它们的预期输出,并得出结论:
  • x_n = x_e / (z_e + s)
这意味着x_c = x_ew_c = z_e + s.这在我的投影矩阵上填充了两行:

是啊


---------- 这就是我被卡住的地方 ----------

很明显,y_n它不依赖于x_e或根本不存在z_e,它的等式应该是:
  • y_n = y_e / s
这类似于正交投影.然而,这引入了与w_c我已经在x_n等式中解决的冲突.

我通过本文中的步骤推导出我的投影矩阵,它简洁地解释了OpenGL的透视和正交投影矩阵的推导.

似乎是我可能碰到了线性变换的极限?如果这确实是非线性的,那么我不明白为什么,并会欣赏一个解释:)

BDL*_*BDL 2

由于您的投影需要y = sin(phi)映射是非线性的。

理论上,使用 4x4 矩阵(连同齐次坐标),您可以描述仿射变换,它比线性变换更具表现力。仿射变换的形式a * x + b为,a 和 x 是向量,b 是标量值。没有办法用它来表达三角函数。