视口?或相机?视野?旋转iOS设备上的更改

时间:2019-08-28 19:06:31

标签: swift 3d camera scenekit viewport

在我的应用中,我使用SceneKit视图拥有3d世界。

我需要支持所有iOS设备和方向。

我不了解3D数学,矩阵,也不了解照相机和其他东西,但是我已经建立了3D世界,并且我拥有一台能正常工作的照相机,并且用“摇摄”手势绕着世界中心的一个物体运行。

我的问题是,当我将设备从纵向旋转到横向时,SceneKit视图会自动更改其视角(不确定(相机或世界本身))或看起来很近的对象,现在又回到了远方。

我想发生的是,无论旋转“视口”如何?或相机?还是世界角度?保持相同,并且相机与物体的距离不会“看起来”不同,即,物体在视觉上停留在同一位置。

我没有做任何矩阵操作或设置任何复杂的东西。

我知道SceneKit的单位是米,因此我的对象的尺寸正确,并且相机距离它正确的米数...看起来“正确”

我不明白的是为什么所有景观都会发生变化。

是的,SceneKit视图使用AutoLayout约束来拥抱屏幕的边缘。

这是我的相机设置:

private func setupCamera() -> SCNNode {
    let camera = SCNCamera()
    camera.usesOrthographicProjection = false
    camera.orthographicScale          = 9
    camera.zNear                      = 0.01
    camera.zFar                       = 9500
    camera.focalLength                = 50
    camera.focusDistance              = 33
    camera.fieldOfView                = 100
    let cameraNode                    = SCNNode()
    cameraNode.position               = SCNVector3(x:0, y:0, z: 500.0)
    cameraNode.camera                 = camera
    self.cameraNode                   = cameraNode
    let cameraOrbit                   = SCNNode()

    cameraOrbit.addChildNode(self.cameraNode!)

    return cameraOrbit
}

我发现“修复”此问题的唯一方法是使SceneKit视图始终为正方形和大小,以使其始终是设备宽度或高度中最大的设备,并将其中心保持在屏幕中心。

但是这种方法不适用于应用程序的其他部分,因此我知道我需要“适当地”执行此操作。

所以有人请提供代码或告诉我我需要了解的内容,以便在设备旋转时调用的功能(即override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)中,我可以纠正此自动更改并保持视图的“视角”相同。

谢谢。

2 个答案:

答案 0 :(得分:0)

经过4天的约束后,手动移动框架和各种东西,我已将其修复。

我用0个常量将scenekitview约束为superview,所以它始终是屏幕的大小。

然后我要做的就是一线...叹气。

我只需要将'sensorHeight'减半,然后就可以正常工作了。

https://stackoverflow.com/questions/30649257/partial-view-in-kendo-grid-column

编辑:

由于屏幕尺寸的限制,默认的“视野”意味着您具有鱼眼效果。

将FoV降到将近一半可以治愈,现在物体旋转而不会变形:

if UIDevice.current.orientation == .landscapeLeft  || 
   UIDevice.current.orientation == .landscapeRight
{
    self.cameraNode?.camera?.sensorHeight  = 12
}
else
{
    self.cameraNode?.camera?.sensorHeight  = 24
}

答案 1 :(得分:0)

从 ios11 开始,您还可以告诉 Scenekit 使用哪个投影。

这为我解决了这个问题,并且与纵横比无关。

from playsound import playsound
playsound('/audio.wav')