作者:倔强的追求 | 来源:互联网 | 2023-05-27 12:31
我有一个充满活力的球体.我想动画这个球体的比例,使它的大小增加:
1 2 3 4 | let sphere = SCNNode(geometry: SCNSphere(radius: 1))
scene.rootNode.addChildNode(sphere)
sphere.physicsBody = SCNPhysicsBody.dynamicBody()
sphere.runAction(SCNAction.scaleTo(10, duration: 1))
|
但是,这似乎不起作用.球体由于重力而下落,但尺寸保持不变.如果我注释掉赋予球体物理体的线条,那么缩放动画就像它应该的那样.
甚至在没有动画的情况下观察到这种奇怪现象 简单地直接改变球体的比例是行不通的:
1 2 3 4 | let sphere = SCNNode(geometry: SCNSphere(radius: 1))
scene.rootNode.addChildNode(sphere)
sphere.physicsBody = SCNPhysicsBody.dynamicBody()
sphere.scale = SCNVector3(x: 10, y: 10, z: 10)
|
球体下降但半径为1.除非在添加物理体之前对球体进行缩放.在这种情况下,球体开始缩放到10并下降,保持其半径为10.
有趣的是,在动画假定运行后通过打印出球体的比例进行进一步检查后,观察到比例确实发生了变化,除非物理体被移除,否则它是不可见的:
1 2 3 4 5 6 7 | let sphere = SCNNode(geometry: SCNSphere(radius: 1))
scene.rootNode.addChildNode(sphere)
sphere.physicsBody = SCNPhysicsBody.dynamicBody()
sphere.runAction(SCNAction.scaleTo(10, duration: 1), completionHandler: {() in
println(sphere.scale.x)
sphere.physicsBody = nil
})
|
为什么不可能改变动态体的规模?(请注意,静态和运动体可以很好地扩展.)是否有可能以某种方式实现这一点?
1> rickster..:
当一个人改变大小时,你不仅需要一个"缩放速度"与其他对象进行交互,你需要一个"缩放力".在成长过程中,它应该有多强烈地推动它碰撞的东西?如果它处于一种取决于其质量的情况,如跷跷板上的平衡,会发生什么?
游戏引擎已经是现实世界物理学的松散近似,因此要求他们自己找出Ant-Man物理学有点紧张.如果他们能做到这一点,他们可能也会开始制造杀手机器人,这有点毁了你的一天.:)
无论如何,根据您希望扩展球体如何影响事物,您有几个选择.一种是间隔删除并重新创建物理体:
1 2 3 4 5 6 7 | let duration = 5.0
node.runAction(.customActionWithDuration(duration, actionBlock: { node, progress in
let scale = 1.0 + progress / CGFloat(duration)
node.physicsBody = nil
node.scale = SCNVector3(x: scale, y: scale, z: scale)
node.physicsBody = .dynamicBody()
}))
|
这样做每一帧,这可能是昂贵的 - 你可能想progress
在那里抛出一些门控,所以它不常发生.(并且根据球体变化大小需要发生的其他效果,你可以在重新创建物理体时设置像质量一样的东西.)
另一个选择可能是看SCNPhysicsField
.使用径向重力场来制作一个区域,将一切都推出其影响区域,然后设置其参数的动画以随时间改变大小和强度.