正交投影中的相机位置

Camera position in orthographic projection

我正在尝试了解如何通过 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, y: 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, 
//                                    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, 
                                 y: 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 属性。无论您如何移动平行投影光束的相机,到物体的距离都将保持不变。

因此,请考虑:在正交投影中,大小相同的物体看起来大小相同,而不管它们与相机的距离如何

在二维 space 中控制“距离”的唯一参数(在 2D 中实际上没有 Z position)是 orthographicScale