오픈지엘 행렬스택
지엘 초기 실행시
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)
사진출처 : http://www.cs.kent.edu/~farrell/cg05/lectures/cg17.pdf
지버퍼 / 깊이버퍼
은면 부분 제거를 위해 사용
가시부피 거리 계산
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH); // Depth Testing
glEnable(GL_DEPTH_TEST); // Depth Testing
'Language > C++ & openGL' 카테고리의 다른 글
그래픽스 함수 모음 openGL (0) | 2020.07.04 |
---|---|
그래픽스 정리 (0) | 2020.06.30 |
오픈지엘 gluLookAt 시점 변환 모델 잘림 해결, 뷰포트 (0) | 2020.06.05 |
오픈지엘 이동 회전 크기 복합 변환 (0) | 2020.05.23 |
오픈지엘 마우스 클릭으로 다수의 선 그리기 (0) | 2020.05.21 |
댓글