不可预测的 SceneKit 行为?

Posted

技术标签:

【中文标题】不可预测的 SceneKit 行为?【英文标题】:Unpredictable SceneKit behaviour? 【发布时间】:2017-09-09 10:57:32 【问题描述】:

我有一个实现以下方法的 SceneKit SCNSceneRendererDelegate:

- (void)    renderer:(id<SCNSceneRenderer>)renderer
      didRenderScene:(SCNScene*)scene
              atTime:(NSTimeInterval)time

    static  NSUInteger  counter = 0 ;

    counter++ ;


    //  Rotate via animation
    if (counter==1)
    
        SCNNode *man                = [scene.rootNode childNodeWithName:@"Man" recursively:YES] ;
        SCNNode *headBone           = [man childNodeWithName:@"mixamorig_Head" recursively:YES] ;

        CABasicAnimation    *animation1  = [CABasicAnimation animationWithKeyPath:@"rotation"] ;
        animation1.fromValue = [NSValue valueWithSCNVector4:headBone.rotation] ;
        animation1.toValue   = [NSValue valueWithSCNVector4:SCNVector4Make(0,1,0,M_PI_4)] ;
        animation1.duration = 1.2 ;
        animation1.fillMode = kCAFillModeForwards ;
        animation1.removedOnCompletion   = NO ;
        [headBone addAnimation:animation1 forKey:@"rotationAnimation"] ;
    

显然,这只是将名为“mixamorig_Head”的骨骼旋转 45 度。

当我运行程序时,我实际上可以看到头部在旋转...只有 2 次中的一次

我唯一要做的就是点击 XCode 的运行按钮。程序启动并显示场景,头部旋转......或不旋转。运行之间没有代码更新,只需点击运行按钮即可。

我已经尝试记录每个变量,一切似乎都是正确的。

知道为什么 SceneKit 的行为会因一次运行而不同吗?

编辑 上传一个演示项目here。

【问题讨论】:

在头部不旋转的情况下,头部看起来是已经旋转了,还是看起来根本没有旋转? 它完全不动,保持在起始位置。 我想知道场景是否有时没有完全初始化......你说你已经记录了几乎所有东西---你确认 man 和 headBone 在旋转的情况下不是 nil不会发生? 是的,我确实证实了这一点(而且 animation1 不是零)。如果您有兴趣,我会将项目上传到airxygene.fr/transfer/3DTests.zip。这是一个简单的“构建场景,添加动画”测试。如果您多次构建并运行它,您应该在不更改任何代码的情况下看到这两种行为。我正在使用 XCode 8.3 (8E162) 和 macOS Sierra。 我认为您的 headBone 已经附加了动画。在awakeFromNib 中调用[headBone removeAllAnimations]; 似乎让动画每次都能为我工作。 【参考方案1】:

我查看了 DAE 文件,发现所有骨骼都附加了动画。添加新动画时,这似乎是一个问题,而且它们并不总是有效。 (不知道为什么它有时会起作用而其他时候不起作用)。

您可以删除 SceneKit 编辑器中的所有动画,或者以编程方式将它们从您要设置动画的节点中删除:

[headBone removeAllAnimations];

【讨论】:

以上是关于不可预测的 SceneKit 行为?的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewRowAction 行为不可预测

Core Animation (CABasicAnimation) 的不可预测行为

UIStackView 在容器视图中的行为不可预测

在结构中分配内存时出现不可预测的行为

Parallel.For 和 ConcurrentBag 给出不可预测的行为

列表视图项目的不可预测的行为复选框单击