今天是陪了我們兩天的剛體的最後一集,是不是開始有點想念它了呢?
那沒關係,好好珍惜我們今天跟剛體相處的環節,如果懷念它,可以再回去複習前面的環節。
第一天我們講了能夠快速創建的幾種圖形,第二天我們講了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 中對於物體的創件方式、參數能夠調整的部分、以及操作物體時呼叫的一些函式,如果對上面說的這些仍沒有概念,可以提出來討論或再回去前面的篇幅走一遍,在現在已然走過第一遍的當下,相信從頭看又會有些不一樣的體驗。
那麼我們今天的單元到此結束,明天我們來做個小實作驗證一下這幾天我們所學。