想要使用 Scenekit 更改节点的 y 值
Want to change the y-value of a node using 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
当我尝试上面的代码时,没有任何变化。节点保持相同大小。我做错了什么?
customActionWithDuration:actionBlock:
,如其文档中所述,"executes a block periodically over a specified duration"。所以你的块一遍又一遍地将比例设置为相同的值。
相反,您想利用您的块被重复调用(并提供 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];
我只想在一段时间内缩小节点的 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
当我尝试上面的代码时,没有任何变化。节点保持相同大小。我做错了什么?
customActionWithDuration:actionBlock:
,如其文档中所述,"executes a block periodically over a specified duration"。所以你的块一遍又一遍地将比例设置为相同的值。
相反,您想利用您的块被重复调用(并提供 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];