【问题标题】:Want to change the y-value of a node using Scenekit想要使用 Scenekit 更改节点的 y 值
【发布时间】:2016-07-17 10:34:25
【问题描述】:

我想在一段时间内缩小节点的 y 值。我不能使用 scaleBy:duration: 或 scaleTo:duration 方法,因为它们会更改所有轴值,而我只想更改 y 值。我决定尝试使用 customActionWithDuration:actionBlock: 方法制作自定义动画。这是我为该方法编写的代码

SCNAction *scale = [SCNAction customActionWithDuration:1.0 actionBlock:^(SCNNode *node,
                                                                                        CGFloat elapsedTime){

            node.scale = SCNVector3Make(100, 0, 0);

        }];



        [planeNode runAction:scale]; //run custom animation on node

当我尝试上面的代码时,没有任何变化。该节点保持相同的大小。我做错了什么?

【问题讨论】:

    标签: ios xcode animation scenekit


    【解决方案1】:

    customActionWithDuration:actionBlock:,如其文档中所述,“在指定的持续时间内定期执行一个块”。因此,您的模块一遍又一遍地将比例设置为相同的值。

    相反,您希望利用您的块被重复调用(并提供elapsedTime 值)这一事实来动画化随时间的变化。比如:

    CGFloat endScale = 100;
    CGFloat duration = 1.0;
    CGFloat startScale = planeNode.scale.y;
    SCNAction *action = [SCNAction customActionWithDuration:1.0 actionBlock:
        ^(SCNNode *node, CGFloat elapsedTime){
            currentScale = startScale + endScale * (elapsedTime/duration);
            node.scale = SCNVector3Make(currentScale, 0, 0);
        }];
    

    或者,除非出于某种原因您需要使用动作而不是动画,否则您可以使用隐式动画:

    [SCNTransaction begin];
    node.scale = SCNVector3Make(node.scale.x, 100, node.scale.y);
    [SCNTransaction setAnimationDuration:1.0];
    [SCNTransaction commit];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 2014-10-05
      • 1970-01-01
      • 2021-05-19
      • 2017-02-07
      相关资源
      最近更新 更多