ios - SceneKit - 如何知道带有 MDLObject 的 SCNNode 是否已加载并可见?
问题描述
我在“渲染时”为 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 秒。当我将持续时间更改为 5 秒时,我可以看到动画。
我还尝试委托 SCNSceneRenderer:didRenderScene,但我也无法成功运行该动画。
解决方案
你很幸运。我最近正在处理这个话题。假设您使用 SCNView 作为 SCNSceneRender,您可以将 rootNode 添加到以下调用中,然后在完成回调中处理其他操作,如下所示:
// setup everything here. It's your code.
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];
SCNView * view; // you don't need this if you have one already.
[view prepareObjects:@[scene.rootNode] withCompletionHandler:^(BOOL success) {
if(success) {
//scene will be rendered after this point.
}
}];
希望这是你需要的。
推荐阅读
- c# - Selenium C# ExpectedConditions 与 IWebElement
- pandas - 在 movielens 项目中查找具有多种类型的电影 - Pandas
- python - 用python编写excel文件的最简单方法
- python - 复制 Django 表单 request.FILES 以使用智能字段上传多个图像文件
- html - Bootstrap:当只有 col-12 时不使用 col 的坏风格?
- reactjs - 错误:> 由于 webpack 错误,构建失败
- javascript - 从股票javascript中的函数返回数组
- r - 从 R 中的 chisq 输出中提取元素
- python-requests - 使用 eventlet.monkey_patch() 请求“未找到地址”异常
- java - Java ee NoClassDefFoundError: javax/servlet/http/HttpServlet