【问题标题】:Camera position in orthographic projection正交投影中的相机位置
【发布时间】:2021-04-06 17:29:22
【问题描述】:

我正在尝试了解如何将相机与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 吗?在这里阅读 - developer.apple.com/documentation/scenekit/scncamera/…
  • @BlindNinja 谢谢,似乎设置orthographicScale 有效。但是我不知道它是如何工作的,因为文档不详细。我会努力争取更多结果。
  • 我不是 100% 确定,但它就像焦距一样工作。你只是设置它的位置,但它应该覆盖多少区域,这是未知的。您会看到相同尺寸和位置的广角镜头与普通镜头的投影不同。
  • 好的,因为orthographicScale 有效,我仍然无法完全控制相机位置。就像,我想将相机位置设置在上方和右侧稍高的位置(第一视角对角线),这与我预期的不一样。仍然需要帮助。

标签: swift camera scenekit glkit orthographic


【解决方案1】:

在使用正交投影时,使用 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

【讨论】:

  • 仍然无法正确控制相机的位置。例如,我想将相机设置在船的右上方(x = 2,y = 10)的位置,然后使用SCNLookAtConstraint 不断观察船。我不明白使用正交时相机的位置是如何工作的。
猜你喜欢
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多