가페회원님이 올리셨는데 허락받고 여기서 물어보는 겁니다. (openGL 도와주세요.)
가페회원님이 올리셨는데 허락받고 여기서 물어보는 겁니다. (openGL 도와주세요.)
현재 프로젝트 진행중인데요..
현재 프로젝트 구현해야 할 사항입니다.
제가 현재 1.2.3.5 번은 구현했거든요.
근데 나머지는 어떻게 해야할지 막막하네요.
인터넷 여기저기 사이트 들어가봐도 모르겠구요.
매핑 어떻게 하는건지 이해가 되지 않네요.
그리고 헬기를 구현해야되는데 어떻게 해야될지 모르겠네요
나머지는 몰라도 6.7번은 꼭 구현해보고 싶거든요.
어떻게 해야할지 도와주세요.
현재 제가 구현한 프로그램소스 및 사진 올릴께요.
=================================================================================================
- 헬기의 연속적인 비행 애니메이션 제작(기체 상부와 꼬리 부분 날개 연속적으로 움직일 것)
1. 카메라 제어 기능(극좌표 제어 기능, 상하좌우 버튼 사용, 줌인/아웃은 PageUp/PageDown)
2. 마우스 왼쪽 버튼 클릭시 동작, 오른쪽 버튼 클릭시 멈춤
(힌트 : glutIdleFunc(NULL); 은 동작 멈춤, glutIdleFunc(spinDisplay); 은 동작 진행)
3. 3차원 가상공간에 조명 삽입하여 음영(Gouraud Shading) 표현할 것
4. 헬기와 풍력 발전기 등에 텍스처 매핑(Texture Mapping) 적용할 것)
5. 윈도우 사이즈(해상도) : 1024 x 768 이상으로 설정할 것
6. 가상공간의 바닥을 지형(Terrain)이나 그리드(Grid) 등으로 표현할 것
7. 가상공간을 밤(Night)으로 표현하고, 특히 하늘(Sky)을 별(Star)이 빛나는 밤으로 표현할 것
8. 헬기 앞 부분에 조명을 양쪽으로 부착(헤드 라이트)하고 빛이 전방을 향하도록 할 것
====================================================================================================
[url=http://cafefiles.naver.net/data36/2008/12/16/257/111_kieun215.jpg]
[출처] openGL 도와주세요. (♡♡♡★Drangon★♡♡♡ 리눅스) |작성자 썬썬썬
소스
//======================================================================
// header 선언
//======================================================================
#include
#include
#include
#include
#include // 헤더파일 OpenGL32 라이브러리
#include // 헤더파일 GLu32 라이브러리
#include // 헤더파일 Glaux 라이브러리
static int elbow1 = 90, elbow2=0, shoulder1 = 0, shoulder2 = 120, shoulder3 = 125, //가운데풍차
elbow11 = 90, elbow12=0, shoulder11 = 0, shoulder12 = 120, shoulder13 = 125, //오른쪽풍차
elbow21 = 90, elbow22=0, shoulder21 = 0, shoulder22 = 120, shoulder23 = 125; //왼쪽풍차
// elbow = 풍차의 기둥생성위치 지정 , shoulder= 풍차 날개 생성 위치 지정
static int R = 0, R1 = 0; //회전 초기값 설정
float eye1=30; // 카메라 초기 설정값
float zoom1=100; //줌 초기 설정값
GLUquadricObj *obj;
GLuint tex[11]; //텍스쳐 매핑을 위해 그림이 들어갈 공간11개 선언
AUX_RGBImageRec *LoadBMPFile(char *filename) //파일의 이름일때 그림을 불러오게함.
{
FILE *hFile = NULL;
if(!filename) return NULL;
hFile = fopen(filename, "r");
if(hFile) {
fclose(hFile);
return auxDIBImageLoad(filename);
}
return NULL;
}
void loadtexture()
{
int i;
AUX_RGBImageRec *texRec[11];
memset(texRec, 0, sizeof(void *)*11);
if((texRec[0]=LoadBMPFile("1.bmp")) && // 그림의 파일을 8비트 단위로 맞춰 넣는다.
// (texRec[1]=LoadBMPFile("Mercury.bmp")) && // texRec[] 각각의 그림파일을 넣는다.
//(texRec[2]=LoadBMPFile("Venus.bmp")) &&
//(texRec[3]=LoadBMPFile("earth.bmp")) &&
//(texRec[4]=LoadBMPFile("Moon.bmp")) &&
//(texRec[5]=LoadBMPFile("Mars.bmp")) &&
//(texRec[6]=LoadBMPFile("Jupiter.bmp")) &&
//(texRec[7]=LoadBMPFile("Saturn.bmp")) &&
//(texRec[8]=LoadBMPFile("Uranus.bmp")) &&
//(texRec[9]=LoadBMPFile("Neptune.bmp")) &&
(texRec[10]=LoadBMPFile("pluto.bmp"))) {
glGenTextures(11, &tex[0]);
for( i=0; i<11; i++) {
glBindTexture(GL_TEXTURE_2D, tex[i]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, texRec[i]->sizeX, texRec[i]->sizeY, 0,
GL_RGB, GL_UNSIGNED_BYTE,texRec[i]->data);
}
}
for( i=0; i<11; i++) {
if(texRec[i]) {
if(texRec[i]->data) free(texRec[i]->data);
free(texRec[i]);
}
}
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}
GLfloat whiteLight [ ] = { 0.2, 0.2, 0.2, 1.0 };
GLfloat sourceLight [ ] = { 0.8, 0.8, 0.8, 1.0 };
GLfloat lightPos [ ] = { 0.0, 0.0, 0.0, 1.0 };
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 1.0 ); // 디스플레이윈도우색상을검은색으로지정한다.
glEnable(GL_COLOR_MATERIAL); // 재질의 설정모드
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // 색상지정면 선택, 주변과 나반사광을 선택
glEnable(GL_DEPTH_TEST); // 깊이테스트 기능을 선택한다.
glFrontFace(GL_CCW); // 반시계 방향으로 정의되는 면을 앞으로 한다.
glEnable(GL_CULL_FACE); // 쿨링 기능을 선택한다.
// 조명
GLfloat ambientLight[] = {1.0, 1.0, 1.0, 1.0}; // 주변조명은 밝은 힌빛으로 한다.
glEnable(GL_LIGHTING); // 조명을 사용한다고 알린다.
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight); // 주변조명을 설정했다.
glLightfv(GL_LIGHT0,GL_DIFFUSE,sourceLight); // 광원을 설정
GLfloat lightPos[] = {-50.0, 50.0, 100.0, 1.0}; // 광원의 위치설정
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
glEnable(GL_LIGHT0); // 설정한 광원을 활성화 시킨다.
}
void display(void)
{
GLfloat light_position[] = { 0.0, 0.0, 0.0, 1.0 };
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //버퍼 클리어
glColor3f (1.0, 1.0, 1.0);
glPushMatrix();
glRotatef ((GLfloat) R, 1.0, 0.0, 0.0); //x축 회전
glRotatef ((GLfloat) R1, 0.0, 0.0, 1.0); //y축 회전
//=======================================================================
// 가운데 풍차
//=======================================================================
glPushMatrix();
glTranslatef (0.0, -2.3, 0.0);
glRotatef ((GLfloat) elbow1, 0.0, 0.0, 1.0);
glTranslatef (0.0, 0.0, 0.0);
glPushMatrix();
glScalef (7.5, 0.3, 0.0);
glutSolidCube (0.8);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
glPopMatrix();
glColor3f(1.0,1.0,1.0);
glTranslatef (2.9, 0.0, 0.0);
glRotatef ((GLfloat) elbow2, 0.0, 0.0, 1.0);
glTranslatef (0.0, 0.0, 0.0);
glPushMatrix();
glScalef (0.0, 0.0, 0.0);
glutSolidSphere(0.2,15.0,15.0);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
glPopMatrix();
glColor3f(1.0,1.0,1.0);
glTranslatef (0.0, 0.0, 0.0);
glRotatef ((GLfloat) shoulder1, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
glPushMatrix();
glScalef (1.5, 0.2, 0.0);
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
glutSolidSphere (0.7, 100.0, 100.0);
glEnable(GL_LIGHTING);
glPopMatrix();
glTranslatef (-1.0, 0.0, 0.0);
glRotatef ((GLfloat) shoulder2, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
glPushMatrix();
glScalef (1.5, 0.2, 0.0);
glutSolidSphere (0.7, 100.0, 100.0);
glEnable(GL_LIGHTING);
glPopMatrix();
glTranslatef (-1.0, 0.0, 0.0);
glRotatef ((GLfloat) shoulder3, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
glPushMatrix();
glScalef (1.5, 0.2, 0.0);
glutSolidSphere (0.7, 100.0, 100.0);
glEnable(GL_LIGHTING);
glPopMatrix();
glPopMatrix();
//=======================================================================
// 오른쪽 풍차
//=======================================================================
glPushMatrix();
glColor3f(1.0,1.0,1.0);
glTranslatef (5.0, -1.0, 0.0);
glRotatef ((GLfloat) elbow11, 0.0, 0.0, 1.0);
glTranslatef (0.0, 0.0, 0.0);
glPushMatrix();
glScalef (6.5, 0.3, 0.0);
glutSolidCube (0.8);
glPopMatrix();
glColor3f(1.0,1.0,1.0);
glTranslatef (1.5, 0.0, 0.0);
glRotatef ((GLfloat) elbow12, 0.0, 0.0, 1.0);
glTranslatef (0.0, 0.0, 0.0);
glPushMatrix();
glScalef (0.0, 0.0, 0.0);
glutSolidSphere(0.2,15.0,15.0);
glPopMatrix();
glColor3f(1.0,1.0,1.0);
glTranslatef (1.0, 0.0, 0.0);
glRotatef ((GLfloat) shoulder11, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
glPushMatrix();
glScalef (1.5, 0.2, 0.0);
glutSolidSphere (0.7, 100.0, 100.0);
glPopMatrix();
glTranslatef (-1.0, 0.0, 0.0);
glRotatef ((GLfloat) shoulder12, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
glPushMatrix();
glScalef (1.5, 0.2, 0.0);
glutSolidSphere (0.7, 100.0, 100.0);
glPopMatrix();
glTranslatef (-1.0, 0.0, 0.0);
glRotatef ((GLfloat) shoulder13, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
glPushMatrix();
glScalef (1.5, 0.2, 0.0);
glutSolidSphere (0.7, 100.0, 100.0);
glPopMatrix();
glPopMatrix();
//=======================================================================
// 왼쪽 풍차
//=======================================================================
glPushMatrix();
glColor3f(1.0,1.0,1.0);
glTranslatef (-5.0, 1.5, 0.0);
glRotatef ((GLfloat) elbow21, 0.0, 0.0, 1.0);
glTranslatef (0.0, 0.0, 0.0);
glPushMatrix();
glScalef (6.5, 0.3, 0.0);
glutSolidCube (0.8);
glPopMatrix();
glColor3f(1.0,1.0,1.0);
glTranslatef (1.5, 0.0, 0.0);
glRotatef ((GLfloat) elbow22, 0.0, 0.0, 1.0);
glTranslatef (0.0, 0.0, 0.0);
glPushMatrix();
glScalef (0.0, 0.0, 0.0);
glutSolidSphere(0.2,15.0,15.0);
glPopMatrix();
glColor3f(1.0,1.0,1.0);
glTranslatef (1.0, 0.0, 0.0);
glRotatef ((GLfloat) shoulder21, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
glPushMatrix();
glScalef (1.5, 0.2, 0.0);
glutSolidSphere (0.7, 100.0, 100.0);
glPopMatrix();
glTranslatef (-1.0, 0.0, 0.0);
glRotatef ((GLfloat) shoulder22, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
glPushMatrix();
glScalef (1.5, 0.2, 0.0);
glutSolidSphere (0.7, 100.0, 100.0);
glPopMatrix();
glTranslatef (-1.0, 0.0, 0.0);
glRotatef ((GLfloat) shoulder23, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
glPushMatrix();
glScalef (1.5, 0.2, 0.0);
glutSolidSphere (0.7, 100.0, 100.0);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(zoom1, (GLfloat) w/(GLfloat) h, 5.0, 50.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (0.0, 0.0, eye1, 0.0, 0.0, 0.0, 0.0, 0.1, 0.0);
}
void spinDisplay(void)//풍차 날개 회전 속도
{
shoulder1=shoulder1+1; //가운데 풍차 속도
shoulder11=shoulder11+2; // 오른쪽 풍차 속도
shoulder21=shoulder21+1.4; //왼쪽 풍차 속도
glutPostRedisplay();
}
//=====================================================================
// mouse 버튼 조작 설정
//=====================================================================
void mouse(int button, int state, int x, int y) //마우스 버튼 조작
{
switch (button) {
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(spinDisplay); //왼쪽 버튼 회전 시작
break;
case GLUT_MIDDLE_BUTTON:
case GLUT_RIGHT_BUTTON: //오른쪽 버튼 멈춤
if (state == GLUT_DOWN)
glutIdleFunc(NULL);
break;
default:
break;
}
}
//======================================================================
// keyboard 버튼 조작 설정
//======================================================================
void keyboard (int key, int x, int y)
{
switch (key)
{
case GLUT_KEY_PAGE_DOWN :// 카메라 줌 확대
zoom1 = zoom1 + 1.0;
reshape (1024,768);
glutPostRedisplay();
break;
case GLUT_KEY_PAGE_UP :// 카메라 줌 축소
zoom1 = zoom1 - 1.0;
reshape (1024,768);
glutPostRedisplay();
break;
case GLUT_KEY_UP : // x축 회전
R = R + 5;
glutPostRedisplay();
break;
case GLUT_KEY_DOWN : // x축 회전
R = R - 5;
glutPostRedisplay();
break;
case GLUT_KEY_LEFT : // y축 회전
R1 = R1 + 5;
glutPostRedisplay();
break;
case GLUT_KEY_RIGHT : // y축 회전
R1 = R1 - 5;
glutPostRedisplay();
break;
case 27:
exit(0);
break;
default:
break;
}
}
int main(int argc, char** argv)
{
//===============================================================
// Open GL Setting
//===============================================================
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize (1024, 768); // 디스플레이 설정
glutInitWindowPosition (0, 0); // 자리 설정
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutSpecialFunc(keyboard);
glutMouseFunc(mouse);
glutMainLoop();// 반복
return 0;
}
댓글 달기