iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0
Modern Web

在JS的世界碰碰撞撞乒乒乓乓!30天一起玩Matter.js!系列 第 8

Day8. 依點成形,創造物件 - RigidBody(下)

  • 分享至 

  • xImage
  •  

今天是陪了我們兩天的剛體的最後一集,是不是開始有點想念它了呢?

那沒關係,好好珍惜我們今天跟剛體相處的環節,如果懷念它,可以再回去複習前面的環節。

今天的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 中對於物體的創件方式、參數能夠調整的部分、以及操作物體時呼叫的一些函式,如果對上面說的這些仍沒有概念,可以提出來討論或再回去前面的篇幅走一遍,在現在已然走過第一遍的當下,相信從頭看又會有些不一樣的體驗。

那麼我們今天的單元到此結束,明天我們來做個小實作驗證一下這幾天我們所學。


上一篇
Day7. 依點成形,創造物件 - RigidBody(中)
下一篇
Day9. 一起動手做彈珠台!(1)
系列文
在JS的世界碰碰撞撞乒乒乓乓!30天一起玩Matter.js!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言