首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有什么方法可以改变场景套件相机的主要点吗?

有什么方法可以改变场景套件相机的主要点吗?
EN

Stack Overflow用户
提问于 2021-07-05 16:21:53
回答 2查看 134关注 0票数 0

我想模拟一个倾斜移位/透视控制镜头在场景套件在MacOS上的移动。

假设用户在地面上有一个高楼的摄像头,我希望能够将镜头移开,这样投影失真就会发生变化(例如,维基百科)。

苹果为SCNCamera提供了大量基于物理的参数(传感器高度,孔径叶片计数),但我看不出有什么明显的变化。它似乎存在于统一中。

关键的是,我想把镜头移开,这样物体相对于照相机就能保持在相同的位置。显然,我可以移动相机以获得效果,但是对象需要保持在视口的中心(而且我也看不到修改视口的方法)。我试图直接修改.projectionTransform矩阵,但没有成功。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-06 16:39:27

我终于想出了投影矩阵的正确调整--遵循数学是相当混乱的,因为它是一个4x4矩阵,而不是普通相机投影矩阵所使用的3x4或4x3,这使得计算出它是期望行向量还是列向量特别令人困惑。

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

代码语言:javascript
复制
let camera = SCNNode()
camera.camera = SCNCamera()

let yShift: CGFloat = 1.0

camera.camera!.projectionTransform.m32 = yShift

.m31大概会在x轴上移动,但我必须承认,我还没有测试过这个。

当我再想一想的时候,我也意识到我真正想要的效果也包括移动相机。调整.m32模拟移动传感器,这将似乎移动的对象相对于相机,就像你有一个广角镜头,你在移动的作物。为了保持主体中心的框架,你需要移动相机的位置也。

这篇博客文章 (特别是这段代码 )的一点(大量)帮助下,我也实现了这一点:

代码语言:javascript
复制
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轴的偏移量)

票数 0
EN

Stack Overflow用户

发布于 2021-07-05 17:25:34

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68259301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档