SceneKit 相机在不应该显示额外的 space
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% 的白色 space。为什么?我需要如何调整 camera/box 才能完全覆盖屏幕宽度?
好的,所以你有两个选择。
- 你可以作弊,这很容易但不是很方便
- 因此随机增加框的大小或将其移近相机
- 按照应有的方式使其具有适应性,但会更难
- 因此看看
.projectPoint()
和 .unprojectPoint()
[因为我无法弄清楚我不能给你任何代码,你可以试试你的运气]
希望对您有所帮助:)
编辑
仅供参考 - 我不认为你的问题与相机有关,如果你将框的大小设置为 0.5
而不是 1
那么它实际上更小,这表明它不是基于相机的错误.
此外,如果您 运行 在 iPhone 6+ 以外的设备上使用该应用程序,您将看到框 确实 至少在右侧填满了屏幕边.
以下是代码功能的快速直观表示(从顶部查看):
1) 在 (0,0,0)
处创建一个 2x2x2 立方体
2) 将立方体移动到(0,0,-1)
3) 在 (0,0,0) 添加摄像头
如您所见,Camera 与立方体相交。这是一种不可预测的行为,它可以在 Z 上相交,战斗,或者只是向内看。
在你的问题中你使用了一个 1x1x1 的盒子。这是它的样子:
如您所见,框应该填满视图。但那是因为我使用了标准相机(36 毫米,或大约 50° xfov)。通过在你的场景中四处移动,我意识到你有一个非常大的 FOV,这意味着你的场景看起来完全像这样:
或者,如果我们放大:
我们来了!那么我们如何解决这个问题呢?通过增加 FOV。在我们的例子中,角度是 90。但是你可以用简单的三角函数再次找到它。
现在盒子完全填满了视口!
更新
我已将项目上传到 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% 的白色 space。为什么?我需要如何调整 camera/box 才能完全覆盖屏幕宽度?
好的,所以你有两个选择。
- 你可以作弊,这很容易但不是很方便
- 因此随机增加框的大小或将其移近相机
- 按照应有的方式使其具有适应性,但会更难
- 因此看看
.projectPoint()
和.unprojectPoint()
[因为我无法弄清楚我不能给你任何代码,你可以试试你的运气]
- 因此看看
希望对您有所帮助:)
编辑
仅供参考 - 我不认为你的问题与相机有关,如果你将框的大小设置为 0.5
而不是 1
那么它实际上更小,这表明它不是基于相机的错误.
此外,如果您 运行 在 iPhone 6+ 以外的设备上使用该应用程序,您将看到框 确实 至少在右侧填满了屏幕边.
以下是代码功能的快速直观表示(从顶部查看):
1) 在 (0,0,0)
处创建一个 2x2x2 立方体2) 将立方体移动到(0,0,-1)
3) 在 (0,0,0) 添加摄像头
如您所见,Camera 与立方体相交。这是一种不可预测的行为,它可以在 Z 上相交,战斗,或者只是向内看。
在你的问题中你使用了一个 1x1x1 的盒子。这是它的样子:
如您所见,框应该填满视图。但那是因为我使用了标准相机(36 毫米,或大约 50° xfov)。通过在你的场景中四处移动,我意识到你有一个非常大的 FOV,这意味着你的场景看起来完全像这样:
或者,如果我们放大:
我们来了!那么我们如何解决这个问题呢?通过增加 FOV。在我们的例子中,角度是 90。但是你可以用简单的三角函数再次找到它。
现在盒子完全填满了视口!