glPushMatrix(); & glPopMatrix();
이 둘을 행렬스택이라 한다.
물체의 위치를 지정할 때 마다 단위행렬을 사용하여 모델뷰 행렬을 초기화 하는 방법은 바람직하지 못~해~
특히나 지금 상태를 저장했다가 나중에 또 써야하는 경우도 종종 있규, 매번 원점으로 돌아가는게 아니라 특정 변환을 거친 상태로 돌아가야 하는 경우도 있기 때문이다.
요때 사용되는 것이 바로 이 행렬스택
행렬스택은 모델뷰행렬과 투영행렬을 저장해두는 일종의 저장공간으로, 다른 프로그램 스택과 마찬가지로 현재 행렬을 스택에 저장해두었다가 필요할 때 꺼내쓰면 되는것이다
원래 좌표축
glPushMatrix();
// 현재 좌표축 저장
:
회전, 변환
:
glPopMatrix();
// glPushMatrix()에 의해 저장된, 변환전의 좌표축으로 복구
glLoadMatrixd(const glDouble *matrix);
현재행렬에 matrix를 전부 대입한다 d는 double, f는 float형으로 로드한다.
추가로
glMutiMatrixd(matrix);
현재행렬에 matrix값을 곱해준다.
glTranslatef(glFloat x, glFloat y, glFloat z)
x, y, z축으로의 이동 값 정의 이것 역시 f는 float, d는 double
glGetFloatv(GLenum pname, GLfloat *params)
pname으로 지정한 것을 params로 넣는다
pname에는 GL_MODEL_VIEW_MATRIX 외에 몇가지가 더 있는데 그건 나중에 알아보구
지금처럼 모델뷰 행렬을 지정하면 params로 현재 모델뷰 행렬을 넣는 것이다
glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)
광원설정
face : 면 GL_FRONT - 앞면, GL_BACK - 뒷면, GL_FRONT_AND_BACK - 앞뒷면
pname : GL_AMBIENT : 주변광의 반사정도
GL_DIFFUSE : 분산광의 반사정도
GL_SPECULAR : 반사광의 반사정도
GL_EMISSION : 방출광의 속성
GL_SHININESS : 반사광의 정도
params : 광원을 적용할 행렬
glNormal3f(GLfloat nx, GLfloat ny GLfloat nz);
법선벡터를 지정한다
법선벡터는 빛의 반사를 계산하는데 쓰인다
법선벡터를 구하는 방법은 법선을 갖게 될 벡터 두개를 서로 곱하면 이 벡터에 대해 수직인 벡터가 결과값으로 나오게 되는데, 이게 바로 법선벡터다
선에 대한 법선은 알겠는데, 면에 대한 법선은 어떻게하느냐
0,1,2,3을 모서리로 으로 생성된 면이 있다고 생각하자
0과 1, 0과 3의 벡터를 구한 뒤 두 벡터를 크로스곱 해주면 면에 해당하는 법선 벡터가 생성된다.
glVertex3f(GLfloat x, GLfloat y, GLfloat z);
정점의 x, y, z좌표를 지정한다
점, 선, 폴리곤 정점을 지정하는데 사용한다.
glLoadIdentity(void);
변환이나 회전된 행렬을 원상태로 돌려줌
단위행렬로 초기화
glViewPort(GLint x, GLint y, GLsize width, GLsize height);
뷰포트를 설정한다.
보여지는 부분의 크기로, 쉽게 창문이라고 생각하면 된다.
800 x 600의 윈도우 화면 전체를 뷰포트로 사용하고 싶으면 glViewPort(0, 0, 800, 600)하면 된다
glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearVal, GLdouble farVal);
최대 보여질 수 있는 범위를 정한다.
멀고 가까운 것은 표현하지 않는다
육각형의 안만 보인다고 생각하면 된다, 보여주고 싶은 것을 육각형으로 만드는 것
뷰포트가 변경되었을 때의 왜곡현상을 줄여줄 수 있다
예를들면
가로 300 세로 300의 뷰포트를 가로 600 세로 300으로 변경하게되면
Vertex는 -1.0 ~ 1.0 사이의 정규좌표를 사용하기 때문에 정사각형을 그렸다고 했을 때 가로길이가 두배로 길어져서 가로가 긴 사각형이 된다, 즉 가로가 두배가 늘어난 사각형으로 보여지게 된다.
그럼 glOrtho를 이용해서 어떻게 하면 되냐?
늘어난 뷰포트의 비율만큼 가로세로 상하를 늘려주면 되는거야
glOrtho(-1, 1, -1, 1, 1, 10) 인 상태에서 가로가 2배 늘어났다면!
glOrtho(-2, 2, -1, 1, 1, 10) 으로 해주면 되는것
glColor3ub(GLubyte red, GLubyte green, GLubyte blue);
딱봐도 걍 알겠네
RGB 색 지정
glutSwapBuffers();
숨겨져있던 히든버퍼의 화면과 현재 화면을 교체한다.
교체된 현재화면은 바로 히든버퍼로 변경되고 이 두 버퍼는 서로 교환해가며 부드러운 애니메이션을 해내게 된다.
한 프레임을 마치면 어련히 등장하는 함수라고 생각하면 된다.
'Graphics > OpenGL' 카테고리의 다른 글
동차좌표 (Homogeneous Coordinates) (0) | 2014.11.20 |
---|---|
glModelView Matrix (0) | 2014.05.27 |
glutGameModeString, EnterGameMode 등 (0) | 2014.05.27 |
OpenGL 기초 - GLUT : Win32 예제 (0) | 2014.05.27 |
OpenGL 기초 - GLUT : 애니메이션 (0) | 2014.05.27 |