SceneKit-如何知道带有MDLObject的SCNNode是否已加载并可见?

时间:2018-10-30 23:54:39

标签: ios objective-c scenekit

我在“渲染时”为SCNNode设置动画时遇到问题,所以我的问题是如何知道SCNNode已完全加载并在场景中可见?我想在加载/渲染后立即为其缩放动画。

这是我如何初始化它:

NSString* ring = [[NSBundle mainBundle]
                 pathForResource:[NSString stringWithFormat:@"sweep"]
                 ofType:@"obj"];
NSURL *url = [NSURL fileURLWithPath:ring];

MDLAsset *asset = [[MDLAsset alloc]initWithURL:url];
self.node = [SCNNode nodeWithMDLObject:[asset objectAtIndex:0]];
self.node.geometry.firstMaterial = goldMaterial;
self.node.geometry.subdivisionLevel = 1;

[self.node setRotation:SCNVector4Make(-1, 0, 0, M_PI/2.5)]; //M_PI = 180d
[self.node setScale:SCNVector3Make(0.1, 0.1, 0.1)];
[scene.rootNode addChildNode: self.node];

然后我试图添加这样的动作

SCNAction *scaleUp = [SCNAction scaleTo:1.0f duration:0.5f];
scaleUp.timingMode = SCNActionTimingModeEaseInEaseOut;
[self.node runAction:scaleUp];

但是我的节点只是按比例放大,因为加载obj资产大约需要2秒钟。 当我将持续时间更改为5s时,我可以看到动画。

我还尝试委托SCNSceneRenderer:didRenderScene,但是我也无法成功运行该动画。

1 个答案:

答案 0 :(得分:1)

您很幸运。我最近正在处理这个话题。假设您使用SCNView作为SCNSceneRender,可以将rootNode添加到以下调用中,然后在完成回调时处理其他操作,如下所示:

Foo.d.ts

希望这就是您所需要的。