[그래픽스] openGL 기초 함수

윤정민·2022년 11월 24일
0

Graphics

목록 보기
18/22

1. 초기화 함수들

1.1. glutInit(&argc, argv)

  • glut를 초기화 하는 함수

1.2. glutInitDisplayMode(unsigned int mode)

  • dispalymode를 초기화 하는 함수

1.3. glutInitWindowSize(int width, int height)

  • window창의 작업 공간 사이즈를 초기화 하는 함수

1.4. glutInitWindowPosition(int x, int y)

  • window가 생성되는 위치를 초기화 하는 함수

1.5. glutCreateWindow(string name)

  • window의 이름을 설정하는 함수

1.6. glutClearColor(1.0,1.0,1.0,1.0)

  • window 화면을 흰색으로 초기화

2. 화면을 그리는 함수들

2.1. glutDisplayFunc(void *Func)

  • 화면을 그리는 함수
  • 그리고자 하는 함수를 인자로 넘겨줌
  • 예시: glutDisplayFunc(MyDisplay);
void MyDisplay() {
	glClear(GL_COLOR_BUFFER_BIT);	//버퍼들을 미리 설정된 값으로 지움
	glColor3f(0.5, 0.5, 0.5);	//RGB 색을 설정
	glBegin(GL_POLYGON);	//도형 정의 시작
	glVertex3f(-0.5, -0.5, 0.0);	//꼭짓점 설정
	glVertex3f(0.5, -0.5, 0.0);		//꼭짓점 설정
	glVertex3f(0.5, 0.5, 0.0);		//꼭짓점 설정
	glVertex3f(-0.5, 0.5, 0.0);		//꼭짓점 설정
	glEnd();	//도형 정의 끝
	glFlush();	//최종적으로 화면에 출력함
}

2.2 투영함수

  • 직교 투영(Orthographic Projection)
    • 멀고 가까움에 관계없이 같은 길이로 표현
      glOrtho(left, right, bottom, top, near, far);
  • 원근 투영(Perspective Projection)
    glFrustum(left, right, bottom, top, near, far);
    glPerspective(fovy, aspect, near, far);

3. Callback 함수

3.1. glutReshapeFunc(void *Func)

  • window의 크기가 바뀔때 실행
  • 보통 window size와 그림의 크기 비를 맞출때 사용
  • 인자 함수는 window의 width와 height를 인자로 받음
  • 예시: MyReshape
void MyReshape(int NewWidth, int NewHeight) {
	glViewport(0, 0, NewWidth, NewHeight);	//뷰포트 설정
	GLfloat WidthFactor = (GLfloat)NewWidth / (GLfloat)300;	//창의 크기를 초기 창크기를 사용해 배율을 알아냄
	GLfloat HeightFactor = (GLfloat)NewHeight / (GLfloat)300;
	glMatrixMode(GL_PROJECTION);	//2 matrix를 projection으로 설정
	glLoadIdentity();	//3.loadIdentity(단위행렬로 행렬 초기화)
	glOrtho(-1.0 * WidthFactor, 1.0 * WidthFactor,
		-1.0 * HeightFactor, 1.0 * HeightFactor, -1.0, 1.0);	//1. 항상 일정하게 투영하고 싶음(직교투영)
}

3.2. glutKeyboardFunc(void *Func)

  • 키보드 버튼이 입력될 때 실행
  • 예시: glutKeyboardFunc(MyKeyboard);
void MyKeyboard(unsigned char key, int x, int y) {//q누르면 프로그램 종료
	switch (key) {
	case 'Q':
		exit(0); break;
	case 'q':
		exit(0); break;
	default:
		break;
	}
	glutPostRedisplay();	//window를 다시그리도록 요청
}

3.3. glutSpecialFunc(void *Func)

  • 키보드 특수키가 입력될 때 실행
  • 예시: glutSpecialFunc(MySpecial);
void MySpecial(int key, int x, int y) {	//화살표 키 마다 색 변경
	switch (key) {
	case GLUT_KEY_LEFT:
		glColor3f(0., 0., 0.);
		break;
	case GLUT_KEY_RIGHT:
		glColor3f(1.0, 0., 0.);
		break;
	case GLUT_KEY_DOWN:
		glColor3f(0., 1.0, 0.);
		break;
	case GLUT_KEY_UP:
		glColor3f(0., 0., 1.0);
		break;
	default:
		break;
	}
	glutPostRedisplay(); //다시 그려줌
}

3.4. glutMouseFunc(void *Func)

  • 마우스 키가 입력되었을 때 실행
  • 예시: glutMouseFunc(MyMouseClick);
void MyMouseClick(GLint Button, GLint State, GLint X, GLint Y) {
	if (Button == GLUT_LEFT_BUTTON && State == GLUT_DOWN) {
		TopLeftX = X;
		TopLeftY = Y;
	}
}

3.5. glutMotionFunc(void *Func)

  • 마우스버튼을 누른채 마우스가 움직일 때 실행
  • 예시: glutMotionFunc(MyMouseMove);
void MyMouseMove(GLint X, GLint Y) {
	BottomRightX = X;
	BottomRightY = Y;
	printf("%3d, %3d\n", X, Y);
	glutPostRedisplay();
}

3.6. glutCreateMenu(void *Func)

  • Menu를 생성
  • 인자 함수에 각 메뉴 마다 실행될 코드를 정의
  • 예시: GLint MyMainMenuID = glutCreateMenu(MyMainMenu);
void MyMainMenu(int entryID) {
	if (entryID == 1)         IsSphere = true;
	else if (entryID == 2)    IsSphere = false;
	else if (entryID == 3)     exit(0);

	glutPostRedisplay();
}

3.7. glutAddMenuEntry(string menu, int id)

  • 현재 메뉴의 항목을 추가함
  • 예시: glutAddMenuEntry("Draw Sphere", 1);

3.8. glutAttachMenu(int button)

  • 현재 메뉴바 호출
  • 예시: glutAttachMenu(GLUT_RIGHT_BUTTON);
    • 우클릭 시 메뉴바 호출

3.9. glutIdleFunc(void *Func)

  • idle상태일 때 실행
  • 예시: glutIdleFunc(MyIdle);
void MyIdle( ) { 
    Delta = Delta + 0.0001;  //좌표가 x축으로 1/1000씩 증가

    glutPostRedisplay( );
}

3.10. glutTimerFunc(int millis, void Func, int value)

  • millis 이후에 함수를 동작

  • 인자로 value를 넘김

  • 반복적으로 사용하기 위해 재귀적 호출이 필요

  • 예시: glutTimerFunc(40, MyTimer, 1);

    void MyTimer(int Value) {
        Delta = Delta + 0.001;  //원하는 동작
        glutPostRedisplay( );  
    
        glutTimerFunc(40, MyTimer, 1);  //재귀적 호출
    }

4. Quadric 객체 만들기

4.1. gluNewQuadric()

  • Quadric객체를 만듦
  • 객체의 모양
    • cylinder
    • disk
    • partial disk
    • sphere
  • 객체 변환
    • 이동: glTranslate3f(x, y, z);
    • 회전: glRotatef(Angle,x,y,z);
  • 시점 설정
    gluLookAt(xc, yc, zc,//카메라 위치
    xl, yl, zl,//보는 점(look at)
    xu, yu, zu);//up-vector
  • 예시
    GLUquadricObj *p;
    p = gluNewQuadric();
    gluCylinder(p, 10, 0, 20, 100, 100); //실린더로 원뿔 만듦
profile
그냥 하자

0개의 댓글