• 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)
            }
  • 相关阅读:
    Tree(未解决。。。)
    Fractal(递归,好题)
    Scrambled Polygon(凸多边形,斜率)
    ZYB's Game(博弈)
    Dancing Stars on Me(判断正多边形)
    Hidden String(深搜)
    1043
    TEX Quotes(字符串,水)
    Candy Sharing Game(模拟搜索)
    hpu校赛--雪人的高度(离散化线段树)
  • 原文地址:https://www.cnblogs.com/ddw1997/p/3169507.html
Copyright © 2020-2023  润新知