수업중에 하던거라 대충해놔서... ㅡㅡ;;

아이디어는 이렇다.
7면체를 그리기 위해서, 7면체의 각 정점들을 행렬로 저장해둔다.
그러고 나면 각 polygon별로 한 면을 이루는 정점들을 행렬로 저장한다.


예를 들어 정점의 순서가 위와 같다면,
앞의 오각형을 그리는 정점은, { 5, 9, 8, 7, 6 } 이다.
또 옆의 사각형을 그리는 정점은, { 6, 7, 2, 1 } 이다.
( 정점의 순서는 연속적이어야 한다. 정점 순서대로 그리기 때문에. 
자기 나름의 규칙을 정해두는 것도 좋다. 나같은 경우엔 왼쪽 아래점부터 시작한다. )


이제 그릴 준비를 한다.

우선 7면체를 그리기 위해 각 정점들의 좌표를 행렬로 만들어서 저장한다.
예를 들어 0번 정점(원점)의 좌표는 { 0, 0, 0 }
1번 정점의 좌표는 { 10, 0, 0 } 같은 식이다.
static GLint vdata[10][3] =  {
{0, 0, 0}, 
{10, 0, 0}, 
{10, 10, 0}, 
{5, 15, 0}, 
{0, 10, 0},
{0, 0, 10}, 
{10, 0, 10}, 
{10, 10, 10}, 
{5, 15, 10}, 
{0, 10, 10}
};

사각형을 그릴 정점 집합을 저장한다.
static GLint goggan_q[5][4]={
{1, 2, 7, 6},
{7, 2, 3, 8},
{3, 4, 9, 8},
{0, 4, 9, 5},
{0, 1, 6, 5},
};

오각형을 그릴 정점 집합을 저장한다.
static GLint goggan_p[2][5]={
{2, 3, 4, 0, 1}, 
{7, 8, 9, 5, 6}
};


이제 실제로 각점들을 연결해서 다각형을 그려줄 함수를 만든다.
GL_QUADS는 사각형을, GL_POLYGON은 오각형을 그릴때,
c언어 for문에 대한 이해가 좀 필요한데,,,, 저거 잘 분석하면 나온다.
void draw()
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
for (i=0; i<7; i++)
{
glColor3f(i*0.1, 0.3, i*0.1+0.1);
glBegin(GL_QUADS);
{
glVertex3iv(&vdata[goggan_q[i][0]][0]); // [0][0] 즉 좌표 0,0,0
glVertex3iv(&vdata[goggan_q[i][1]][0]); // [0][1] 즉 좌표 0,1,0
             glVertex3iv(&vdata[goggan_q[i][2]][0]);  // [0][2] 즉 좌표 0,1,1
glVertex3iv(&vdata[goggan_q[i][3]][0]);  // [0][3] 즉 좌표 0,0,1
}
glEnd();
};

for (i=0; i<2; i++)
{
glColor3f(0.3, 0.4, i*0.2);
glBegin(GL_POLYGON);
{
glVertex3iv(&vdata[goggan_p[i][0]][0]); // [0][0] 즉 좌표 0,0,0
             glVertex3iv(&vdata[goggan_p[i][1]][0]); // [0][1] 즉 좌표 0,1,0
             glVertex3iv(&vdata[goggan_p[i][2]][0]);  // [0][2] 즉 좌표 0,1,1
glVertex3iv(&vdata[goggan_p[i][3]][0]);  // [0][2] 즉 좌표 0,1,1
glVertex3iv(&vdata[goggan_p[i][4]][0]);  // [0][2] 즉 좌표 0,1,1
}
glEnd();
};
}





gluLookAt()을 통해서 카메라의 위치, 보는 방향, 각도를 지정할 수 있다.

gluLookAt ( eye.x,  eye.y,  eye.z,
                 look.x, look.y,  look.z,
                   up.x,    up.y,    up.z );

