正交投影中的相机位置

Posted

技术标签:

【中文标题】正交投影中的相机位置【英文标题】: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 有效,我仍然无法完全控制相机位置。就像,我想将相机位置设置在上方和右侧稍高的位置(第一视角对角线),这与我预期的不一样。仍然需要帮助。 更多帮助 - ***.com/a/25674762/2071323 【参考方案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 不断观察船。我不明白使用正交时相机的位置是如何工作的。

以上是关于正交投影中的相机位置的主要内容,如果未能解决你的问题,请参考以下文章

对 SceneKit 中相机的正交投影感到困惑

使用 OpenGL 进行正交投影以及如何实现相机或物体在空间中的移动

在 C++ 中的 OpenGL 中将坐标从 3D 透视投影映射到 2D 正交投影

《Three.js 入门指南》2.3.1- 照相机 - 正交投影demo

使用 GLM 正交投影矩阵将三角形顶点放在错误的位置

Android应用开发 OpenGL ES -- 透视投影 和 正交投影