Nape柔体教程(2)

上一节,我们用关节的弹簧属性,仿真了一个弯曲后可以自动恢复的矩形橡胶棒。我想你肯定意犹未尽,今天我们来学习一下如何创建圆形柔体。

目前拉登大叔了解到的圆形柔体的创建方法有两种,本节介绍的是第一种,在emanueleferonato的博客中学到的方法,大体的思路是这样的:

  1. 沿着圆形的边长创建多个刚体segmentBody,相邻的刚体之间用关节sToSJoint连接起来。segmentBody越多圆形越逼真。
    这样完成的效果就像绳索效果中,把绳子的两头系在了一起,开始可能是圆形的,但是掉到地上之后就摊到一起了,如下所示。 

    [swfobject]987[/swfobject]

  2. 在圆心位置创建一个圆形刚体centerBody。用关节sToCJoint将每个segmentBody连接到这个centerBody刚体上。设置这些sToCJoint关节的damping和frequency属性,让它具有弹性。

这一步的作用就像是自行车轱辘中间的轴承和辐条,把周围的小刚体segmentBody支撑起来,让这个”外胎”不会瘪下去。

futiao2

当然辐条的形变量是很小的,为的是让车轮不会瘪,而我们希望得到的是柔体,所以通过设置关节damping和frequency属性把这些辐条变软,实现柔体效果。完成后的效果如下所示。

[swfobject]988[/swfobject]

代码如下:

package learnNape {
	import nape.constraint.PivotJoint;
	import nape.phys.BodyList;
	import nape.geom.Vec2;
	import ldEasyNape.LDEasyNape;
	import nape.phys.Body;
	import learnNape.AbstractNapeTest;

	/**
	 * @author yangfei
	 */
	public class T27_SoftBody extends AbstractNapeTest {
		public function T27_SoftBody(gravity : Number = 600) {

		}

		private var centerBody : Body;
		private var cx:Number = 200;
		private var cy:Number = 200;

		private var bodyNumbers:int = 10;
		private var radius : Number = 50;

		private var bodyList:BodyList;

		override protected function onNapeWorldReady() : void {
			centerBody = LDEasyNape.createCircle(cx, cy, 10);
			bodyList = new BodyList();

			for (var i:int = 0; i<bodyNumbers; i++){
				var angle : Number = Math.PI*2*i/bodyNumbers;
				var px : Number = cx + Math.sin(angle)*radius;
				var py : Number = cy + Math.cos(angle)*radius;
				var body :Body = LDEasyNape.createCircle(px, py, 5);
				bodyList.push(body);
			}
			var prevBody:Body, currBody:Body;

			for (var j:int=0;j< bodyList.length; j++){
				prevBody=bodyList.at((j-1+bodyList.length)%bodyList.length);
				currBody=bodyList.at(j);
				var sToSJoint : PivotJoint = new PivotJoint(prevBody, currBody, Vec2.weak(), currBody.worldPointToLocal(prevBody.position));
				sToSJoint.stiff = false;
				sToSJoint.space = napeWorld;

				var sToCJoint : PivotJoint = new PivotJoint(centerBody, currBody, Vec2.weak(), currBody.worldPointToLocal(centerBody.position));
				sToCJoint.stiff = false;
				sToCJoint.damping = 1;
				sToCJoint.frequency = 5;
				sToCJoint.space = napeWorld;
			}
		}
	}
}

看起来貌似不错,但是如果你看过Nape官网中的softBody示例,可能会和我一样,对这个简陋的柔体效果并不满意,没关系,下一节,拉登大叔将带你学习这个逼真的柔体效果。

点击下载源文件

联系作者

公众号:拉小登 | 微博:拉登Dony | B站:拉小登Excel

4 Replies to “Nape柔体教程(2)”

  1. 很久前学习starling的时候看到过nape,就学了点皮毛,今天看你的文章很有意思啊!支持支持啊!慢慢研究哈,写的不错,是个好老师

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注