【发布时间】:2019-02-24 23:00:33
【问题描述】:
我想使用正交投影在我的应用中显示 3D 场景。在我的代码中,我在场景中放置了一个框,并设置了视点的正交投影,如打击。 (0,0,500) 处的相机看 -z 方向,并在世界的原点框。所以相机应该能够捕捉到盒子。
let cameraNode = SCNNode()
let pov = SCNCamera()
pov.usesOrthographicProjection = true
let width = UISreen.main.bounds.size.width
let glMat = GLKMatrix4MakeOrtho(-width/2, width/2, -width/2, width/2, 1, 1000)
pov.projectionTransform = SCNMatrix4FromGLKMatrix4(glMat)
cameraNode.camera = pov
cameraNode.position = SCNVector3.init(0, 0, 500)
scene.rootNode.addChildNode(cameraNode)
let boxGeo = SCNBox.init(width: 100, height: 100, length: 1, chamferRadius: 0)
let box = SCNNode.init(geometry: boxGeo)
scene.rootNode.addChildNode(box)
但我什么也看不见。我发现如果将orthographicScale 设置为width/2.0 将正常工作。
pov.orthographicScale = Double(width/2);
问题 1:我不知道为什么会这样。我阅读了苹果的文档,但仍然感到困惑。 https://developer.apple.com/documentation/scenekit/scncamera/1436612-orthographicscale?language=objc
正交比例
在使用正交投影时指定相机的放大系数。
为什么需要放大正交投影?我已经通过GLKMatrix4MakeOrtho设置了它的尺寸。
我不确定它是否与视口变换有关?因为 OpenGL 中的视口变换计算如下:https://docs.microsoft.com/en-us/windows/desktop/opengl/glviewport
问题 2: 我还发现如果我创建像 Blow 这样的投影矩阵,它的工作原理与以前相同。
let glMat = GLKMatrix4MakeOrtho(0, width, 0, width, 1, 1000)
在OpenGL中表示不同的观察框,会显示不同的场景分区。
感谢任何帮助!
【问题讨论】:
-
你的相机在哪里看?你设置视口了吗?
-
相机看-z方向。我没有在 SceneKit 中明确设置视口。
标签: ios objective-c swift opengl-es scenekit