Body模块

通过给物体传入一些属性值,来操作物体或者改变物体的属性

1 .提供各种方法和属性,用于创建和操作Bodies模块种的函数创建的实体
4 .有的时候我们只是想要控制其中几个实体的特性

给物体一些力

1 .旋转 Body.rotate(box,Math.PI/6) 如何围绕一个点转呢?
2 .缩放 Body.scale(box,1.5,1.5)
3 .移动 Body.translate(box,{x:10,y:10})
4 .改变物体的线性速度 Body.setVelocity(circle,{x:0,y:-10})
5 .改变物体的角速度 Body.setAngularVelocity(middele,Math.PI/6)
6 .直接给物体一个力

给物体添加一些物理属性-bodies创建的时候加的,但是属性是继承自这里

1 .物体的弹力
2 .动态摩擦力
3 .静态摩擦力
4 .空气阻力
5 .渲染物体的一些类似css的样式
6 .设置物体的位置
7 .设置物体的质量
8 .设置物体的密度:通过 这个属性来控制物体的质量,他的质量将根据其面积自动计算。通过这种方式,可以通过密度来区分不同的对象
9 .物体的状态
10 .物体的硬度
11 .物体的比热
12 .物体的磁性
13 .熔点
14 .沸点
15 .延展性
16 .从9以后都是没有的。但是我觉得硬度是挺有用的,不知道可不可以扩展原来的
17 .碰撞之后的表现形式,一个函数来根据收到的力,决定自己的形变状态
18 .是否会破碎,有的碰撞物体会分解,有的只是会形变

配置的属性

const ti=Bodies.trapezoid(100,100,200,50,0.01,{
    // body-create物体的配置参数
    // angle:Math.PI/2,
    // angularSpeed:1,
    // 旋转的角速度,

    // area:
    // 物体的面积

    // axes:
    // 用于碰撞检测的唯一轴向量阵列,并在Body.update的过程不断更新

    // bounds:边界
    // 定义aabb为体对象,从给定的vertices阵列中自动计算出来,并会在给定模拟的过程中不断更新

    collisionFilter:{
        // group:-1,
        // category:1,
        // mask:2,
        // 两个都是负数,两个都相等,永远不会碰撞,两个属性都是-1那么会穿过去

        // 两个都是正数,两个都相等,永远都会碰撞

        // 两个不相等的时候,根据以下条件判断

        // category:设置一个碰撞位,即标记。值为[1,2-31]一共可以有32种不同的结果
        // mask:可以接收碰撞的集合:比如我自己是的category是1,我想和设置了4的碰撞,这个值就是必须>=4(他的值必须是1+2+4+8这种值的结果),同理

        // 对方的category必须是4,mask必须是大于1
    },
    density:0.05,
    // 定义了密度,会根据面积自动更新物体的体积

    force:{
        x:10,
        y:10
    },
    // 定义一个初始的力

    // friction:0.5,
    // 摩擦力:0表示没有摩擦力,永远不会停下来,1意味着施加力之后身体可以立即停止运动

    // frictionAir:0.9,
    // 空气摩擦力,0表示不会不会受到空气的干扰,永远不会减速,值越大,物体在空间移动时速度越慢,该值的影响是非线性的

    // firctionStatic:1,
    // 静摩擦力

    // inertia:,
    // 不知道是啥用

    // inverseIntertia:
    // 不知道是啥用

    // inverseMass:
    // 定义主体的反质量

    // isSensor:true,
    // 指示身体是否有传感器,传感器触发碰撞事件,但不会与物理盆装物体发生反应

    // isSleeping:false,
    // 指示身体是否被视为睡眠提,一个沉睡的身体的行为类似于静止的身体,除了他只是暂时的,可以被唤醒

    // isStatic:false,
    // 只是是否讲身体是为静态物体

    // label:"libatere",
    // 加一个字符串,便与管理
    
    // mass:20
    // 物体的质量

    // motion:
    // 目前的动量组合,他是只读的

    // parent:
    // 如果身体不是零一身体的一部分,则是自我引用,否则这是对身体的引用

    // parts:
    // 构成这个身体的一系列身体,数组中的第一个主体必须始终是对当前主体实例的自我引用
    // parts阵列中的所有物体一起形成单个刚性复合体。允许部件重叠,具有间隙或孔甚至是凹体。
    // 单个的零件本身永远不要添加到world里面,只有组合成父体才应该加入到世界里面去

    // position:{
    //     x:100,
    //     y:100
    // },
    // 物体在当前世界空间的位置

    render:{
        fillStyle:"red",
        // 填充颜色
        lineWidth:2,
        // 轮廓宽度
        opacity:0.5,
        // 透明度
        sprite:{
            // 添加图片
            // texture:'',
            xOffset:"",
            // x方向偏移位置
            yOffset:"",
            // xScale:,
            // x轴缩放

            // yScale:,
            // y轴缩放


        },

    },
    restitution:1,
    // 定义弹性
    // sleepThreshold:60,
    // 不知道用法

    // slop:0.05,
    // 稳定堆叠,定义两个物体之间的距离的容差

    // speed:0,
    // 进入世界的速度

    // timeScale:0.3,
    // 时间尺度,调节镜头的速度,快还是慢

    // torque:0,
    // 当前步骤应用的扭矩

    // type:Body,
    // 表示对象的类型

    // vertices:[],
    // 一组Vector对象,指定刚体的凸包。传递时Body.create,顶点相对于Body.position进行平移,这些
    // vector对象还增加了有效碰撞检测所需的附加属性
})

