'집'이라는 주제로 프로세싱으로 자유롭게 그림을 그리는 시간이 주어졌다.
이를 바로 실천으로 옮겼다.
전체적인 구조는 이렇다.
1. 집의 바닥이 될 마루바닥을 타원 형태로 생각하여 점 4개를 찍는다.
타원으로 그리는 이유는 시점을 약간 위쪽과 정면을 겹치게끔 해서 그렇다.
quad함수를 이용한다.
2. 마루바닥의 각 꼭짓점에서 기둥 4개를 위로 올린다.
line함수를 이용한다.
3. 올린 기둥위에 지붕을 그린다.
지붕은 마루바닥보다 조금 더 크다.
4. 색칠한다.
이 때, 삼각함수의 범위에 따라 어떤 그림이 먼저 그려질지를 고려해야한다.
triangle과 rect함수를 이용한다.
이유는 즉슨, 실제로 3d모델을 만들어서 이를 그리는 것이 아니라, 2D 그래픽으로 삼각함수를 이용해 3D느낌이 나도록 하는 코드이기 때문에 도형의 그려지는 순서가 중요해진다.
또, 색칠할 때 3D 느낌이 나기 위해서 앞에 있는 면은 밝게, 뒤에 있는 면은 어둡게끔 하였다.
이 때는 fill(x)에서 x의 값을 회전하는 정도에 따라 바뀌게끔 하였다.
5. 마우스 위치에 따라 각 도형의 좌표에 들어가는 삼각함수의 인자를 조절할 변수의 값을 조절한다.
6. 1~5에서 설계한 내용을 바탕으로 필요한 좌표를 계산하여 코드로 짠다.
...이렇게 설계를 하여 짠 코드가 이거다. 좀 길다.
void setup()
{
size(600, 600);
background(0, 0, 255);
frameRate(60);
}
float count=0;
void draw()
{
background(0, 0, 255);
if (mousePressed)
{
count+=pmouseX-mouseX;
}
if (count<0)
count=360;
map(count, 0, 600, 0, 360);
noFill();
noStroke();
/*quad(400+100*cos(radians(count)), 400+25*sin(radians(count)), 400+100*cos(radians(90+count)), 400+25*sin(radians(count+90)), 400+100*cos(radians(180+count)), 400+25*sin(radians(180+count)), 400+100*cos(radians(270+count)), 400+25*sin(radians(270+count)));
quad(400+120*cos(radians(count)), 275+30*sin(radians(count)), 400+120*cos(radians(90+count)), 275+30*sin(radians(count+90)), 400+120*cos(radians(180+count)), 275+30*sin(radians(180+count)), 400+120*cos(radians(270+count)), 275+30*sin(radians(270+count)));
//quad(400+100*cos(radians(count)),275+25*sin(radians(count)),400+100*cos(radians(90+count)),275+25*sin(radians(count+90)),400+100*cos(radians(180+count)),275+25*sin(radians(180+count)),400+100*cos(radians(270+count)),275+25*sin(radians(270+count)));
line(400+100*cos(radians(count)), 400+25*sin(radians(count)), 400+100*cos(radians(count)), 275+25*sin(radians(count)));
line(400+100*cos(radians(90+count)), 400+25*sin(radians(90+count)), 400+100*cos(radians(90+count)), 275+25*sin(radians(90+count)));
line(400+100*cos(radians(180+count)), 400+25*sin(radians(180+count)), 400+100*cos(radians(180+count)), 275+25*sin(radians(180+count)));
line(400+100*cos(radians(270+count)), 400+25*sin(radians(270+count)), 400+100*cos(radians(270+count)), 275+25*sin(radians(270+count)));
line(400+120*cos(radians(count)), 275+30*sin(radians(count)), 400, 200);
line(400+120*cos(radians(count+90)), 275+30*sin(radians(count+90)), 400, 200);
line(400+120*cos(radians(count+180)), 275+30*sin(radians(count+180)), 400, 200);
line(400+120*cos(radians(count+270)), 275+30*sin(radians(count+270)), 400, 200);
fill(255);
/*text(count%360, 50, 50);
text(0, 400+120*cos(radians(count)), 300+30*sin(radians(count)));
text(90, 400+120*cos(radians(count+90)), 300+30*sin(radians(count+90)));
text(180, 400+120*cos(radians(count+180)), 300+30*sin(radians(count+180)));
text(270, 400+120*cos(radians(count+270)), 300+30*sin(radians(count+270)));
*/
if (count%360>=45&&count%360<135)
{
fill(255*sin(radians(count+210))-50);
quad(400+100*cos(radians(count+180)), 400+25*sin(radians(count+180)), 400+100*cos(radians(count+180)), 275+25*sin(radians(count+180)), 400+100*cos(radians(count+270)), 275+25*sin(radians(count+270)), 400+100*cos(radians(count+270)), 400+25*sin(radians(count+270)));
fill(255*sin(radians(count+120))-50);
quad(400+100*cos(radians(count+90)), 400+25*sin(radians(count+90)), 400+100*cos(radians(count+90)), 275+25*sin(radians(count+90)), 400+100*cos(radians(count+180)), 275+25*sin(radians(count+180)), 400+100*cos(radians(count+180)), 400+25*sin(radians(count+180)));
fill(255*sin(radians(count+30))-50);
quad(400+100*cos(radians(count)), 400+25*sin(radians(count)), 400+100*cos(radians(count)), 275+25*sin(radians(count)), 400+100*cos(radians(count+90)), 275+25*sin(radians(count+90)), 400+100*cos(radians(count+90)), 400+25*sin(radians(count+90)));
fill(255*sin(radians(count+300))-50);
quad(400+100*cos(radians(count+270)), 400+25*sin(radians(count+270)), 400+100*cos(radians(count+270)), 275+25*sin(radians(count+270)), 400+100*cos(radians(count)), 275+25*sin(radians(count)), 400+100*cos(radians(count)), 400+25*sin(radians(count)));
} else if (count%360>=135&&count%360<225)
{
fill(255*sin(radians(count+120))-50);
quad(400+100*cos(radians(count+90)), 400+25*sin(radians(count+90)), 400+100*cos(radians(count+90)), 275+25*sin(radians(count+90)), 400+100*cos(radians(count+180)), 275+25*sin(radians(count+180)), 400+100*cos(radians(count+180)), 400+25*sin(radians(count+180)));
fill(255*sin(radians(count+30))-50);
quad(400+100*cos(radians(count)), 400+25*sin(radians(count)), 400+100*cos(radians(count)), 275+25*sin(radians(count)), 400+100*cos(radians(count+90)), 275+25*sin(radians(count+90)), 400+100*cos(radians(count+90)), 400+25*sin(radians(count+90)));
fill(255*sin(radians(count+300))-50);
quad(400+100*cos(radians(count+270)), 400+25*sin(radians(count+270)), 400+100*cos(radians(count+270)), 275+25*sin(radians(count+270)), 400+100*cos(radians(count)), 275+25*sin(radians(count)), 400+100*cos(radians(count)), 400+25*sin(radians(count)));
fill(255*sin(radians(count+210))-50);
quad(400+100*cos(radians(count+180)), 400+25*sin(radians(count+180)), 400+100*cos(radians(count+180)), 275+25*sin(radians(count+180)), 400+100*cos(radians(count+270)), 275+25*sin(radians(count+270)), 400+100*cos(radians(count+270)), 400+25*sin(radians(count+270)));
} else if (count%360>=225&&count%360<315)
{
fill(255*sin(radians(count+30))-50);
quad(400+100*cos(radians(count)), 400+25*sin(radians(count)), 400+100*cos(radians(count)), 275+25*sin(radians(count)), 400+100*cos(radians(count+90)), 275+25*sin(radians(count+90)), 400+100*cos(radians(count+90)), 400+25*sin(radians(count+90)));
fill(255*sin(radians(count+300))-50);
quad(400+100*cos(radians(count+270)), 400+25*sin(radians(count+270)), 400+100*cos(radians(count+270)), 275+25*sin(radians(count+270)), 400+100*cos(radians(count)), 275+25*sin(radians(count)), 400+100*cos(radians(count)), 400+25*sin(radians(count)));
fill(255*sin(radians(count+210))-50);
quad(400+100*cos(radians(count+180)), 400+25*sin(radians(count+180)), 400+100*cos(radians(count+180)), 275+25*sin(radians(count+180)), 400+100*cos(radians(count+270)), 275+25*sin(radians(count+270)), 400+100*cos(radians(count+270)), 400+25*sin(radians(count+270)));
fill(255*sin(radians(count+120))-50);
quad(400+100*cos(radians(count+90)), 400+25*sin(radians(count+90)), 400+100*cos(radians(count+90)), 275+25*sin(radians(count+90)), 400+100*cos(radians(count+180)), 275+25*sin(radians(count+180)), 400+100*cos(radians(count+180)), 400+25*sin(radians(count+180)));
} else
{
fill(255*sin(radians(count+300))-50);
quad(400+100*cos(radians(count+270)), 400+25*sin(radians(count+270)), 400+100*cos(radians(count+270)), 275+25*sin(radians(count+270)), 400+100*cos(radians(count)), 275+25*sin(radians(count)), 400+100*cos(radians(count)), 400+25*sin(radians(count)));
fill(255*sin(radians(count+210))-50);
quad(400+100*cos(radians(count+180)), 400+25*sin(radians(count+180)), 400+100*cos(radians(count+180)), 275+25*sin(radians(count+180)), 400+100*cos(radians(count+270)), 275+25*sin(radians(count+270)), 400+100*cos(radians(count+270)), 400+25*sin(radians(count+270)));
fill(255*sin(radians(count+120))-50);
quad(400+100*cos(radians(count+90)), 400+25*sin(radians(count+90)), 400+100*cos(radians(count+90)), 275+25*sin(radians(count+90)), 400+100*cos(radians(count+180)), 275+25*sin(radians(count+180)), 400+100*cos(radians(count+180)), 400+25*sin(radians(count+180)));
fill(255*sin(radians(count+30))-50);
quad(400+100*cos(radians(count)), 400+25*sin(radians(count)), 400+100*cos(radians(count)), 275+25*sin(radians(count)), 400+100*cos(radians(count+90)), 275+25*sin(radians(count+90)), 400+100*cos(radians(count+90)), 400+25*sin(radians(count+90)));
}
if (count%360>=30&&count%360<120)
{
fill(255*sin(radians(count+210)));
triangle(400, 200, 400+120*cos(radians(count+180)), 275+30*sin(radians(count+180)), 400+120*cos(radians(count+270)), 275+30*sin(radians(count+270)));
fill(255*sin(radians(count+120)));
triangle(400, 200, 400+120*cos(radians(count+90)), 275+30*sin(radians(count+90)), 400+120*cos(radians(count+180)), 275+30*sin(radians(count+180)));
fill(255*sin(radians(count+30)));
triangle(400, 200, 400+120*cos(radians(count)), 275+30*sin(radians(count)), 400+120*cos(radians(count+90)), 275+30*sin(radians(count+90)));
fill(255*sin(radians(count+300)));
triangle(400, 200, 400+120*cos(radians(count+270)), 275+30*sin(radians(count+270)), 400+120*cos(radians(count)), 275+30*sin(radians(count)));
} else if (count%360>=120&&count%360<210)
{
fill(255*sin(radians(count+120)));
triangle(400, 200, 400+120*cos(radians(count+90)), 275+30*sin(radians(count+90)), 400+120*cos(radians(count+180)), 275+30*sin(radians(count+180)));
fill(255*sin(radians(count+30)));
triangle(400, 200, 400+120*cos(radians(count)), 275+30*sin(radians(count)), 400+120*cos(radians(count+90)), 275+30*sin(radians(count+90)));
fill(255*sin(radians(count+300)));
triangle(400, 200, 400+120*cos(radians(count+270)), 275+30*sin(radians(count+270)), 400+120*cos(radians(count)), 275+30*sin(radians(count)));
fill(255*sin(radians(count+210)));
triangle(400, 200, 400+120*cos(radians(count+180)), 275+30*sin(radians(count+180)), 400+120*cos(radians(count+270)), 275+30*sin(radians(count+270)));
} else if (count%360>=210&&count%360<300)
{
fill(255*sin(radians(count+30)));
triangle(400, 200, 400+120*cos(radians(count)), 275+30*sin(radians(count)), 400+120*cos(radians(count+90)), 275+30*sin(radians(count+90)));
fill(255*sin(radians(count+300)));
triangle(400, 200, 400+120*cos(radians(count+270)), 275+30*sin(radians(count+270)), 400+120*cos(radians(count)), 275+30*sin(radians(count)));
fill(255*sin(radians(count+210)));
triangle(400, 200, 400+120*cos(radians(count+180)), 275+30*sin(radians(count+180)), 400+120*cos(radians(count+270)), 275+30*sin(radians(count+270)));
fill(255*sin(radians(count+120)));
triangle(400, 200, 400+120*cos(radians(count+90)), 275+30*sin(radians(count+90)), 400+120*cos(radians(count+180)), 275+30*sin(radians(count+180)));
} else
{
fill(255*sin(radians(count+300)));
triangle(400, 200, 400+120*cos(radians(count+270)), 275+30*sin(radians(count+270)), 400+120*cos(radians(count)), 275+30*sin(radians(count)));
fill(255*sin(radians(count+210)));
triangle(400, 200, 400+120*cos(radians(count+180)), 275+30*sin(radians(count+180)), 400+120*cos(radians(count+270)), 275+30*sin(radians(count+270)));
fill(255*sin(radians(count+120)));
triangle(400, 200, 400+120*cos(radians(count+90)), 275+30*sin(radians(count+90)), 400+120*cos(radians(count+180)), 275+30*sin(radians(count+180)));
fill(255*sin(radians(count+30)));
triangle(400, 200, 400+120*cos(radians(count)), 275+30*sin(radians(count)), 400+120*cos(radians(count+90)), 275+30*sin(radians(count+90)));
}
}
길지만, 사실 내용은 별 거 없다.
집을 그리기 위한 모든 좌표들의 값을 일일히 계산해서 식으로 쓴 것 뿐.
애먹은 부분은, 삼각함수의 x위치에 들어갈 변수 count의 값에 따라 어떤 면이 앞으로 올 지 였다.
우선 완성된 모습이다. 집은 마우스로 드래그하면 회전한다.
어떤 삼각형이 나중에 그려져 결과적으로 '앞'으로 올지를 생각해야한다.
집을 돌리기 전에 앞에 있던 삼각형은 약 180도를 돌린 후에는 뒤로 가야한다.
이런 부분들을 현재 count의 값에 따라 그려지는 순서를 다르게 함으로써 해결했다. 상당히 귀찮은 과정이었다.
그래도 결과물은 썩 나쁘지 않은 것 같아 기분이 좋다.