首页 文章

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

提问于
浏览
3

我想使用 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

    http://qiita.com/akira108/items/a743138fca532ee193fe在这里你可以找到如何结合SCNRendererOpenGLContext

  • 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)
    

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

相关问题