(转载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. 条件与(&&)和逻辑与(&)以及条件或(||)和逻辑或(|)区别

    条件与(&&)和逻辑与(&)以及条件或(||)和逻辑或(|)区别在于它们的运算结果是不相同的. 条件与(&&)和条件或(||)采用的是所谓的"短路规则 ...

  2. NPAPI插件开发

    1.插件是什么 插件是一种遵循一定规范的应用程序接口编写出来的程序.插件必须依附于一个宿主程序,为宿主程序提供增强功能.插件的种类有很多,这里主要讨论浏览器插件. IE下利用OLE和COM技术开发的浏 ...

  3. 1136. Parliament(二叉树)

    1136 先由后左 再父 建一个二叉树 #include <iostream> #include<cstdio> #include<cstring> #includ ...

  4. poj3265

    考状态的dp 我的方法可能比较奇怪 设f[i,j]表示第i个月解决j个问题可以最多解决到第几个问题 容易知道,答案(月份)不会超过2n+1: f[i,j]=max(f[i-1,k]+j) 复杂度为O( ...

  5. BMap介绍

    API引用路径: <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&am ...

  6. HTML5 离线功能介绍

    HTML5 是目前正在讨论的新一代 HTML 标准,它代表了现在 Web 领域的最新发展方向.在 HTML5 标准中,加入了新的多样的内容描述标签,直接支持表单验证.视频音频标签.网页元素的拖拽.离线 ...

  7. data guard折腾记一

    终于有空闲的机器腾出来了,生产环境上的一套Oracle环境终于可以鸟枪换炮了,生产环境有Data Guard,为了减少停机时间,而且避免重新构建Data Guard的麻烦(其实也不麻烦,就是浪费时间) ...

  8. Java、JSP获得当前日期的年、月、日

    Java package com.ob; import java.text.ParseException; import java.text.SimpleDateFormat; import java ...

  9. 学习面试题Day09

    一.Java基础部分 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相 ...

  10. Android LayoutInflater&LayoutInflaterCompat源码解析

    本文分析版本: Android API 23,v4基于 23.2.1 1 简介 实例化布局的XML文件成相应的View对象.它不能被直接使用,应该使用getLayoutInflater()或getSy ...