zoukankan      html  css  js  c++  java
  • Nape刚体body.align();

    (转载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, 300, 300, -100, -100, 50, 200);
                var r2:Polygon = new Polygon(Polygon.rect(100, -100, 50, 200));
                r2.body = rect;
    
                var btn:PushButton = new PushButton(this, 450, 100, "rect.align()", 
                function():void {
                    rect.align(); 
                    btn.enabled = false; 
                    } 
                    )
                
                trace(rect.position)
                trace(rect.localCOM)
            }
  • 相关阅读:
    HAproxy 1.5 dev14 发布
    IBM/DW 使用 Java 测试网络连通性的几种方法
    Skype 4.1 Linux 发布,支持微软帐号登录
    Dorado 7.1.20 发布,Ajax的Web开发平台
    Aspose.Slides for Java 3.0 发布
    开发版本 Wine 1.5.18 发布
    BitNami Rubystack 开始支持 Ruby 2.0
    XWiki 4.3 正式版发布
    Silverlight实例教程 Out of Browser的Debug和Notifications窗口
    Silverlight实例教程 Out of Browser与Office的互操作
  • 原文地址:https://www.cnblogs.com/ddw1997/p/3169507.html
Copyright © 2011-2022 走看看