Day8. 依点成形,创造物件 - RigidBody(下)

今天是陪了我们两天的刚体的最後一集,是不是开始有点想念它了呢?

那没关系,好好珍惜我们今天跟刚体相处的环节,如果怀念它,可以再回去复习前面的环节。

今天的Demo

今天的Demo原始码

https://ithelp.ithome.com.tw/upload/images/20210923/20142057qVjLdvsh1X.png

第一天我们讲了能够快速创建的几种图形,第二天我们讲了Body本身操控的几种方法,第三天我们要来到的是关於Body创建的详细选项参数,基本上有参数的都有对应方法可以修改,所以第二天有些没讲到的方法,可能也会在今天提到对应参数的时候一起讨论。

今天的范例程序码中有两个物体,第一个命名为defaultValues的推荐大家不要动它,当作参考就好,它所有参数都是官方模组中的预设值,参数的排序是官方原始文档中的顺序。另一个命名为modifiedObject的大家可以尽量玩它,跟着下面的说明动动它的参数,来看看它会怎麽跟其他既存的图形互动。这边的参数排序会依笔者下面文章介绍顺序为主,方便大家顺顺的看,初始的时候是一颗星的形状喔>_0

基本参数大概就是我们昨天介绍到的那些,包括构成点、位置、施力、力矩,物体初速/角度,质量/密度等等,这边的参数应该都相对直观,大家可以直接改动来了解参数改动造成的影响,或是参考我们的中篇,有比较多详细的解说。

vertices: Vertices.fromPath(starPath),//points form the object
position: { x: 200, y: 100 },
force: { x: 0, y: 0 },
torque: 0,
totalContacts: 0,
speed: 0,
angle: 0, //angle in radius
angularSpeed: 0,
velocity: { x: 5, y: 0 },
angularVelocity: 0,
mass: 0,//Mass of a body, if update will update density and inverseMass in the same time
density: 0.001,

再来是关於物体的一些特性定义:

isSensor 主要用於让物体触发碰撞事件,也就是接触到後会发出对应的trigger,但是本身并不和其他物体碰撞。

isStatic 会是让物体完全静止,不受任何力影响,向我们的ground,它的isStatic就是true,它从我们的第一个范例就出来和我们见面罗!

isSleeping 和Static相似,不同的在於isSleeping初始化後是可以改动的,可以透过 Sleeping 模组中的 Sleeping.set 来做调整。

sleepThreshold 是一个检测值,当engine的enableSleeping为true,用於检测要让物体变为Sleep状态时必须经过的update数。

restitution 的中文是恢复,其实应该就是在讲物理中的恢复系数,允许值为 0 ~ 1,0表示发生碰撞後完全不弹跳,1为完全弹性碰撞,可以参考我们定义的circleA,调整看看值观察它从空中坠落後的弹跳状况。

isSensor: false, //Will trigger collision events, but doesn't react with colliding body physically.
isStatic: false, //A static body can never change position or angle and is completely fixed
isSleeping: false, //A sleeping body acts similar to a static body, except it is only temporary and can be awoken. Use Sleeping.set to update.
sleepThreshold: 60, //Before call sleep, velocity should below this value
restitution: 0, //Between 0~1, related to bouncing back percentage of its kinetic energy

第三个部份我们来到物体的外貌显示,这边我想也是大家很熟悉的参数,属於看名字大概能明白它在做什麽的区块,texture有接触过一些游戏相关或建模的可能会比较熟悉,中文会译为纹理,会直接。其他值得一提的会是像 fillStyle 、 strokeStyle,是可以吃 CSS 样式的,大家可以尝试看看。

//Related to display
render: {
    visible: true,
    opacity: 1,
    strokeStyle: null,
    fillStyle: null,//accept css fill
    lineWidth: 2,//out line, 0/null will not render
    sprite: {
				texture:"../Img/fox.png",
        xScale: 1,
        yScale: 1,
        xOffset: 0,
        yOffset: 0
    }
},

