아두이노 프로세싱: 큐브에 텍스쳐입히기

데이빗 2016-03-16 (수) 13:25 3년전 3663  

큐브(육면체)를 이용하여 센서 테스트 및 여러가지 예제를 종종 봅니다. 

 

즉, 이러한 큐브를 이용하면, 여러가지 시뮬레이션이 가능하기 때문이죠. 

 

예컨대, 휴머노이드 로봇 및 4족 보행 로봇 같은 경우도, 이러한 직육면체를 연결하여 각각의 링크를 만들 수 있고, 

 

산업용 로봇 시뮬레이터도 이렇게 직육면체를 이용하여 시뮬레이션이 가능합니다. 

 

오늘은, 육면체에 색깔을 입히는 것도 좋지만, 이미지 파일을 덮는 것을 알아봅니다. 텍스쳐(Texture)라는 OPENGL의 기능을 사용할 것이고, 첨부된 JPG 파일을 사용하도록 하겠습니다. 제가 좋아하는 박신혜 사진으로...ㅋ

다음의 이미지를 사용했습니다.
02cd46d8a607ca14b01d10ead866e139_145810202cd46d8a607ca14b01d10ead866e139_1458102
02cd46d8a607ca14b01d10ead866e139_145810202cd46d8a607ca14b01d10ead866e139_1458102
02cd46d8a607ca14b01d10ead866e139_145810202cd46d8a607ca14b01d10ead866e139_1458102
 

아두이노 프로세싱 코드

 

PImage img1;

PImage img2;

PImage img3;

PImage img4;

PImage img5;

PImage img6;

 

// PImage는 이미지를 저장할 데이터타입입니다. ima1~img6까지 6면에 저장할 이미지 변수를 선언했습니다.

 

int cubesize = 50; // 육면체의 한변의 사이즈입니다.

int angle=0; // 나중에 회전시킬 각도

void setup() //한번만 선언되는 셋업

{

size(500, 500, P3D); //윈도우의 사이즈이며, P3D는 3D 그래픽을 가능하게 하는 윈도입니다

noStroke(); // 큐브등 도형에 외각선을 긋지 않습니다.

img1 = loadImage("BSTex1.jpg"); 

img2 = loadImage("BSTex2.jpg");

img3 = loadImage("BSTex3.jpg");

img4 = loadImage("BSTex4.jpg");

img5 = loadImage("BSTex5.jpg");

img6 = loadImage("BSTex6.jpg"); 

 

//이미지를 저장했습니다. 이미지파일은 프로세싱 파일이 있는 폴더에 저장합니다.

}

 

void draw() // 계속 동작하는 메인파일입니다.

{

  background(100); // 백그라운드 컬러는 약간 회색돈으로 합니다. 

  translate(250,250,0);   // 중간으로 좌표를 이동합니다. 

  rotateZ(radians(angle)); // Z축을 중심으로 회전

  rotateY(radians(angle)); // Y축을 중심으로 회전

  rotateX(radians(angle)); // X축을 중심으로 회전

pushMatrix(); // PushMatrix는 오픈지엘에서 중요한 함수인데, pushmatrix는 현재의 변환을 매트릭스 스택에 저장하는 것이고,                                 // popmatrix는 변환을 다시 빼내는 것입니다.

//Front

beginShape();

texture(img1); // 앞에 저장할 이미지입니다.

textureMode(NORMAL);

vertex(-cubesize, -cubesize, cubesize, 0, 0);  // vertex를 많이 사용하는데, vertex를 이용하여 각각의 면을 설정합니다. 

vertex(cubesize, -cubesize, cubesize, 0, 1); // vertex(x,y,z,u,v)이며, u는 보는 방향에서 수평 좌표계, 그리고 v는 보는 방향에서 수직

vertex(cubesize, cubesize, cubesize, 1, 1); // 좌표계라고 생각하면 편합니다.

vertex(-cubesize, cubesize, cubesize, 1, 0);

endShape();

popMatrix();

 

//Back

pushMatrix();

beginShape();

texture(img2);

textureMode(NORMAL);

vertex(cubesize, -cubesize, -cubesize, 0, 0);

vertex(-cubesize, -cubesize, -cubesize, 0, 1);

vertex(-cubesize, cubesize, -cubesize, 1, 1);

vertex(cubesize, cubesize, -cubesize, 1, 0);

endShape();

popMatrix();

 

//Top

pushMatrix();

beginShape();

texture(img3);

textureMode(NORMAL);

vertex(-cubesize, cubesize, cubesize, 0, 0);

vertex(cubesize, cubesize, cubesize, 0, 1);

vertex(cubesize, cubesize, -cubesize, 1, 1);

vertex(-cubesize, cubesize, -cubesize, 1, 0);

endShape();

popMatrix();

 

//Bottom

pushMatrix();

beginShape();

texture(img4);

textureMode(NORMAL);

vertex(cubesize, -cubesize, cubesize, 0, 0);

vertex(-cubesize, -cubesize, cubesize, 0, 1);

vertex(-cubesize, -cubesize, -cubesize, 1, 1);

vertex(cubesize, -cubesize, -cubesize, 1, 0);

endShape();

popMatrix();

 

//Right

pushMatrix();

beginShape();

texture(img5);

textureMode(NORMAL);

vertex(cubesize, -cubesize, cubesize, 0, 0);

vertex(cubesize, -cubesize, -cubesize, 0, 1);

vertex(cubesize, cubesize, -cubesize, 1, 1);

vertex(cubesize, cubesize, cubesize, 1, 0);

endShape();

popMatrix();

               

//Left

pushMatrix();

beginShape();

texture(img6);

textureMode(NORMAL);

vertex(-cubesize, -cubesize, -cubesize, 0, 0);

vertex(-cubesize, -cubesize, cubesize, 0, 1);

vertex(-cubesize, cubesize, cubesize, 1, 1);

vertex(-cubesize, cubesize, -cubesize, 1, 0);

endShape();

popMatrix();

 

         

if (angle==360)

{

  angle=0;

}

angle++;

 

}

02cd46d8a607ca14b01d10ead866e139_1458102

 

 

  

▶아래 플러스 친구 버튼을 통해 다양한 정보와 교제 자료 및 이벤트등의 소식을 받아보실 수 있습니다.




모바일 버전으로 보기