正交投影中的相机位置

问题描述

我正在尝试了解如何通过 usesOrthographicProjection = true 使用相机。我需要进行设置,以便当我们第一次看到场景时,对象应该是完整可见的。

我使用了 Xcode 的 SceneKit 模板,对相机进行了一些调整(所有代码都在 viewDidLoad 中)。使用认 相机(透视投影),看起来像这样:

cameraNode.position = SCNVector3(x: 0,y: 0,z: ship.boundingBox.max.z + 20)

enter image description here

接下来,我尝试设置正交投影,现在看起来像这样:

cameraNode.camera?.usesOrthographicProjection = true
cameraNode.position = SCNVector3(x: 0,z: ship.boundingBox.max.z + 20)

enter image description here

无论我如何尝试更改相机位置,它看起来仍然与上图相同。我试过使用 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

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...