Nape柔体教程(1)
上一节,我们用Nape实现了弹簧效果,今天我们将利用Nape刚体的damping和frequency模拟柔体效果。
今天要实现的效果是一个橡胶棒,想歪了的同学自觉去面壁啊!首先先看一下效果。下面的示例中,舞台中间竖着一根橡胶棒,试着用鼠标拖动它,松开鼠标时,橡胶棒又恢复了原来的形状!
[swfobject]966[/swfobject]
这个效果能做什么呢?这就仁者见仁智者见智啦,哈哈!开玩笑啦,掌握这个橡胶棒的实现方法,是实现官方柔体效果(后面会陆续讲解)的基础,所以请务必掌握本节内容。要实现这个效果并不难,通过几何简单的弹簧组合就可以搞定。图下图所示:
图中的bodyA和bodyB的左边两个顶点分别用一个pivotJoint1关节连接,然后我们通过设置damping和frequency属性,把这个PivotJoint设置为一个弹簧。同样的方法,刚体的右侧两个顶点用另一个pivotJoint2连接。那么当我们向左拉动刚体然后放开鼠标后,受到弹簧的作用,刚体会向右运动。反之,当刚体偏右时,弹簧会将其向左拉动。
以此类推,我们可以在bodyB下面加入bodyC、D等多个刚体,形成示例中的橡胶棒效果。
完整的代码如下:
package learnNape { import nape.geom.Vec2; import nape.constraint.PivotJoint; import ldEasyNape.LDEasyNape; import nape.phys.Body; import learnNape.AbstractNapeTest; /** * @author yangfei */ public class T28_SoftBody1 extends AbstractNapeTest { public function T28_SoftBody1(gravity : Number = 600) { } private var bodyCount:int = 5; private var bodyWidth:Number = 10; private var bodyHeight:Number=30; private var bodyList : Vector.<Body>; override protected function onNapeWorldReady() : void { bodyList = new Vector.<Body>(); for(var i: int = 0; i< bodyCount; i++){ var b:Body = LDEasyNape.createBox(275, 350- bodyHeight*i, bodyWidth, bodyHeight,i==0); b.mass =0.01; bodyList.push(b); if(i>0){ var b1:Body = bodyList[i-1]; var leftAnchor:Vec2 = b.position.add(new Vec2(-bodyWidth/2,bodyHeight/2)); var rightANchor:Vec2 = b.position.add(new Vec2(bodyWidth/2,bodyHeight/2)); var leftJoint:PivotJoint = new PivotJoint(b1, b, b1.worldPointToLocal(leftAnchor), b.worldPointToLocal(leftAnchor)); var rightJoint:PivotJoint = new PivotJoint(b1, b, b1.worldPointToLocal(rightANchor), b.worldPointToLocal(rightANchor)); leftJoint.space = napeWorld; leftJoint.stiff = false; leftJoint.frequency = 30; leftJoint.damping = 30; rightJoint.space = napeWorld; rightJoint.stiff = false; rightJoint.frequency = 30; rightJoint.damping =30; } } } } }
第28~32行:针对bodyList中存储的刚体,前后两个分别用leftJoint和rightJoint连接在一起。
第33~41行:设置关节的damping和frequency属性,用关节模拟弹簧,实现橡胶效果。
联系作者
这东西上皮肤要怎么上呢?
中间那弹簧的线。