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