'OpenGL'에 해당되는 글 3건

  1. 2006/06/26 걷는 실린더 로봇 구현 완성. (3)
  2. 2006/05/22 투영의 종류
  3. 2006/05/20 OpenGL Part1. 2 OpenGL의 사용

3학년 1학기 수강과목인 컴퓨터그래픽스의 텀 프로젝트,

걷는 실린더 로봇 구현하기를 완성했다.


마우스 왼쪽 버튼을 누른 상태로 드레그 하면 회전이 가능하고,
마우스 오른쪽 버튼을 누른 상태로 드레그 하면 확대, 축소가 가능하다.

휠 마우스를 클릭하면 메뉴가 나오는데, 걷기, 달리기, 특수동작의 메뉴가 있다.

특수동작은 메트릭스!!

그냥 과제는 "걷는" 로봇 만들기 이지만 다들 이상한거 옵션으로 하나 둘씩 붙이길래 나도 고심끝에 정한거다.

시간만 많으면 여러가지 동작을 더 집어 넣을 수 있지만 그건 그저 시간낭비일뿐, 이걸 체점하는 조교님도 그다지 높게 평가해 주시진 않는다.

이젠 리포트 쓰는 일만 남았구나 >_ <)

이로서 이번학기가 완벽히 끝난건가.... 정말 바쁘고 할일이 많은 한학기였어..

Posted by Mastojun
TAG OpenGL
출처 : 최윤철 임순범, [컴퓨터그래픽스 배움터 - 개정팜], 생능출판사, 2006

1) 평행투영(Parallel Projection)
  평행투영에서는 3차원 객체를 2차원 평면인 투영면에 일정한 각도로 투영을 시키며, 이 경우 모든 투영선이 평행이므로 원래 객체들 간의 상대적인 크기가 그대로 유지된다. 따라서 투영도에서 객체 간에 크기의 비교가 가능하게 되며, 이러한 이유로 평행투영은 기계나 건축설게의 도면 제도 등 CAD분야에서 많이 사용되고 있다. 평행투영은 투영되는 각도에 따라 직각투영, 등축투영, 경사투영으로 분류된다.

  (1) 직각투영(Orthographic Projection)
     직각투영은 3차원 공간의 좌표계에서 x,y,z축 가운데 한 축과 투영방향이 동일하고 투영면은 이 축과 직각이 되도록 배치하여 투영하는 방법이다. 직각투영에서는 상대적인 크기가 유지되고 지각방향에서 바라본 각도도 유지되면서 객체의 모습이 투영면에 나타나므로 기계나 건축설계에 적절한 투영방식이다. 그러나, 1개의 투영도로는 객체의 전체적인 모습을 파악하기 어려우므로 3차원 객체의 설계에는 여러 개의 투영도를 사용한다. 기계설계에서 많이 사용되는 3면도의 경우 앞, 옆, 위에서 각각 z축, x축, y축 방향으로 투영한 정면도, 측면도, 평면도, 그리고 별도로 작성된 조감도(또는 입체도)를 묶어서 같이 사용한다.
     지각투영의 처리과정에서 가장 큰 장점은 변환과정의 계산이 매우 간단하다는 것이다. 투영방향이 z축 방향일 때, 투영선이 z축과 평행하고 투영면이 z  = 0인 xy평면인 경우 공간상의 임의의 점 을 투영시키면 투영된 점은 z좌표값만 0으로 바뀐다.

  (2) 등축투영(Axonometric Projection)
     직각투영에서는 투영선이 축과 평행하고 이에 따라 투영면은 축과 직각방향이었지만, 등축투영에서는 투영면이 축과 직각이 아닌 방향으로 위치하고 있다. 대표적인 등축투영방식인 삼축투영(Isometric Projection)에서는 투영면이 각 축의 방향으로 같은 거리에 위치 하고 이 평면에 직각방향으로 투영을 한다. 즉, 투영면은 x+y+z = c 인 평면이 되며 모든 투영선의 방향은 이 평면에 직각인 x = y = z벡터와 평행이 된다. 등축투영은 설계도를 작성할 때 3면의 조감도 또는 입체도로 많이 사용되며, 직각투영과 마찬가지로 투영결과에서 상대적인 크기는 유지되지만 각도는 유지되지 않는다.

  (3) 경사투영(Oblique Projection)
     경사투영은 투영방향과 투영면이 직각방향이 아니고 일정한 다른 각도를 이루고 있는 경우이다. 투영면의 최종결과를 시점에서부터 바라보는 방향과 투영이 되는 투영선의 방향이 다른 각도를 이루고 있는 특수한 경우이다. 경사투영 방식으로 투영선의 각도가 45도 또는 60도인 경우가 많이 사용되고 있으며, 역시 투영결과에서 객체들의 상대적인 크기는 유지된다.

2) 원근투영(Perspective Projection)
  원근투영에서는 평행투영에서와 달리 투영선들이 평행을 이루지 않으며 따라서 투영면에 직각방향으로 투영이 되지 않는다. 평행투영에서는 투영방향만 설정하지만 원근투영에서는 하나의 시점(View Point)에서 3차원 객체를 바라본 모습이 3차원 투영면에 나타나므로 모든 투영선이 시점에 모이게 된다. 즉 3차원 공간의 객체를 구성하는 각 꼭지점 P와 시점 V를 연결하는 직선이 투영면과 만나는 교차점 P'에 투영이 된다.
원근투영을 이용하면 시점에서 멀리 떨어져 있는 객체는 작게 투영되고, 가까이 있는 객체는 상대적으로 크게 투영이 되므로, 사람의 눈으로 3차원 사물을 보듯이 보다 현실감 있는 투영결과를 얻을 수 이다. 투영면에서의 좌표값 xp, yp, zp 는 다음과 같이 구할 수 있다.
  xp = dx / (d-z)
  yp = dy / (d-z)
  zp = 0
  여기서 x와y의 값이 주어졌을 때, d는 상수이므로 투영된 좌표 xp와 yp는 시점으로부터 의 거리인 (d-z)에 반비례한다. 따라서 공간상의 두 점이 x와 y좌표는 같은 값이고 z좌표값만이 서로 다른 경우, 시점으로부터 멀리 떨어져 있는 점이 가까이 있는 점보다 투영면에서 x와 y의 좌표값이 작게 된다. 즉, 멀리 떨어져 있는 점이 투영면에서 원점에 더 가깝게 투영되어 나타난다.

[ 직각투영, 등축투영, 평행투영회전, 원근투영회전 을 이용한 큐브 다운받기 ]
/* 마우스 클릭 (좌, 휠, 우) 를 하여 회전축을 변경할 수 있습니다. */

Posted by Mastojun
교재 : OpenGL SuperBible 제 3판

OpenGL이란?
  _ "그래픽 하드웨어 제어를 위한 소프트웨어 인터페이스"
  _ 언어가 아닌 API
  _ 플랫폼 독립성을 가지고 있다.

OpenGL을 사용하기 위해서 필요한 헤더
  _ gl/gl.h , gl/glu.h (include 폴더에 없을경우 다운받아야 함..-_-..;)

데이터 타입
  _ OpenGL은 자체 데이터 타입을 정의하고 있는데 그 이유는 다양한 환경에서의 적응을 위해서임.

함수의 이름짓기 규칙
  _ <라이브러리 접두어><루트 명령어><선택적인 인자의 수><선택적인 인자의 타입>
     예) glColor3f : gl라이브러리 이며 Color값을 나타내는것이고 3개의 float형을 인자로 가진다.

GLUT의 사용.
  _ OpenGL프로그래밍을 보다 편리하게 진행하도록 하기 위해 개발된 것.
  _ 특정 운영체제에 대한 GUI프로그래밍 지식이 없어도 어떠한 운영체제에서도 사용 가능.
  _ 하지만 모든 GUI기능이 담겨져 있지는 않으므로 완전하게 GLUT에 의존하는 것은 좋지 않다.
  _ 헤더는 gl/glut.h

간단한 OpenGL프로그램

#include <OpenGL.h> // gl.h와 glut.h헤더를 포함하는것.

void RenderScene(void)
{
// 색상 버퍼 지우기. 버퍼란 이미지 정볼르 담는 공간을 의미하는것으로, 드로잉에 사용되는 적색, 녹색, 청색 요솔르 색상 버퍼 또는 픽셀 버퍼라고 한다.
  glClear(GL_COLOR_BUFFER_BIT);
  // 큐 내용의 실행. 지금까지 실행되지 않은 모든 OpenGL명령을 실행하도록 하는것.
  glFlush();
}

void SetupRC(void)
{
// 창을 지우는데 사용되는 함수.
  glClearColor(1.0f, 0.0f, 1.0f, 1.0f);
}

void main(void)
{
  //출력모드는 싱글 버퍼이며 (화면에 직접 그리기), RGB색상 모드를 사용.
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  // Simple이라는 이름의 윈도우 창 생성
  glutCreateWindow("Simple");
  // 창이 처음으로 출력될 때나 창의 크기가 변경될 때, 최소화되었다가 다시 등장할 때 호출되는 콜백 함수.
  glutDisplayFunc(RenderScene);
  // 일종의 관례와도 같은 부분으로, OpenGL의 초기화 작업.
  SetupRC();
// GLUT프레임웍을 실행하는 기능을 하며, 화면 출력에 대한 콜백과 다른 함수들을 정의하는것.
  glutMainLoop();
}
Posted by Mastojun
TAG OpenGL