본문 바로가기
Language/C++ & openGL

오픈지엘 행렬스택 glPushMatrix/glPopMatrix, 시점변환gluLookAt, 평행|원근 투상 glOrtho/gluPerspective

by javapp 자바앱 2020. 6. 11.
728x90

오픈지엘 행렬스택 

 

지엘 초기 실행시

WCS = MCS 이다.

 

이동변환을 하면  WCS와 MCS가 분리된다.

변환행렬을 통해 WCS와 MCS를 일치하게 된다.

 

함수 순서는

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

gluLookAt

 

물체생성함수{ //계층구조 모델링

        glPushMatrix();

        glColor3f(0, 0, 0);

        glTranslatef(1.5, -0.25, 0);

        glutSolidSphere(0.25, 18, 18);

        glPopMatrix();

}

 

 

모델변환에서 복합변환을 할때 

행렬은 후위 곱셈을 하기 때문에 

p' = I * S * R * P

물체 변환은 P R S

 

물체의 좌표는 물체의 중심이다.

 

WCS가 MCS와 일치되며 따라가게 된다.

새로 물체를 생성하면 이동된 WCS을 기준으로 그려지게 된다.

그래서

좌표계를 되돌리기 위해서는 스택 방식 필요

glPushMatrix()

이동

회전

스케일

glPopMatrix()

 

 


 

#include <GL/glut.h>

#include <GL/gl.h>

#include <GL/glu.h>

#include <stdio.h>

#include <windows.h>

#include "math.h"

 

void drawBody()

{

        glPushMatrix();

        glColor3f(255, 0, 0);

        glTranslatef(0, 1.0, 0);

        glScalef(2, 2, 1);

        glutSolidCube(1);

        glPopMatrix();

}

 

void drawLeftArm()

{

        glPushMatrix();

        glColor3f(255, 255, 0);

        glTranslatef(-1.5, 1.0, 0);

        glScalef(0.5, 2, 0.5);

        glutSolidCube(1);

        glPopMatrix();

 

        glPushMatrix();

        glColor3f(0, 0, 0);

        glTranslatef(-1.5, -0.25, 0);

        glutSolidSphere(0.25, 18, 18);

        glPopMatrix();

}

 

void drawRightArm()

{

        glPushMatrix();

        glColor3f(255, 0, 255);

        glTranslatef(1.5, 1.0, 0);

        glScalef(0.5, 2, 0.5);

        glutSolidCube(1);

        glPopMatrix();

 

//물체 push 후 pop으로 시점 초기화



        glPushMatrix();

        glColor3f(0, 0, 0);

        glTranslatef(1.5, -0.25, 0);

        glutSolidSphere(0.25, 18, 18);

        glPopMatrix();

}

 

void MyDisplay()

{

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//display 함수에 깊이 버퍼 초기화 코드 삽입 (깊이 버퍼 초기화함)

        glMatrixMode(GL_MODELVIEW);

        glLoadIdentity();

 

        // Axis 기준선

        glBegin(GL_LINES);

        glColor3f(1.0f, 0.0f, 0.0f);              glVertex3f(0.0f, 0.0f, 0.0f);             glVertex3f(5.0f, 0.0f, 0.0f);

        glColor3f(0.0f, 1.0f, 0.0f);              glVertex3f(0.0f, 0.0f, 0.0f);             glVertex3f(0.0f, 5.0f, 0.0f);

        glColor3f(0.0f, 0.0f, 1.0f);              glVertex3f(0.0f, 0.0f, 0.0f);             glVertex3f(0.0f, 0.0f, 5.0f);

        glEnd();

 

        // 몸통 위에서 구현

        drawBody();

 

        // 팔

        drawLeftArm();

        drawRightArm();



        glFlush();

}

 

int main(int argc, char** argv)

{

        glutInit_ATEXIT_HACK(&argc, argv);

 

        glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH);      // Depth Testing

        glutInitWindowSize(500, 500);

        glutCreateWindow_ATEXIT_HACK("OpenGL Example");

 

        glEnable(GL_DEPTH_TEST);                  // Depth Testing

 

        glMatrixMode(GL_PROJECTION);

        glLoadIdentity();

        glOrtho(-5.0, 5.0, -5.0, 5.0, -10.0, 10.0); //지엘 투상변환

 

        glClearColor(1.0, 1.0, 1.0, 0.0);

        glutDisplayFunc(MyDisplay);

 

        glutMainLoop();

        return 0;

}

 


void MyDisplay()

{

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//display 함수에 깊이 버퍼 초기화 코드 삽입 (깊이 버퍼 초기화함)

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-5.0, 5.0, -5.0, 5.0, -10.0, 10.0); //평행투상 (left, right, bottom, top, near, far)
        //gluPerspective(60, 1.0, 0.0, 40.0); //원근투상 (시야각, 종횡비, near, far)

        //glFrustum(left, right, bottom, top, near, far); //

 

        glMatrixMode(GL_MODELVIEW);

        glLoadIdentity();

 

        // Axis 기준선

        glBegin(GL_LINES);

        glColor3f(1.0f, 0.0f, 0.0f);              glVertex3f(0.0f, 0.0f, 0.0f);             glVertex3f(5.0f, 0.0f, 0.0f);

        glColor3f(0.0f, 1.0f, 0.0f);              glVertex3f(0.0f, 0.0f, 0.0f);             glVertex3f(0.0f, 5.0f, 0.0f);

        glColor3f(0.0f, 0.0f, 1.0f);              glVertex3f(0.0f, 0.0f, 0.0f);             glVertex3f(0.0f, 0.0f, 5.0f);

        glEnd();

 

        gluLookAt(3.0, 3.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //(카메라 위치, 보는 점, 카메라 머리)

        // 몸통 위에서 구현

        drawBody();

 

        // 

        drawLeftArm();

        drawRightArm();

 

        glFlush();

}

 

       glMatrixMode(GL_PROJECTION); 

        ..... 

       glMatrixMode(GL_MODELVIEW);

        ....

시점 변환 후 , 평행투상

 

        glOrtho(-5.0, 5.0, -5.0, 5.0, -10.0, 10.0); //평행투상 
        gluPerspective(60, 1.0, 0.0, 40.0); //시야각 fovy, 종횡비 aspect, near, far

        glFrustum(left, right, bottom, top, near, far);

 

원근 투상

        gluPerspective(60, 2.0, 0.0, 40.0); //시야각, 종횡비, near, far  -> 종횡비 2배로 했을때

원근투상

 


gluLookAt(eyex. eyey, eyez, atx, aty, atz, upx, upy, upz)

gluLookAt 도움되는 jpg

사진출처 : http://www.cs.kent.edu/~farrell/cg05/lectures/cg17.pdf

 

http://www.cs.kent.edu/~farrell/cg05/lectures/cg17.pdf


 지버퍼  / 깊이버퍼

 

은면 부분 제거를 위해 사용

 

가시부피 거리 계산

 

glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH);      // Depth Testing

  

 

glEnable(GL_DEPTH_TEST);                  // Depth Testing

 

댓글