gluLookAt(10, 10, 10,
0, 0, 0,
0, 1, 0); 




gluLookAt(10, 7, 15,
0, 0, 0,
0, 1, 0);
요렇게 해두고 실행하면...
( 실제로 아래있는 완전한 코드만을 가지고 하면 이런 모양이 나오지 않는다.
그 이유는 나중에 출력한 그림이 먼저 출력한 그림을 덮어쓰기때문에.
이렇게 하려면 정면에 보이는 오각형을 가장 나중에 출력해야 하고, 
옆면과, 지붕 옆면을 나중에 출력해야한다.)





gluLookAt(10, 25, 15,
0, 4, 0,
0, 1, 0);
LookAt 메소드를 통해 보는 위치와 방향을 조금 바꾸면 이렇게도 볼 수 있다.










#include <windows.h>
#include <stdio.h>
#include <GL.h>
#include <Glu.h>
#include <GLut.h>

int i;

static GLfloat theta; 

static GLint vdata[10][3] =  {
{0, 0, 0}, 
{10, 0, 0}, 
{10, 10, 0}, 
{5, 15, 0}, 
{0, 10, 0},
{0, 0, 10}, 
{10, 0, 10}, 
{10, 10, 10}, 
{5, 15, 10}, 
{0, 10, 10}
};

static GLint goggan_q[5][4]={
{1, 2, 7, 6},
{7, 2, 3, 8},
{3, 4, 9, 8},
{0, 4, 9, 5},
{0, 1, 6, 5},
};

static GLint goggan_p[2][5]={
{2, 3, 4, 0, 1}, 
{7, 8, 9, 5, 6}
};


void myInit(void)
{
glClearColor( 1.0, 1.0, 1.0, 0.0 );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-30.0, 30.0, -30.0, 30.0, -30.0, 30.0);
// glFrustum(-20.0, 20.0, -20.0, 20.0, 2.0, 30.0);
// gluPerspective();

gluLookAt(10, 10, 10,
0, 0, 0,
0, 1, 0);
// glGetFloatv(GL_MODELVIEW_MATRIX, m);
}

void draw()
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
for (i=0; i<7; i++)
{
glColor3f(i*0.1, 0.3, i*0.1+0.1);
glBegin(GL_QUADS);
{
glVertex3iv(&vdata[goggan_q[i][0]][0]); // [0][0] 즉 좌표 0,0,0
glVertex3iv(&vdata[goggan_q[i][1]][0]); // [0][1] 즉 좌표 0,1,0
             glVertex3iv(&vdata[goggan_q[i][2]][0]);  // [0][2] 즉 좌표 0,1,1
glVertex3iv(&vdata[goggan_q[i][3]][0]);  // [0][3] 즉 좌표 0,0,1
}
glEnd();
};

for (i=0; i<2; i++)
{
glColor3f(0.3, 0.4, i*0.2);
glBegin(GL_POLYGON);
{
glVertex3iv(&vdata[goggan_p[i][0]][0]); // [0][0] 즉 좌표 0,0,0
             glVertex3iv(&vdata[goggan_p[i][1]][0]); // [0][1] 즉 좌표 0,1,0
             glVertex3iv(&vdata[goggan_p[i][2]][0]);  // [0][2] 즉 좌표 0,1,1
glVertex3iv(&vdata[goggan_p[i][3]][0]);  // [0][2] 즉 좌표 0,1,1
glVertex3iv(&vdata[goggan_p[i][4]][0]);  // [0][2] 즉 좌표 0,1,1
}
glEnd();
};
}


void myDispaly(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_COLOR_BUFFER_BIT);
draw();
glFlush();
glutSwapBuffers();
}



void RotationAngle(void)               //  ***
{
theta+=0.05;
if (theta >360) theta=0;
myDispaly();
}
   


