在我的应用中,我使用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)
中,我可以纠正此自动更改并保持视图的“视角”相同。
谢谢。
答案 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')