繁体   English   中英

SceneKit相机不应该显示额外的空间

[英]SceneKit camera shows extra space when it should not

更新

我已将项目上传到GitHub,以便轻松复制问题。

我有一个测试场景,我想在这里定位一个对象(在这种情况下是SCNBox )和屏幕一样宽。 这是整个代码。

let scene = SCNScene()
let rootNode = scene.rootNode

// Box
let boxGeometry = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0)
let boxMaterial = SCNMaterial()
boxMaterial.diffuse.contents = UIColor.redColor()
boxGeometry.firstMaterial = boxMaterial
let boxNode = SCNNode(geometry: boxGeometry)
boxNode.position = SCNVector3(
    x: 0,
    y: 0,
    z: -1)
rootNode.addChildNode(boxNode)

// Camera
let camera = SCNCamera()
camera.zNear = 0
let cameraNode = SCNNode()
cameraNode.position = SCNVector3(
    x: 0,
    y: 0,
    z: 0)
cameraNode.camera = camera
rootNode.addChildNode(cameraNode)

但这并不能产生我所期望的 - 100%宽度覆盖率。 如下面的屏幕截图所示,两侧总共有大约2.5%的空白区域。 为什么? 如何调整相机/盒以实现屏幕宽度的全面覆盖?

问题

这里是您的代码所做的快速直观表示(从顶部查看):

1)在(0,0,0)创建一个2x2x2立方体

创建多维数据集

2)将立方体移动到(0,0,-1)

移动立方体

3)在(0,0,0)添加相机

添加相机

如您所见,相机与立方体相交。 这是一种不可预测的行为,它可以交叉,在Z上战斗,或者只是向内看。

在您的问题中,您使用了1x1x1盒子。 这是它的样子:

1x1x1盒子

如您所见,该框填充视图。 但那是因为我使用的是标准相机(36毫米,或大约50°xfov)。 通过移动你的场景,我意识到你有一个非常大的FOV,这意味着你的场景看起来像这样:

大视野

或者,如果我们放大:

放大

开始了! 那么我们如何解决这个问题呢? 通过增加FOV。 在我们的例子中,角度是90.但你可以用简单的三角法再次找到它。

地狱是的数学!

现在盒子完全填满了视口!

好的,你有两个选择。

  1. 你可以作弊,这很容易,但不是很方便
    • 因此,随机增加盒子的大小或将其移近相机
  2. 尽可能地让它成为适应性的方式
    • 因此看看.projectPoint().unprojectPoint() [因为我很难搞清楚我不能给你任何代码,你可能试试你的运气]

希望有帮助:)

编辑
仅供参考 - 我不认为你的问题与相机有关,如果你将盒子的大小设置为0.5而不是1那么它实际上更小,这表明它不是基于相机的错误。
另外,如果你跑的比iPhone 6+以外的设备上的应用程序,你会看到,箱子填满整个屏幕至少在右侧。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM