오늘은 다른 물체를 하나 더 만들어, 상자가 충돌에 의해 경험하는 물리현상을 우리 눈으로 볼 수 있도록 만들어 보겠습니다~^^*
음…저는…화면 아랫부분에 두꺼운 선반을 하나 걸쳐 놓고 싶어요.
너비는 화면 너비만큼~ 두께는 50 pixel 정도로 해 볼게요~
matter.js의 물체의 위치좌표는 물체의 중심을 나타내게 되니까….그리고 우리의 캔버스가 400*400 이니까… x좌표는 화면 정가운데인 200으로 잡고~ y좌표는 화면 바닥에서 50 pixel 올라간 지점으로 잡아 볼게요. 컴퓨터 그래픽에서 y축은 위에서 아래로 커지니까….화면 바닥이 height가 될테니, 우리의 새로운 물체의 y좌표는 height – 50으로 잡아 보겠습니다~~^^*
여기에서 질문 하나 드리겠습니다.
물체의 y 좌표가 height - 50 pixel 이고 두께가 50 pixel이면
(1) 물체는 화면 바닥에 닿아 있다.
(2) 물체는 화면 바닥에서 50 pixel 위로 떠 있다.
(3) 물체는 화면 바닥에서 25 pixel 위로 떠 있다.
(4) 물체는 화면 바닥 위로 25 pixel 보이고 아래로 25 pixel 감추어져 있다.
(힌트는,
(1) matter.js에서 위치 좌표는 물체의 중심을 나타냅니다.
(2) 컴퓨터 그래픽에서 y 축 값이 커질수록 아래로 내려갑니다. )
정답은!
정답은 바로!
네! 정답은 바로!
두구두구두구……네! 맞습니다!
(1) 물체의 윗면: [height -50] - 1/2(50) = height - 50 - 25 = height - 75
(2) 물체의 아랫면: [height - 50] + 1/2(50) = height - 50 + 25 = height - 25
그러므로, 물체의 아랫면이 height - 25 즉 화면 바닥에서 25 pixel 올라와 있습니다~^^*
네!! 정답은 (3)번이 될 것 같습니다!!! 그럼 우리 한 번 확인해 볼까요~^^*
이 물체의 이름을 Boundary라고 부르도록 할게요~~^^* 물체의 생성 방법은 우리의 Box와 동일합니다~~^^*
그런데,이 물체는 선반 역할을 해 줄 것이라, 중력의 영향을 받아 화면 아래로 내려가면 안될 것 같아요. 그래서, Boundary의 위치좌표가 고정될 수 있어야 할 것 같습니다!
여기 옵션 하나 추가해 주세요~~~^^*
constructor(x, y, w, h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
let options = {
friction: 0.3,
restitution: 0.6,
isStatic: true
}
자 그럼 이제 우리~~^^* 전체 코드를 함께 살펴 볼까요~~^^*
<!DOCTYPE html>
<html lang="en">
<head>
https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.6.0/p5.js
https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.6.0/addons/p5.sound.min.js
https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.19.0/matter.min.js
<link rel="stylesheet" type="text/css" href="style.css">
<meta charset="utf-8" />
</head>
<body>
<main>
</main>
http://sketch.js
http://box.js
http://boundary.js
</body>
</html>
class Boundary {
constructor(x, y, w, h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
let options = {
friction: 0.3,
restitution: 0.6,
isStatic: true
}
this.body = Bodies.rectangle(this.x, this.y, this.w, this.h, options);
Composite.add(world, this.body);
}
show() {
let pos = this.body.position;
let angle = this.body.angle;
push();
translate(pos.x, pos.y);
rotate(angle);
rectMode(CENTER);
strokeWeight(1);
noStroke();
fill(0); //세련된 검은 선반을 준비해 봅시다~
rect(0, 0, this.w, this.h);
pop();
}
}
class Box {
constructor(x, y, w, h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
let options = {
friction: 0.3,
restitution: 0.6
}
this.body = Bodies.rectangle(this.x, this.y, this.w, this.h, options);
Composite.add(world, this.body);
}
show() {
let pos = this.body.position;
let angle = this.body.angle;
push();
translate(pos.x, pos.y);
rotate(angle);
rectMode(CENTER);
strokeWeight(1);
stroke(255)
fill(127);
rect(0, 0, this.w, this.h);
pop();
}
}
const { Engine, World, Bodies, Composite } = Matter;
let engine;
let world;
let boxes = [];
let shelf;
function setup() {
createCanvas(400, 400);
engine = Engine.create();
world = engine.world;
shelf = new Boundary(200, height-50, width, 50);
}
function mousePressed() {
boxes.push(new Box(mouseX, mouseY, random(10, 40), random(10,40)));
}
function draw() {
background(51);
Engine.update(engine);
for (let i = 0; i < boxes.length; i++) {
boxes[i].show();
}
shelf.show();
}
이제 세련된 검은 선반 위에 상자들이 때로는 통!통!통! 때로는 와르르~~~~ 그러나 전반적으로는 차~곡차~곡 쌓이는 모습을 구경하러 저와 함께 가실까요~~^^*
네~~^^* 우리는 matter.js의 Physics Engine을 사용하면서~~^^* p5.js에서 rendering을 우리 스스로 조정하면서~~^^*
아주 튼튼한 선반 위에 상자들이 쌓이는 모습을 프로그램으로 완성해 보았습니다~~!!! YEAH~~!!!
우리의 새로운 여정의 첫 강의 동영상을 마무리하게 되었네요~~!!! YEAH~~!!!
추석 연휴를 마치고, 일상으로 돌아가는 열차에 몸을 실은 우리의 새벽.
2번째 creative coding 공부 여정을 시작하는 2등병의 풋풋한 마음으로 열차 창문을 바라보고 계신가요~~^^*
풀 한 포기도 새로운, 일상 DAY 1.
오늘 새벽 저와 함께 matter.js + p5.js 코딩 공부 첫 동영상 강의를 마무리해 주셔서 감사합니다~^^*
풀 한 포기도 새로운 오늘, 그 새로운 풀 한 포기로 자라나는 우리는 새싹들이예요~~!!!
오늘도 멋진 아침! 멋진 하루! 보내시구요~~^^*
내일 우리 또 만나서, matter.js를 좀더 깊게 공부해 볼까요~~?^^*
네~~!!!! 꿈은 이루어 집니다~~!!!!
댓글 남기기