永远为 SCNNode 设置动画 - SceneKit,Swift
Animate SCNNode forever - SceneKit, Swift
我想永远动画 2 个立方体,直到用户点击其中一个。动画应该像一个∞。
这些是我想要设置动画的 sceneView 中的立方体:
我正在尝试使用嵌套动画来做到这一点,它确实部分有效。现在,由于动画总是等到它们完成后再开始新的动画,所以看起来一点也不流畅。
在继续开发 ∞ 动画之前,我想知道是否有更好(并且实际可行)的方法。这是我当前的代码:
SCNTransaction.begin()
SCNTransaction.setAnimationDuration(2)
cube1.position = SCNVector3Make(3, 0, 0)
cube2.position = SCNVector3Make(-3, 0, 0)
println("log 0")
SCNTransaction.setCompletionBlock {
println("log 1")
while (animationKey != 1) {
//initially animationKey = 0
SCNTransaction.begin()
SCNTransaction.setAnimationDuration(2)
cube1.position.x += 1
cube1.position.y += 1
cube2.position.x += 1
cube2.position.y += 1
println("log 2")
SCNTransaction.setCompletionBlock {
SCNTransaction.begin()
SCNTransaction.setAnimationDuration(2)
cube1.position.x -= 1
cube1.position.y -= 1
cube2.position.x -= 1
cube2.position.y -= 1
println("log 3")
SCNTransaction.setCompletionBlock { animationKey = 1 }
SCNTransaction.commit()
}
println("log 4")
SCNTransaction.commit()
}
}
println("log 5")
SCNTransaction.commit()
println("log 6")
}
输出显示以下内容:
log 0, log 5, log 6, log 1, log 2, log 4, log 2
...然后它只是继续 log 4
和 log 2
交替。
有人可以帮我吗?
备注
我认为递归方法会更好,因此我将 animationKey = 1
替换为调用其中的方法...根本不再起作用了。
我让动画工作了一次,但现在它在完成第一个动画后就停止了,完全忽略了第二个和第三个动画块...
如果您要为 SCNNode
制作动画,请让您的节点 运行 为 SCNAction
。
Swift:
let moveUp = SCNAction.moveBy(x: 0, y: 1, z: 0, duration: 1)
moveUp.timingMode = .easeInEaseOut;
let moveDown = SCNAction.moveBy(x: 0, y: -1, z: 0, duration: 1)
moveDown.timingMode = .easeInEaseOut;
let moveSequence = SCNAction.sequence([moveUp,moveDown])
let moveLoop = SCNAction.repeatForever(moveSequence)
myNode.runAction(moveLoop)
Objective-C:
SCNAction *moveUp = [SCNAction moveByX:0 Y:1 Z:0 duration:1];
moveUp.timingMode = SCNActionTimingModeEaseInEaseOut;
SCNAction *moveDown = [SCNAction moveByX:0 Y:-1 Z:0 duration:1];
moveDown.timingMode = SCNActionTimingModeEaseInEaseOut;
SCNAction *moveSequence = [SCNAction sequence:@[moveUp,moveDown]];
SCNAction *moveLoop = [SCNAction repeatActionForever:moveSequence];
[myNode runAction:moveLoop];
上面的代码将 myNode
永远上下动画。
您可以从贝塞尔路径创建 CAKeyframeAnimation
动画(参见 path
属性)。这样你会得到一个非常流畅的动画。
为了让它永远重复,将它的 repeatCount
设置为 HUGE_VALF
,您可以使用 timingFunction
属性.
调整速度
我想永远动画 2 个立方体,直到用户点击其中一个。动画应该像一个∞。
这些是我想要设置动画的 sceneView 中的立方体:
我正在尝试使用嵌套动画来做到这一点,它确实部分有效。现在,由于动画总是等到它们完成后再开始新的动画,所以看起来一点也不流畅。
在继续开发 ∞ 动画之前,我想知道是否有更好(并且实际可行)的方法。这是我当前的代码:
SCNTransaction.begin()
SCNTransaction.setAnimationDuration(2)
cube1.position = SCNVector3Make(3, 0, 0)
cube2.position = SCNVector3Make(-3, 0, 0)
println("log 0")
SCNTransaction.setCompletionBlock {
println("log 1")
while (animationKey != 1) {
//initially animationKey = 0
SCNTransaction.begin()
SCNTransaction.setAnimationDuration(2)
cube1.position.x += 1
cube1.position.y += 1
cube2.position.x += 1
cube2.position.y += 1
println("log 2")
SCNTransaction.setCompletionBlock {
SCNTransaction.begin()
SCNTransaction.setAnimationDuration(2)
cube1.position.x -= 1
cube1.position.y -= 1
cube2.position.x -= 1
cube2.position.y -= 1
println("log 3")
SCNTransaction.setCompletionBlock { animationKey = 1 }
SCNTransaction.commit()
}
println("log 4")
SCNTransaction.commit()
}
}
println("log 5")
SCNTransaction.commit()
println("log 6")
}
输出显示以下内容:
log 0, log 5, log 6, log 1, log 2, log 4, log 2
...然后它只是继续 log 4
和 log 2
交替。
有人可以帮我吗?
备注
我认为递归方法会更好,因此我将
animationKey = 1
替换为调用其中的方法...根本不再起作用了。我让动画工作了一次,但现在它在完成第一个动画后就停止了,完全忽略了第二个和第三个动画块...
如果您要为 SCNNode
制作动画,请让您的节点 运行 为 SCNAction
。
Swift:
let moveUp = SCNAction.moveBy(x: 0, y: 1, z: 0, duration: 1)
moveUp.timingMode = .easeInEaseOut;
let moveDown = SCNAction.moveBy(x: 0, y: -1, z: 0, duration: 1)
moveDown.timingMode = .easeInEaseOut;
let moveSequence = SCNAction.sequence([moveUp,moveDown])
let moveLoop = SCNAction.repeatForever(moveSequence)
myNode.runAction(moveLoop)
Objective-C:
SCNAction *moveUp = [SCNAction moveByX:0 Y:1 Z:0 duration:1];
moveUp.timingMode = SCNActionTimingModeEaseInEaseOut;
SCNAction *moveDown = [SCNAction moveByX:0 Y:-1 Z:0 duration:1];
moveDown.timingMode = SCNActionTimingModeEaseInEaseOut;
SCNAction *moveSequence = [SCNAction sequence:@[moveUp,moveDown]];
SCNAction *moveLoop = [SCNAction repeatActionForever:moveSequence];
[myNode runAction:moveLoop];
上面的代码将 myNode
永远上下动画。
您可以从贝塞尔路径创建 CAKeyframeAnimation
动画(参见 path
属性)。这样你会得到一个非常流畅的动画。
为了让它永远重复,将它的 repeatCount
设置为 HUGE_VALF
,您可以使用 timingFunction
属性.