有没有一种方法可以改变场景套件相机的主要点



我想在MacOS上的Scene Kit中模拟倾斜移动/透视控制镜头的移动。

想象一下,用户的相机面向地面上的一座高楼,我希望能够移动"镜头",使投影失真发生变化(例如,参见维基百科(。

苹果为SCNCamera提供了很多基于物理的参数(传感器高度、光圈叶片数量(,但我看不出有什么明显的变化。它似乎存在于团结之中。

至关重要的是,我想移动镜头,使物体相对于相机保持在相同的位置。很明显,我可以移动相机来获得效果,但对象需要保持在视口的中心(我也看不到修改视口的方法(。我曾尝试直接修改.projectionTransform矩阵,但没有成功。

谢谢!

SCNCamera上没有现成的API。正如您所猜测的,必须创建一个自定义投影矩阵,并将其设置为projectionTransform属性。

我终于对投影矩阵进行了正确的调整——按照数学计算很令人困惑,因为它是一个4x4矩阵,而不是普通相机投影矩阵所使用的3x4或4x3,这使得计算它是期望行向量还是列向量特别令人困惑。

无论如何,正确的元素是y轴的.m32

let camera = SCNNode()
camera.camera = SCNCamera()
let yShift: CGFloat = 1.0
camera.camera!.projectionTransform.m32 = yShift

假设.m31会在x轴上移动,但我必须承认我还没有测试过。

当我仔细思考时,我也意识到我想要的效果也包括移动相机。调整.m32模拟移动传感器,这将看起来是相对于相机移动主体,就好像你有一个广角镜头,你在移动作物一样。为了使拍摄对象在画面中居中,你还需要移动相机的位置。

在这篇博客文章,特别是这段代码的帮助下,我也实现了这个:

let distance: CGFloat = 1.0 // calculate distance from subject here
let fovRadians = camera.camera!.fieldOfView * CGFloat.pi / 180.0
let yAdjust = tan(fovRadians / 2) * distance * yShift
camera.position = camera.position - camera.worldUp * yAdjust

(任何感兴趣的读者都可能从上面的来源计算出x轴的偏移(

最新更新