我正在使用SceneKit。我已经创建并为场景指定了我自己的相机,并调整了它的xFov和yFov。当我设置一个高于50的值时,就会开始出现一些失真。屏幕边缘的所有东西都被拉伸了——几乎就像相机突然变成了"鱼眼"
我需要xFov和yFov在50以上(我实际上需要它是100),但我不能有那种失真。我该怎么办?
您所问的问题本身在理论上并非不可能,但至少在理论上是有趣的。
当你增加视野时,物理相机会发生什么?它越宽,看起来就越"鱼眼"。像SceneKit这样的3D图形管道的投影矩阵和透视划分以类似的方式工作。它看起来有点不同,因为它是一种直线变换,而不是球面透镜的效果,但它的总体思想是一样的——它将相机"看到"的三维空间的体积(称为截头体)映射到观看平面上。这是3D图形的一个通用方面,而不是SceneKit特有的东西,所以你可以找到很多很好的教程,很好地涵盖了底层数学。
这个截头体投影固定了某个物体在观看平面上所占据的视角大小和宽度之间的某种关系。你不可能真正改变这种关系,但仍然有一个线性(好吧,理性,但大多是线性)变换,3D硬件可以通过单个矩阵乘法(和透视除法)来应用。
理论上,你可以定义一种不同的关系——比如说,一个大的角度大小对应于视图中心附近观察平面的更大部分,但对应于远离中心的更小部分。但你不能在相机变换中做到这一点。。。你必须在某种后处理着色器中逐像素进行这样的计算。(事实上,这通常是VR耳机镜头渲染的工作方式。)