问题描述
我正在尝试了解如何通过 usesOrthographicProjection = true
使用相机。我需要进行设置,以便当我们第一次看到场景时,对象应该是完整可见的。
我使用了 Xcode 的 SceneKit 模板,对相机进行了一些调整(所有代码都在 viewDidLoad
中)。使用默认
相机(透视投影),看起来像这样:
cameraNode.position = SCNVector3(x: 0,y: 0,z: ship.boundingBox.max.z + 20)
接下来,我尝试设置正交投影,现在看起来像这样:
cameraNode.camera?.usesOrthographicProjection = true
cameraNode.position = SCNVector3(x: 0,z: ship.boundingBox.max.z + 20)
无论我如何尝试更改相机位置,它看起来仍然与上图相同。我试过使用 GLKMatrix4MakeOrtho
无济于事。什么都行不通。我应该怎么做才能改变第一次观看?
cameraNode.camera?.usesOrthographicProjection = true
// let width = Float(UIScreen.main.bounds.size.width)
// let width: Float = 9
// let glMat = GLKMatrix4MakeOrtho(-width/2,// width/2,// -width/2,// 1,// 1000)
// let glMat = GLKMatrix4MakeOrtho(ship.boundingBox.min.x,// ship.boundingBox.max.x,// ship.boundingBox.min.y,// ship.boundingBox.max.y,// ship.boundingBox.min.z,// ship.boundingBox.max.z)
// cameraNode.camera?.projectionTransform = SCNMatrix4FromGLKMatrix4(glMat)
cameraNode.position = SCNVector3(x: 0,z: ship.boundingBox.max.z + 20)
解决方法
在使用正交投影时,使用 orthographicScale
实例属性来控制相机的放大倍数。
var orthographicScale: Double { get set }
这是完整的代码版本:
import SceneKit
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let sceneView = self.view as! SCNView
sceneView.scene = SCNScene(named: "art.scnassets/ship.scn")!
sceneView.allowsCameraControl = true
sceneView.backgroundColor = UIColor.black
sceneView.pointOfView?.camera!.usesOrthographicProjection = true
sceneView.pointOfView?.camera!.zNear = 0.1
sceneView.pointOfView?.camera!.zFar = 50.0
sceneView.pointOfView?.camera!.orthographicScale = 5.0
}
}
正交投影是一种在二维中表示三维对象的方法。所以在 Z 中没有距离,因为我们是二维的。这就是您必须使用 orthographicScale
属性的原因。无论您如何移动平行投影光束的相机,与物体的距离都将保持不变。
因此,请考虑:在正交投影中,大小相同的对象看起来大小相同,而与它们与相机的距离无关。
控制二维空间中“距离”的唯一参数(二维空间中实际上没有 Z position
)是 orthographicScale
。