【发布时间】:2015-03-09 16:38:51
【问题描述】:
我有一个球体,它是一个动态物体。我想为这个球体的比例设置动画,使其尺寸变大:
let sphere = SCNNode(geometry: SCNSphere(radius: 1))
scene.rootNode.addChildNode(sphere)
sphere.physicsBody = SCNPhysicsBody.dynamicBody()
sphere.runAction(SCNAction.scaleTo(10, duration: 1))
但是,这似乎不起作用。球体由于重力而下落,但尺寸保持不变。如果我注释掉赋予球体物理主体的线,那么缩放动画就会正常播放。
即使没有动画也能观察到这种奇怪的现象。简单地直接改变球体的比例是行不通的:
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。
有趣的是,在动画运行后通过打印球体的比例进一步检查后,可以观察到比例确实发生了变化,除非物理体被移除,否则它是不可见的:
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
})
为什么不能改变动态体的尺度? (请注意,静态和运动的物体可以很好地缩放。)是否有可能以某种方式实现这一点?
【问题讨论】:
-
物理引擎通常不支持在运行时缩放物体。唯一的解决方法是删除形状或主体并创建一个具有新尺寸的新形状或主体。你很快就会明白为什么物理引擎不能自己这样做,它是一罐蠕虫。
-
我明白了。这就是我开始的想法,它不受支持似乎很奇怪。我想知道为什么会这样。
-
一方面,它会在引擎的物理碰撞检测/解决阶段之外引入额外碰撞的可能性。即一个对象可能突然完全包含在另一个对象中。另外,如果一个对象增加比例,则必须有一个“缩放速度”,以便受增加比例影响的对象可以相应地被推开。这可能只是冰山一角,实际推理请联系物理引擎作者。 ;)
-
嗯,是的,我想这是有道理的。