2016-03-29 9 views
1

一定の期間にわたってノードのy値だけを縮小したいと思っています。 scaleBy:duration:またはscaleTo:durationのメソッドを使用することはできません。すべての軸の値を変更する代わりに、代わりにyの値を変更するだけです。私はcustomActionWithDuration:actionBlockというメソッドを使ってカスタムアニメーションを作ろうと決めました。ここでは、私はメソッドのために書いたコードですScenekitを使用してノードのy値を変更したい

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 

私は上記のコードを試しても何も変わりません。ノードは同じサイズのままです。私は間違って何をしているのですか?

答えて

2

customActionWithDuration:actionBlock:は、ドキュメントに記載されているように、「指定された期間にわたってブロックを定期的に実行します。だからあなたのブロックはスケールを同じ値に繰り返し設定しています。

代わりに、ブロックが繰り返し呼び出されて(そしてelapsedTimeの値を指定して)、変化をアニメーション化するという事実を利用したいとします。ような何か:

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

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

、あなたが代わりにアニメーションのアクションを使用する必要があるいくつかの理由がありますしない限り、あなたは暗黙のアニメーションを使用することができます

関連する問題