正交投影中的相机位置
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
。
我正在尝试了解如何通过 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
。