2. 입자 하나
- 먼저 입자 하나를 작성하기 위해 2장의
Mover클래스를 템플릿으로 사용합시다.class Particle {
constructor(x, y) {
this.position = createVector(x, y);
this.velocity = createVector();
this.acceleration = createVector();
}
update() {
this.velocity.add(this.acceleration);
this.position.add(this.velocity);
this.acceleration.mult(0);
}
display() {
stroke(0);
fill(175);
circle(this.position.x, this.position.y, 8);
}
} - 이를 기반으로 여러 기능을 추가할 수 있습니다.
- 예를 들어
applyForce()를 추가하면 입자에 힘을 줄 수 있습니다. - 색상과 모양을 나타내는 변수를 추가하거나
p5.Image를 사용할 수도 있어요.
- 예를 들어
입자의 수명
- 지금은 수명(life span) 에 집중해 봅시다.
- 파티클 시스템에는 일반적으로 방출구(emitter) 를 갖습니다.
- 방출구는 입자가 만들어지는 곳으로, 입자를 만들 때 초기 위치, 속도 등을 설정할 수 있습니다.
- 입자를 하나씩 방출하기도 하고, 연속적으로 쏟아내기도 합니다.
- 방출구에서 생성된 입자는 영원히 살아 있을 수 없습니다. 파티클이 무한히 늘어나 프로그램이 중단될 것이기 때문입니다.
- 새 입자가 생성되면 사라져야 프로그램에 무리 없이 입자가 계속 생성되는 것처럼 보이게 할 수 있습니다.
- 입자를 언제 소멸시킬 지 결정하는 방법은 다양합니다.
- 다른 입자와 충돌하는 경우
- 화면을 벗어나는 경우 등
- 여기서는
lifespan이라는 변수를 만들어 특정 시간 동안만 입자가 살아있게 만들 것입니다. - 이 변수는 255에서 시작해 시간이 경과하면 0이 되고, 0이 되는 순간 해당 입자를 제거할 것입니다.
class Particle {
constructor(x, y) {
this.position = createVector(x, y);
this.velocity = createVector();
this.acceleration = createVector();
this.lifespan = 255; // 입자의 수명
}
update() {
this.velocity.add(this.acceleration);
this.position.add(this.velocity);
this.acceleration.mult(0);
this.lifespan -= 2.0; // 수명 감소
}
display() {
// 수명은 0~255 값이므로 투명도 값에도 사용 가능
stroke(0, this.lifespan);
fill(175, this.lifespan);
circle(this.position.x, this.position.y, 8);
}
} lifespan변수로 입자가 살아있는지 판단하는 함수를 추가합니다.boolean isDead(){
return (this.lifespan < 0.0);
}
예제 코드 4.1: 입자 하나
let particle;
function setup() {
createCanvas(640, 240);
particle = new Particle(width / 2, 20);
}
function draw() {
background(255);
particle.update();
particle.display();
// 중력 적용
let gravity = createVector(0, 0.1);
particle.applyForce(gravity);
// 파티클 소멸과 생성
if (particle.isDead()) {
particle = new Particle(width / 2, 20);
console.log("The particle is dead!");
}
}
class Particle {
constructor(x, y) {
this.position = createVector(x, y);
this.velocity = createVector(random(-1, 1), random(-2, 0)); // 임의의 속도 부여
this.acceleration = createVector(0, 0);
this.lifespan = 255.0;
}
isDead() {
return this.lifespan < 0.0;
}
applyForce(force) {
this.acceleration.add(force);
}
update() {
this.velocity.add(this.acceleration);
this.position.add(this.velocity);
this.acceleration.mult(0);
this.lifespan -= 2.0;
}
display() {
stroke(0, this.lifespan);
fill(127, this.lifespan);
strokeWeight(2);
circle(this.position.x, this.position.y, 8);
}
}
- 입자의 수명이 다할 때마다
particle변수는 새Particle인스턴스로 대체됩니다. - 이전
Particle인스턴스는 삭제된 것이 아니라 코드 내에서 더 이상 접근할 수 없거나 사용할 수 없습니다.
연습 문제 4.1
Particle 클래스에 update(), display(), applyForce() 를 처리하는 run() 메소드를 만드세요. 이 접근 방식의 장단 점은 무엇일까요?
연습 문제 4.2
파티클에 각속도(회전)를 추가하고, 파티클이 원이 아닌 모양이 되도록 디자인해 회전 운동이 드러나게 해보세요.