我正在使用SceneKit。我已创建并将自己的相机分配给场景,我已调整其xFov和yFov。当我设置一个高于50的值时,会出现一些失真。屏幕边缘附近的一切都被拉伸 - 几乎就像相机突然变成了“鱼眼”。
我需要xFov和yFov超过50(我实际上需要它为100),但我不能有这种失真。我该怎么办?
答案 0 :(得分:3)
你问的问题本身在理论上是不可能的,但理论上至少是有趣的。
当您增加视野时,物理相机会发生什么?它越广泛,鱼眼越多"它看起来。像SceneKit这样的3D图形管道的投影矩阵和透视分割以类似的方式工作。它看起来有点不同,因为它是一个直线变换,而不是球面镜头的效果,但它是相同的一般想法 - 它映射了一个体积(称为平截头体)的3D空间"见过" #34;通过相机进入观察平面。这是3D图形的一般方面,而不是SceneKit特有的,所以你可以找到很多good tutorials很好地覆盖underlying math。
该平截头体投影修正了某个视角占据的视角与视平面上的宽度之间的某种关系。您无法真正改变这种关系,并且仍然具有线性(良好,合理,但主要是线性)变换,3D硬件可以应用单个矩阵乘法(和透视分割)。
理论上,您可以定义一种不同的关系 - 例如,一个大角度大小对应于视图中心附近的视图平面的更大部分,但是距离中心更远的一个更小的部分。但你不能在相机变换中这样做......你必须在some kind of post-processing shader中逐个像素地进行这样的计算。 (事实上,这通常是rendering for the lenses of a VR headset的工作方式。)