想要使用Scenekit更改节点的y值

时间:2016-03-29 17:54:03

标签: ios xcode animation scenekit

我想在一段时间内缩小节点的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

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

1 个答案:

答案 0 :(得分:3)

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];