第四部份会是碰撞参数:

collisionFilter: {
    group: 0, //Non-zero positive value means will collision, negative means wont collision, if more than 
    category: 0x0001, //Only the same category will collision on another
    mask: 0x0,
},

碰撞参数的规则是,先看 group ,如果为负值则不碰撞,如果两个物体 group 值一样,则会碰撞,当Group不一样且为非负值的话会对 category 和 mask (以二进制表示,不熟悉这种表示的人可以参考这个 )进行以下判断:

var isCollision = (categoryA & maskB) !== 0 && (categoryB & maskA) !== 0

当值为真的时候才会发生碰撞,可以理解为 category 是物体种类,mask 则规定该物体会与那些物体种类发生碰撞。

也就是以上面的例子,星星是不会和其他碰撞的,因为 default group,星星的group都为0,会套用上面这个比较式,而星星的 mask 为 0x0,和任何东西做 & (AND 逻辑运算)都不会为非0,故以上面这个参数跑起来,星星掉落会直接穿过地板。

最後一个是阻力相关,阻力的来源在物理中有很多种,例如摩擦力。这里我们可以设定物体的阻力和阻力系数,也能单独设定物体受到的空气阻力,来决定物体受力时的移动程度。

// Related to velocity
friction: 0.1,//阻力
frictionStatic: 0,//Multiple with friction, if 0 means always no stop
frictionAir: 0.01,//空气阻力

虽然下面还有一些其他的参数,我们上面为什麽会说是最後一个区块呢?因为剩下的参数除非你有足够的了解,否则建议一律保持预设值,有些是自动计算的值,有些是api文件在笔者撰写的当下已未提及的属性,也有些是相对进阶的数值。

当然,在今天的范例里你可以随意调动他们测试,但笔者不会深入去解释,有些有写注解可以参考名词。

// Related to convex hull, will auto computed
area: 0,
axes: null,

// Set init events, can use Matter.Event.on to attach directly after created
events: null,

// Combination, pass first
parent: null,
parts: [],
plugin: {},

// Advance value in the properties, if you not familiar with physics, suggest keep those in default
// Some not found in api doc (https://brm.io/matter-js/docs/classes/Body.html#properties) also put here
slop: 0.05,//一个允许物体陷入其他物体的容忍值
inertia: 0,//惯性
timeScale: 1,
bounds: null,
_original: null,
chamfer: null,
positionPrev: null,
anglePrev: 0,
circleRadius: 0,
motion: 0,
positionImpulse: { x: 0, y: 0 },
constraintImpulse: { x: 0, y: 0, angle: 0 },
totalContacts: 0,

到今天为止,我们已经清楚 Matter.js 中对於物体的创件方式、参数能够调整的部分、以及操作物体时呼叫的一些函式,如果对上面说的这些仍没有概念,可以提出来讨论或再回去前面的篇幅走一遍,在现在已然走过第一遍的当下,相信从头看又会有些不一样的体验。

那麽我们今天的单元到此结束,明天我们来做个小实作验证一下这几天我们所学。


<<:  [08] 回声多个 media 讯息

>>:  Day-12 决策树(decision tree)

十五分钟内介绍产品与服务

由於现在身兼多职的情况,能够进行业务开发的时间也不多,因此如何有效地介绍产品是一件很重要的事情,到目...

Day 21 - Handle Side Effect I

在介绍本篇我们先来复习一下先前在 pure function 那章提过的一些名词 Side Effe...

开放封闭原则 Open-Closed Principle

在上一篇文章当中,我们提到「单一功能原则」,指每一个类别只会因为一种原因被修改。那麽,如果真的遇到需...

Dungeon Mizarka 017

修正A★资料 专案前期就导入了A★并以它的格状资料做为移动的判定,不论是玩家和怪物都是利用此资料做移...

DAY06 - 常用的网路服务

今天是铁人赛的第六天,内容是我在自学过程所会使用的网站服务 CodePen CodePen这个神奇的...