(转载http://tomyail.com/blog/1065)

Body的类型:

  • BodyType.DYNAMIC(默认):用来模拟现实世界的刚体,拥有质量并且一旦加入Nape的空间(Space)里便会自动受到各种力的作用
  • BodyType.STATIC:不受各种力的作用(设置其force属性会报错)
  • BodyType.KINEMATIC:特征和静态刚体(STATIC Body)一样,但是可以设置其velocity属性来改变速度

Body不是简单的质点,所有的Body都是有形状和体积的,默认情况下都会进行碰撞检测.

Shape:

Body的shapes的属性用来维护其所对应的形状列表,都是Shape类型.

Nape里面的Shape类型用来定义物体的物理形状,Shape类有两个子类:Circle(圆形)和Polygon(多边形).

Shape类的Material用来设置物体的物理属性比如密度,弹力,最大静摩擦力等等.

官方文档首页 UML图比较清楚的阐明了这几个类之间的关系.

刚体的两个”心”:

刚体有两个心,重心和局部坐标系原点.需要注意的是刚体总是按照其局部坐标系的原点进行旋转的,而重心都是位于刚体的形状中心的.如果刚体的局部坐标原点和其重心不重合就会产生力矩,在刚体自由落体时就会发生旋转.

Nape的Debug有两个布尔属性drawBodyDetaildrawShapeDetail

drawBodyDetail表示是否绘制坐标原点,用实心方块表示.

drawShapeDetail表示是否绘制重心,用空心方块表示.

如下图:

Polygon有两个静态方法box和rect,两者的区别就是刚体两个心的位置

  • 利用box方法创建的shape重心和坐标原点都在方块的中央
  • 利用rect方法创建的shape原点在左上角,重心在形状的中心,所以下落时会绕原点进行旋转

例子

(1):利用box函数创建刚体测试

body = new Body(BodyType.KINEMATIC);
shape = new Polygon(Polygon.box(100, 100));
body.shapes.add(shape);
body.position.y = 100;
body.position.x = 100; //强制刷新
space.step(1/60);
trace(shape.localCOM);//输出(0,0)
trace(body.position);//输出(100,100)

运行截图:

利用box创建的刚体重心和原点都在方块的中点

(2):利用rect函数创建刚体测试

body = new Body(BodyType.KINEMATIC);
shape = new Polygon(Polygon.rect(0,0,100, 100));
body.shapes.add(shape);
body.position.y = 100;
body.position.x = 100;
space.bodies.add(body); //强制刷新
space.step(1/60);
trace(shape.localCOM);//输出(50,50)
trace(body.position);//输出(100,100)

运行截图:

利用rect创建的刚体重心原点在(100,100)的位置,也就是左上角.重心在(150,150)的位置,也就是刚体的形状中心.

修改重心localCOM(local Center of Mass)的坐标参考系是相对于其局部坐标,也就是这里local的含义吧,重心是相对于局部坐标系的偏移.

(3)测试algin()的作用

body = new Body(BodyType.KINEMATIC);
shape = new Polygon(Polygon.rect(0,0,100, 100));
body.shapes.add(shape);
body.position.y = 100;
body.position.x = 100;
space.bodies.add(body); body.align();
//强制刷新
space.step(1/60);
trace(shape.localCOM);//输出(0,0)
trace(body.position);//输出(150,150)

运行截图:

Body.align()的作用是将Body坐标系原点移动到Body重心点上去.

所以align会改变刚体的坐标位置.如上图所示,本来我设置的坐标点是(100,100),align之后的坐标点跑到了(150,150)上

一个例子:

override protected function initNapeSpace():void
{
super.initNapeSpace(); //不绘制Body
//debug.drawBodies = false;
//不绘制Shape旋转标识
//debug.drawShapeAngleIndicators = false;
//绘制重心 空心方块
debug.drawShapeDetail = true;
//绘制坐标系原点 实心方形
debug.drawBodyDetail = true;
super.createBorder(false);
var rect:Body = createRectBody(BodyType.DYNAMIC, , , -, -, , );
var r2:Polygon = new Polygon(Polygon.rect(, -, , ));
r2.body = rect; var btn:PushButton = new PushButton(this, , , "rect.align()",
function():void {
rect.align();
btn.enabled = false;
}
) trace(rect.position)
trace(rect.localCOM)
}

Nape刚体body.align();的更多相关文章

  1. Nape "不动"刚体的碰撞交互

    "不动"刚体,这里指的是以下两类刚体: 1.刚体的allowMovement和allowRotation都设false的刚体 2.KINEMATIC类型的刚体 如下代码,测试发现输 ...

  2. nape.geom.MarchingSquares

    Nape中的MarchingSquares类很简单,只有一个静态函数run,不过这对绘制那些简单的形状来说,已经足够了(当然MarchingSquares能做的不只这些).下面是这个run方法的结构: ...

  3. Nape的回调系统 nape.callbacks

    在Nape中增加一个回调大致分为三步 1:定义一些标签,并根据需求为不同的Interactor打上不同的标签 2:定义一个监听器,这个监听器定义了哪些标签触发了哪种行为之后做何种回调 3:为Space ...

  4. nape.dynamics.InteractionGroup

    (转载http://tomyail.com/blog/1123) 说明: Filter只是Shape的属性,Nape为Interactor类提供了group属性,这个属性是一个InteractionG ...

  5. Nape 获取碰撞点加特效

    package { import nape.phys.Body; import nape.shape.Shape; import nape.shape.Circle; import flash.dis ...

  6. Unity3d刚体Rigidbody与碰撞检测Collider

    做了一个碰撞的小Demo,用一个球去撞击一堵墙,结果在球和墙都设置了刚体和碰撞体的情况下,球穿过了墙.移动球的位置,球有时能穿过墙,有时会被墙阻挡. 对于球穿过了墙,这个问题,在网上找了一下答案,基本 ...

  7. align使图片和文字居中

    <img src=...  align=absmiddle />

  8. 总结一下今天做的unity面试题(一):刚体的点击事件

    按照需求,由于要模拟丧尸被击中的效果,不能使用CharactorControll组件,只能使用rigidbody组件. 首先在场景上摆好僵尸和相机的位置,这里就不给相机加脚本了,直接固定住. 然后给丧 ...

  9. physx之刚体运动

    [线性速度与角速度] PxRigidBody的速度由线性速度和角速度构成, 可以分别通过setLinearVelocity和setAngularVelocity进行设置.需要注意的是, 刚体的角速度总 ...

随机推荐

  1. 【HDOJ】4341 Gold miner

    分组01背包.在一条直线上的点归为一组. /* 4341 */ #include <iostream> #include <sstream> #include <stri ...

  2. Android-xUtils框架介绍(一)

    Android基于快速开发的一个框架——xUtils,它是在aFinal基础上进行重构和扩展的框架,相比aFinal有很大的改善.同时,如果如果你的应用是基于网络的,那么只要处理得当,它会让你彻底的摆 ...

  3. 将非WPF window设为 WPF Window的Owner

    如果WPF Content是寄宿在Win32 窗体或Windows Form中,则在WPF模块中可能不会存在WPF Window(WPF模块的根可能是个UserControl).如果在WPF模块中弹出 ...

  4. hdu2642Fliping game

    http://acm.hdu.edu.cn/showproblem.php?pid=4642 这题..刚一看以为是什么高深的博弈 后来看过的人挺多 想是不是有什么规律 结果理解错题意了 以为随便圈一矩 ...

  5. js 动态计算折扣后总价格

    <script type="text/javascript"> <!---计算折扣后的总价格---> function outtotalprice(i) { ...

  6. oracle 分组排序

    SELECT * FROM (SELECT A.*, RANK() OVER(PARTITION BY A.DR_ATP_ID, A.AT_CODE ORDER BY A.KEY_CODE) RANK ...

  7. ☀【Grunt】插件

    Grunt Pluginshttp://gruntjs.com/plugins grunt-contrib-sass sass: { compile: { files: { 'css/core.css ...

  8. git提交小结

    git有工作区和暂存区的概念,工作区就是可以看到文件目录的地方,暂存区则是提交代码的地方 第一步,进入文件工作目录,终端输入命令 $ dir1/dir2: 第二步,查看哪些文件已经修改,输入命令 $ ...

  9. SharePoint Security and Permission System Overview

    转:http://www.sharepointblues.com/2010/09/01/sharepoint-security-and-permission-system-overview/ Shar ...

  10. Apache,PHP,MySQL的安装,配置

    Apache 1. 下载 Apache版本号为2.2.22. 最好下载msi安装文件.下载地址为:http://www.apache.org/dist/httpd/binaries/win32/ 如果 ...