SCNRender场景与动画对象

Rom*_*yuk 6 animation opengl-es ios scenekit

我有SCNScene与动画对象(DAE文件)和我也有SCNRender与初始化openGLContext.当我将动画场景设置为此渲染时,我看不到动画,但是当我将动画场景设置为SCNView时,我会看到动画.

我如何设置渲染:

self.renderer = [SCNRenderer rendererWithContext:_openGLContext options:nil];
self.renderer.autoenablesDefaultLighting = YES;
self.renderer.playing = YES;
self.renderer.scene = myAnimatedScene;
Run Code Online (Sandbox Code Playgroud)

据我所知,OpenGL只能绘制对象,它对我的.dae文件中的动画设置一无所知

有人可以解释我如何使用openGLContext初始化的SCNRender绘制动画场景吗?

Kel*_*sha 4

看来,当调用以下函数时:

renderer.render(atTime: time, viewport: viewport,
                commandBuffer: commandBuffer,
                passDescriptor: renderPassDescriptor)
Run Code Online (Sandbox Code Playgroud)

时间参数非常重要。在我将其保留为零并且没有动画之前。如果用CFAbsoluteTimeGetCurrent()设置的话,好像只能得到一个动画(我刚刚测试过,我的游戏英雄有射击动作,也有行走动作,通过CFAbsoluteTimeGetCurrent()设置atTime ,只能得到一个动画)行走的人出现了。)

然而,我们的情况有点不同。就我而言,我还有一个 SCNView 来渲染英雄的视角。因此,为了运行所有动画,我创建了一个 Globe 变量:

var globeTime:TimeInterval = 0
Run Code Online (Sandbox Code Playgroud)

并在SCNView的渲染器函数中保存当前时间:

func renderer(_ aRenderer: SCNSceneRenderer,
              updateAtTime time: TimeInterval) {
    globeTime = time
    //...
}
Run Code Online (Sandbox Code Playgroud)

最后将其传递给我的 SCNRender。

//...
renderer.render(atTime: globeTime, viewport: viewport,
                commandBuffer: commandBuffer,
                passDescriptor: renderPassDescriptor)
Run Code Online (Sandbox Code Playgroud)

这完美解决了我的问题。