正交投影中的相机位置
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
不断观察船。我不明白使用正交时相机的位置是如何工作的。以上是关于正交投影中的相机位置的主要内容,如果未能解决你的问题,请参考以下文章
使用 OpenGL 进行正交投影以及如何实现相机或物体在空间中的移动
在 C++ 中的 OpenGL 中将坐标从 3D 透视投影映射到 2D 正交投影