2 .可以操作的方法

 // Body.applyForce(ti,{x:ti.position.x,y:ti.position.y},{x:0.1,y:-0.3})
            // 添加一个力

            // console.log(Body.nextCategory())
            // 返回下一个唯一类别位域

            // console.log(Body.nextGroup())
            // 返回实体将要发生碰撞的下一个唯一组索引

            // Body.rotate(ti,Math.PI/4,{x:0,y:0})
            // 旋转一个实体

            // Body.scale(ti,1.1,1.1,{x:0,y:0})
            // 缩放一个实体,相关物理属性也会被缩放

            // console.log(ti)
            // Body.set(ti,"isStatic",true)
            // 设置给定的的属性和值。下面是一堆包装的用法
            // console.log(ti)

            // Body.setAngle(ti,Math.PI/3)
            // 设置物体的角度,其余参数不变

            // Body.setAngularVelocity(ti,1)
            // 设置物体的角速度,位置,角度等不变

            // Body.setDensity(ti,0.9)
            // 设置身体的密度,质量和惯性会自动更新以反映变化

            // Body.setIntertia(ti,1)
            // 设置物体的惯性,其余属性会自动更新

            // Body.setMass(ti,10000)
            // 设置物体的质量,密度,惯性会自动更新变化

            // Body.setParts(ti,)
            // 设置部分body并更新质量,惯性和质心。

            // Body.setPosition(ti,{x:200,y:100})
            // 设置物体的位置

            // Body.setStatic(false)
            // 将主体设置为静态,包括将isStatic设置为false,质量和惯性设置为无限

            // Body.setVelocity(ti,0.5)
            // 设置物体的线速度,位置,角度,力等不变

            // Body.setVertices()
            // 设置新的顶点,并更新主体属性

            // Body.translate(ti,{x:10,y:-10})
            // 移动这些单位向量的距离

            // Body.update(ti,1,0.1,1)
            // 更新某一个时间段
            // 他这些示例函数只是给了传入参数的类型,但是数字类型需要给传入的范围和单位吧

3 .可以被监听的事件

 // setInterval(()=>{
        //     Body.applyForce(ti,{x:ti.position.x,y:ti.position.y},{x:0.1,y:-0.3})
        // },1000)
        

        // 可以触发的事件
        Events.on(ti,"sleepEnd",(e)=>{
            console.log('end')
        })
        Events.on(ti,"sleepStart",(e)=>{
            console.log('start')
        })


//粘连两个物体
let boxA=Bodies.rectangle(300,300,500,100)
let boxB=Bodies.rectangle(300,300,100,500)

