如何使用SCNRenderer将SceneKit与现有OpenGL结合使用?

时间:2016-12-29 17:27:09

标签: ios opengl-es scenekit glkit

我想使用SceneKit的SCNRenderer将一些模型绘制到我现有的GLKit OpenGL ES 3.0应用程序中,并匹配我现有的modelViewProjection变换。当我加载SceneKit场景并使用SCNRenderer渲染它时,SceneKit摄像机转换似乎被忽略,我只是得到一个默认的边界框视图。更一般地说,我更愿意提供自己的矩阵,我不知道该怎么做。

//
// Called from my glkView(view: GLKView, drawInRect rect: CGRect)
//

// Load the scene
let scene = SCNScene(named: "art.scnassets/model.scn")!

// Create and add regular SceneKit camera to the scene
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(x: 0, y: 0, z: 10)
scene.rootNode.addChildNode(cameraNode)

// Render into the current OpenGL context
let renderer = SCNRenderer( context: EAGLContext.currentContext(), options: nil )
renderer.scene = scene
renderer.renderAtTime(0)

我看到在SCN相机上暴露了一个projectionTransform,我也尝试过操作它,但没有结果。我也猜测这只是一个投影变换而不是期望完整的modelViewProjection变换。

// Probably WRONG
cameraNode.camera!.projectionTransform = SCNMatrix4FromGLKMatrix4( modelViewProjectionTransform )

有没有人有过以这种方式将SceneKit混合到OpenGL绘图中的例子?感谢。

编辑:

Bobelyuk对这个例子的参考很有帮助,到目前为止帮助我解决了一半的问题。事实证明,虽然我添加了相机节点,但我未能将相机节点设置为'pointOfView':

scene.pointOfView = cameraNode

该示例似乎显示了如何取一个opengl矩阵并将其反转以在相机上设置它,但是到目前为止我还没有能够使用我的代码。我将很快再次使用代码示例进行更新。

2 个答案:

答案 0 :(得分:0)

http://qiita.com/akira108/items/a743138fca532ee193fe您可以在这里找到如何合并 SCNRenderer OpenGLContext

答案 1 :(得分:0)

最终它变得非常简单。除了将pointOfView设置到摄像机节点之外,我只需要将摄像机变换和摄像机投影变换正确地设置为我自己的矩阵。

以下是更新的示例:

//
// Called from my glkView(view: GLKView, drawInRect rect: CGRect)
//

// Load the scene
let scene = SCNScene(named: "art.scnassets/model.scn")!
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
scene.rootNode.addChildNode(cameraNode)

// Set my own matrices
cameraNode.transform = SCNMatrix4Invert(SCNMatrix4FromGLKMatrix4(myModelViewMatrix))
cameraNode.camera!.projectionTransform = SCNMatrix4FromGLKMatrix4(myProjectionMatrix)

// Render into the current OpenGL context
let renderer = SCNRenderer( context: EAGLContext.currentContext(), options: nil )
renderer.scene = scene
renderer.pointOfView = cameraNode  // set the point of view for the scene
renderer.renderAtTime(0)

对于新手:模型视图矩阵是定位场景的矩阵,例如:撰写GLKMatrix4Scale和GLKMatrix4Rotate调用。投影矩阵是设置视图截头和视点的投影矩阵,例如通过编写对GLKMatrix4MakePerspective和GLKMatrix4MakeLookAt调用的调用。