void main( int argc, char** argv)
{
glutInit( &argc, argv ); //initialize the toolkit
glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB ); // set display mode
glutInitWindowSize( 800, 800); //set window size
glutInitWindowPosition( 100, 150 ); //set window position on screen
glutCreateWindow( "다각형그리기"); //open the screen window
myInit();
glutDisplayFunc( myDispaly );                       //register redraw function
glutIdleFunc(RotationAngle);      //  *** increment of rotation angle
glutMainLoop(); //go into a perpetual loop
}

뭐 대충... 수업시간에 바삐 따라가면서 했던것들... 까먹을까 기록해둔다.

OpenGL을 이용해서 그렸다.

















- p.s -

실제 위에 첨부된 그림파일처럼 출력하려면, 순서를 좀 바꾸어서 요렇게 해보면 된다.
void draw()
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.3, 0.4, 0.2);
glBegin(GL_POLYGON);
glVertex3iv(&vdata[goggan_p[0][0]][0]); // [0][0] 즉 좌표 0,0,0
             glVertex3iv(&vdata[goggan_p[0][1]][0]); // [0][1] 즉 좌표 0,1,0
             glVertex3iv(&vdata[goggan_p[0][2]][0]);  // [0][2] 즉 좌표 0,1,1
glVertex3iv(&vdata[goggan_p[0][3]][0]);  // [0][2] 즉 좌표 0,1,1
glVertex3iv(&vdata[goggan_p[0][4]][0]);  // [0][2] 즉 좌표 0,1,1
glEnd();

for (i=6; i>=0; i--)
{
glColor3f(i*0.1, 0.3, i*0.1+0.1);
glBegin(GL_QUADS);
{
glVertex3iv(&vdata[goggan_q[i][0]][0]); // [0][0] 즉 좌표 0,0,0
glVertex3iv(&vdata[goggan_q[i][1]][0]); // [0][1] 즉 좌표 0,1,0
             glVertex3iv(&vdata[goggan_q[i][2]][0]);  // [0][2] 즉 좌표 0,1,1
             glVertex3iv(&vdata[goggan_q[i][3]][0]);  // [0][3] 즉 좌표 0,0,1
}
glEnd();
};

glColor3f(0.3, 0.4, 0.4);
glBegin(GL_POLYGON);
glVertex3iv(&vdata[goggan_p[1][0]][0]); // [0][0] 즉 좌표 0,0,0
             glVertex3iv(&vdata[goggan_p[1][1]][0]); // [0][1] 즉 좌표 0,1,0
             glVertex3iv(&vdata[goggan_p[1][2]][0]);  // [0][2] 즉 좌표 0,1,1
glVertex3iv(&vdata[goggan_p[1][3]][0]);  // [0][2] 즉 좌표 0,1,1
glVertex3iv(&vdata[goggan_p[1][4]][0]);  // [0][2] 즉 좌표 0,1,1
glEnd();

/*
for (i=0; i<2; i++)
{
glColor3f(0.3, 0.4, i*0.2);
glBegin(GL_POLYGON);
{
glVertex3iv(&vdata[goggan_p[i][0]][0]); // [0][0] 즉 좌표 0,0,0
             glVertex3iv(&vdata[goggan_p[i][1]][0]); // [0][1] 즉 좌표 0,1,0
             glVertex3iv(&vdata[goggan_p[i][2]][0]);  // [0][2] 즉 좌표 0,1,1
glVertex3iv(&vdata[goggan_p[i][3]][0]);  // [0][2] 즉 좌표 0,1,1
glVertex3iv(&vdata[goggan_p[i][4]][0]);  // [0][2] 즉 좌표 0,1,1
}
glEnd();
};
*/
}


Posted by croute

댓글을 달아 주세요

  1. Favicon of https://croute.me BlogIcon croute 2010.10.20 12:37 신고  댓글주소  수정/삭제  댓글쓰기

    주석은 안고쳐서 ... 주석은 신경쓰지 말길-