const cpu=Body.create({
    parts:[boxA,boxB]
    // 如何按照特殊的坐标粘连呢?
})

2 .官网demo

var bodyA = Bodies.rectangle(100, 200, 50, 50,{isStatic:true}),
        bodyB = Bodies.rectangle(200, 200, 50, 50),
        bodyC = Bodies.rectangle(300, 200, 50, 50),
        bodyD = Bodies.rectangle(400, 200, 50, 50),
        bodyE = Bodies.rectangle(550, 200, 50, 50),
        bodyF = Bodies.rectangle(700, 200, 50, 50),
        bodyG = Bodies.circle(400, 100, 25),
        partA = Bodies.rectangle(600, 200, 120, 50),
        partB = Bodies.rectangle(660, 200, 50, 190),
        compound = Body.create({
            parts: [partA, partB],
            isStatic: true
        });

// World.add(engine.world, [bodyA, bodyB, bodyC, bodyD, bodyE, bodyF, bodyG, compound]);
World.add(engine.world, [bodyB,bodyC,bodyD]);
let counter=0;
let scaleFactor=1.01
Events.on(engine,'beforeUpdate',(e)=>{
    counter+=1
    if(counter===400){
        Body.setStatic(bodyG,true)
        // 过一段时间让他变成静止物体
    }

    if(scaleFactor>1){
        Body.scale(bodyF,scaleFactor,scaleFactor)

        bodyE.vertices[0].x -= 0.3;
        bodyE.vertices[0].y -= 0.3;
        bodyE.vertices[1].x += 0.1;
        bodyE.vertices[1].y -= 0.1;
        // 按照这个速度变换新的顶点,并且可以更新主体属性,包括惯性,面积,和质量
        Body.setVertices(bodyE, bodyE.vertices);

        Body.scale(compound,0.995,0.995)

        // 然后使用新的,可以做出形变    
    }

    var py = 300 + 100 * Math.sin(engine.timing.timestamp * 0.002);
    // Body.setVelocity(bodyA, { x: 0, y: py - bodyA.position.y });
    // 改变线速度,好像没啥用

    // Body.setPosition(bodyA, { x: 100, y: py });
    // 改变位置方法1:

    // Body.applyForce(bodyA,{x:bodyA.position.x,y:bodyA.position.y},{x:0,y:0.00001})
    //改变位置方法2: 这个物体设置isStatic的时候applyForce是不能调节位置的


    Body.setVelocity(compound, { x: 0, y: py - compound.position.y });
    // 设置线速度

    // Body.setAngularVelocity(compound, 0.02);
    // 设置角速读

    Body.setPosition(compound, { x: 600, y: py });
    // 设置位置

    // Body.rotate(compound, 0.02);
    // 旋转
 




    if (counter >= 60 * 1.5) {
            Body.setVelocity(bodyB, { x: 0, y: -20 });
            // 给一个线速度,有点像给了一个力

            Body.setAngle(bodyC, -Math.PI * 0.26);
            // 设置身体的角度。类似于rotate的一半操作

            Body.setAngularVelocity(bodyD, 0.5);
            // 设置身体的角速度

            // reset counter

            // 根据一些变量来确定渲染样式,然后在一段时间之后重置,避免涨爆
            counter = 0;
            scaleFactor = 1;
        }


})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容

  • 首先要熟悉一些基本的力学名词及相关公式 刚体(Rigidbody):刚体是指在运动中和受到力的作用后,形状和大小不...
    FLY旳影子阅读 11,526评论 0 11
  • 不停的挖坑不懂是埋葬自己,还是想上刨出路来…看着倒数的逼近,焦虑狂躁,什么都没有准备清楚,不懂如何把这些内容存入空...
    兰蓝天阅读 258评论 0 0
  • 《乱乱的自白》 <1> 昨天完成了暑假计划中电影部分的七分之一,看了《魂断蓝桥》,我自己的感觉是像极了《罗马假日》...
    比肩同立阅读 114评论 0 1
  • 作业: 不知道画什么图案好,就随意画了一点。 感觉不太好,想折一个盛东西的小篮,纸不够硬~
    建晋阅读 249评论 3 2