• 북마크
  • 추가메뉴
어디로 앱에서 쉽고 간편하게!
애플 중고 거래 전문 플랫폼
오늘 하루 보지 않기
KMUG 케이머그

소프트웨어

[App 개발] NeHe Lesson 11

본문

대충 소스를 돌아가게끔만 만들어서 캡춰해서 게재를 하다보니 혹시라도 소스코드상에 오류나 옛날 루틴의 찌꺼기등이 많이 끼어있을지도 모릅니다. ^^; 너그럽게 봐 주시고, 어쨌든 빨랑빨랑 진도를 나가는 방향으로 해 보겠습니다. 목표는 3D 게임 엔진

**************************************

안녕하세요. 우리가 오늘 할 것이 무엇인지 알고 싶으신 분은 맨 밑에 있는 데모를 보시면 됩니다만, 별로 쓸모는 없습니다. 저는 오늘 여러분에게 사인 곡선을 이용한 애니메이션을 강의하는 bosco입니다. 이 강의는 tutorial 6 에 기초한 것이므로 적어도 그 강의 내용은 이해하고 계셔야 합니다. 소스 코드와 함께 있는 비트맵 그림을 모두 다운로드하셔야 합니다. 아니면 OpenGL이 사용할 수 있는 적당한 이미지를 여러분이 직접 사용하셔도 됩니다.

맨 처음 할 일은 tutorial 6을 열어서 #include 구문 바로 밑에 다음의 코드를 첨가하십시오. 이 코드는 프로그램에서 sin, cos등의 복잡한 수학 공식을 사용할 수 있도록 합니다.


#include


격자 모양의 좌표의 x, y, z 값을 저장하기 위하여 points 라는 배열을 쓸 것입니다. 격자는 45 x 45 크기이며 모두 44 x 44 개의 사각형을 만들 것입니다. wiggle_count 변수는 텍스쳐의 물결이 얼마나 빨리 움직이는지를 기록하는 변수입니다. 매번 두 번째 프레임마다 새 모션을 갱신합니다. 그리고 hold 변수는 깃발의 나부낌을 부드럽게 만드는 부동소숫점 변수입니다. 이 코드를 프로그램 맨 위의 #include 구문 밑, 그리고 GLuint texture[1] 사이에 첨가하십시오.


float points[ 45 ][ 45 ][3]; // 물결 격자의 좌표를 저장하는 배열
int wiggle_count = 0; // 얼마나 빨리 물결이 치는지를 기록하는 카운터
GLfloat hold; // 임시로 부동소숫점을 저장한다


이제 LoadGLTexture() 함수로 갑시다. 우리가 쓸 텍스쳐의 이름은 Tim.bmp 입니다. LoadBMP(“data/NeHe.bmp”)를 찾아서 이름을 바꿔주십시오.


if (TextureImage[0]=LoadBMP("Data/Tim.bmp"))


이번에는 InitGL() 함수의 마지막 return TRUE 전에 다음의 코드를 첨가합니다.


glPolygonMode( GL_BACK, GL_FILL ); // 뒷면을 채운다
glPolygonMode( GL_FRONT, GL_LINE ); // 앞면에는 선을 같이 그린다


여기서는 다각형의 뒷면을 채움으로써 다각형의 앞면만이 보이도록 합니다. 이것은 단순히 개인적인 취항입니다. 반드시 다각형의 위치, 꼭지점의 방향을 지정해 줘야 합니다. 잠시 제가 OpenGL을 배우는 데 있어서 가장 많은 도움을 받았던 책을 소개하려고 합니다. 물론 NeHe 사이트는 말할 것도 없고요. Addison-Wesley 에서 출판된 Programmer’s Guide to OpenGL 을 보세요. 개인적으로 가장 가치있는 책이었습니다.
다시 강의로 돌아와서, 위에서 첨가한 코드 밑에 다음의 코드를 넣습니다.


// x 평면을 모두 참조
for(int x=0; x<45; x++)
{
// y 평면을 모두 참조
for(int y=0; y<45; y++)
{
// 그물망에 물결을 치게 한다
points[x][y][0]=float((x/5.0f)-4.5f);
points[x][y][1]=float((y/5.0f)-4.5f);
points[x][y][2]=float(sin((((x/5.0f)*40.0f)/360.0f)*3.141592654*2.0f));
}
}


잔물결의 돌출부를 없게 만드는 루프를 제안해 준 Graham Gibbons에게 감사의 말씀을 드립니다.

위의 이중 루프는 격자를 초기화합니다. 변수들은 단순히 루프 변수처럼 나누어서 초기화를 하고 있습니다. 깔끔한 방법인지는 잘 모르겠습니다. 부동소숫점을 썼을 때에 생길 이상한 그래픽 오류를 막기 위해 정수 루프를 썼습니다. 변수 x와 y를 5로 나누고 4.5를 뺀 값으로 물결의 중심 부분 좌표를 구했습니다. 축을 이동해서 동일한 효과를 구현할 수 있겠지만 저는 이 방법을 선호합니다.

points[x][y][2]는 사인 함수의 값입니다. sin()함수에는 라디안을 대입합니다. 먼저 부동소숫점 x를 40.0f와 곱하여 degree값을 취한 다음 360.0f를 나누고 pi 값을 곱하거나, 근사값을 취하여 2.0f를 곱하여 라디안으로 변환합니다.

DrawGLScene()함수를 처음부터 다시 기록하였으니, 다음의 코드로 바꿔 넣으십시오.


int DrawGLScene(GLvoid)
{
int x, y; // 루프 변수
float float_x, float_y, float_xb, float_yb; // 깃발을 작은 사각형으로 나누는 변수


루프를 조정하기 위해서 다른 변수를 사용합니다. 밑의 코드를 참조하십시오. 루프를 조정하거나 임시 값을 저장하는 것 외에 특별한 목적은 없습니다.


glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glTranslatef(0.0f,0.0f,-12.0f);

glRotatef(xrot,1.0f,0.0f,0.0f);
glRotatef(yrot,0.0f,1.0f,0.0f);
glRotatef(zrot,0.0f,0.0f,1.0f);

glBindTexture(GL_TEXTURE_2D, texture[0]);


지금까지는 tutorial 6 에서 다 보신 것이고, 씬을 카메라에서 약간 더 멀리 떨어지게 했을 뿐입니다.


glBegin(GL_QUADS); // 사각형 그리기 시작
for( x = 0; x < 44; x++ ) // x 평면을 모두 참조
{
for( y = 0; y < 44; y++ ) // y 평면을 모두 참조
{


이제 다각형을 그리기 시작합니다. 앞에서 배열의 참조값을 int()함수를 써서 정수로 만들었기 때문에 여기서도 정수를 계속 사용하고 있습니다.


float_x = float(x)/44.0f;
float_y = float(y)/44.0f;
float_xb = float(x+1)/44.0f;
float_yb = float(y+1)/44.0f;


위의 네 변수는 텍스쳐의 좌표입니다. 각각의 다각형 (여기서는 격자 내의 사각형) 에 1/44 x 1/44 크기의 텍스쳐를 대입합니다. loops 변수는 왼쪽 아래 꼭지점이고, 나머지 세 개의 꼭지점을 귛가ㅣ 위해서 x+1, y+1 처럼 하나씩 값을 더합니다.


glTexCoord2f( float_x, float_y); // 왼쪽 아래 꼭지점
glVertex3f( points[x][y][0], points[x][y][1], points[x][y][2] );

glTexCoord2f( float_x, float_yb ); // 왼쪽 위 꼭지점
glVertex3f( points[x][y+1][0], points[x][y+1][1], points[x][y+1][2] );

glTexCoord2f( float_xb, float_yb ); // 오른쪽 위 꼭지점
glVertex3f( points[x+1][y+1][0], points[x+1][y+1][1], points[x+1][y+1][2] );

glTexCoord2f( float_xb, float_y ); // 오른쪽 아래 꼭지점
glVertex3f( points[x+1][y][0], points[x+1][y][1], points[x+1][y][2] );


}
}
glEnd(); // 사각형 그리기 끝


위의 코드들이 지금까지 설명한 것을 OpenGL 에게 보내는 루틴입니다. glTexCoord2f() 함수와 glVertex3f() 함수를 각각 네 번씩 호출하는 것을 반복합니다. 사각형이 시계방향으로 그려지고 있다는 것은 앞면이 뒤로 향하게 된다는 것을 뜻합니다. 뒷면은 채워져 있고 앞면은 선이 그려져 있습니다.

만약 반시계방향으로 그리게 되면 우리는 앞면을 보게 되고, 우리는 격자가 쳐 있는 텍스쳐를 보게 될 것입니다.


if( wiggle_count == 2 ) // 매번 두 번째 프레임마다 그림으로서 속도를 줄인다
{


두 번째 씬을 그린 이후 sin 값을 새로 바꾸어 움직임을 줍니다.


for( y = 0; y < 45; y++ ) // y 축을 모두 참조
{
hold=points[0][y][2]; // 현재 값을 바로 왼쪽으로 옮긴다
for( x = 0; x < 44; x++) // x 축을 모두 참조
{
// 현재 값을 바로 오른쪽 값과 같게 한다
points[x][y][2] = points[x+1][y][2];
}
points[44][y][2]=hold; // 마지막 값은 맨 왼쪽 값을 대입
}
wiggle_count = 0; // 다시 0으로 되돌려 놓고
}
wiggle_count++; // 카운터 증가


각 줄의 첫 번째 값을 저장한 다음 값을 왼쪽으로 옮겨서 이미지가 물결을 치게 만듭니다. 처음에 저장한 값을 마지막에 대입함으로서 텍스쳐의 표면이 끊임없이 물결을 치도록 만듭니다. 그리고 wiggle_count 를 초기화하여 움직임이 계속 이루어지도록 합니다.

NeHe에서는 텍스쳐의 표면의 물결에 있던 흠집을 고쳐서 부드럽게 만들었습니다. (2000년 2월)


xrot+=0.3f;
yrot+=0.2f;
zrot+=0.4f;

return TRUE;
}
0 0
로그인 후 추천 또는 비추천하실 수 있습니다.
포인트 228,692
가입일 :
2003-02-18 14:12:30
서명 :
미입력
자기소개 :
미입력

최신글이 없습니다.

최신글이 없습니다.

댓글목록 0

등록된 댓글이 없습니다.
전체 529 건 - 11 페이지
2004.01
18

[App 개발] Cocoa Design Patterns (3)

평일은 바쁘니까 아무래도 주말에 열심히 진도를 나가는 것이 좋겠지요 번역이 많이 서툴러서 읽으시기에 불편하실지 모르겠습니다. 죄송합니다. ***** Class Clusters 클래스 클러스터는 복잡한 상속 구조를 숨기는 방법입니다. 기본적…

2004.01
18

[App 개발] NeHe Lesson 13

바로 뒤에 이어지는 두 개의 폰트 강의는 그냥 건너뛰려고 합니다. 윈도우 전용 코드 설명에 많은 부분이 할애되는 것도 그렇고, agl 함수 래퍼런스도 저에게 부족해서 (그리고 제 실력도 부족해서... 하하...) 일단은 이정도 선에서 폰트는 접도록 하…

2004.01
17

[App 개발] Cocoa Design Patterns (2)

Model-View-Controller 모델-뷰-컨트롤러, 줄여서 MVC 패턴은 패턴 이상의 구조물이라고 간주됩니다. 왜냐하면 이것은 응용 프로그램을 정리하는 기본적인 방법이며 모든 패턴들을 아우르는 상위의 구조적인 요소이기 때문입니다. 왜냐하면…

2004.01
17

[App 개발] Cocoa Design Patterns (1)

코코아를 배울 때, 코코아가 사용하는 용어 때문에 어려움을 겪으시는 분이 많으실 것입니다. 그 중에서도 코코아 설계에 응용된 디자인 패턴의 개념이 익숙하지 않아서 더 힘들게 느껴지시는 분들이 계실 줄 압니다. 제가 갖고 있는 책 Cocoa Progra…

2004.01
15

[App 개발] Nehe Lesson 12

이번 강의에서는 출력 리스트를 이용하는 법을 배우겠습니다. 단순히 리스트를 만들어 빠르게 하는 것 뿐만 아니라 간단한 GL 씬을 만들어야 할 때 몇 줄로 나누어 따로 사용할 수 있습니다. 예를 들어서 각 판을 두 개의 운석으로부터 시작하는 ast…

2004.01
13

[App 개발] 성급한 질문 몇가지 드립니다.

cocoa에서 2D와3D가 합성된...,에를들면, 배경은 3D로 캐릭은 2D로 만들경우(캐릭이 3D 배경이 2D 이거나), OpenGL을 사용하면 되는지요 SDL

2004.01
13

[App 개발] 아래 11번 잘 안되네요.

소스코드랑 그림이랑 받아서 그대로 해 봤는데 이상하게 나옵니다. -_-; 에러는 없이 부드러운 움직임은 보이는데 그림이 깨지네요.

2004.01
13

열람중 [App 개발] NeHe Lesson 11

대충 소스를 돌아가게끔만 만들어서 캡춰해서 게재를 하다보니 혹시라도 소스코드상에 오류나 옛날 루틴의 찌꺼기등이 많이 끼어있을지도 모릅니다. ^^; 너그럽게 봐 주시고, 어쨌든 빨랑빨랑 진도를 나가는 방향으로 해 보겠습니다. 목표는 3D 게임 엔진 …

2004.01
10

[App 개발] 투명처리 어떻게 하나요?

분명 투명하게 처리해서 tiff포멧 한건데요, 흰 바탕이 그대로 나와버리네요. - (void)drawRect : (NSRect)rect { NSImage *imgFile = [NSImage imageNamed:@"JinPict"]; …

2004.01
10

[App 개발] NeHe Lesson 10

이 예제는 Lionel Brits가 만들었습니다. 여기서는 코드의 어떤 부분이 추가되었는지만 설명하고 있기 때문에 이 글에서 소개하는 코드만 가지고는 프로그램이 동작하지 않을 것입니다. 만약에 어떤 부분에 어떻게 코드가 첨가되었는지 알고 싶으시면 소스…

2004.01
09

[App 개발] NeHe Lesson 9

9번 강좌까지 오신 여러분 수고가 많습니다. 본 코스는… 쿨럭~ ㅡㅡ; 지금까지의 공부를 통해서 OpenGL윈도우를 여는 것부터 시작해서 광원과 투명처리를 한 텍스쳐 물체를 회전시키는 것까지, OpenGL에 대하여 많은 이해가 있으셨을 것입니다. 이번…

2004.01
08

[App 개발] NeHe Lesson 8

투명 OpenGL의 많은 특수 효과들은 블렌딩 기능을 이용합니다. 블렌딩이란 기존에 그려져 있는 픽셀과 새로 그리는 픽셀의 색상을 섞는 일입니다. 어떻게 색상을 섞는가는 색상의 alpha값과 블렌딩 함수에 따라 달라집니다. alpha값이란 색상을…

2004.01
07

[App 개발] NeHe Lesson 7

원문이 윈도우 소스를 기준으로 서술되어 있어서 많은 부분이 바뀌어 있습니다. 특히 키보드 입력 부분은 제가 따로 첨부하는 소스를 참조하시는 것이 더 나을 것입니다. (사실 소스를 잘 만들진 못했습니다. 대충 돌아가게만... ^^;;;) 그래도 없는 것…

2004.01
07

[App 개발] 왕초보 자바 질문요~

자바기초를 공부하려구 하는데요... 일단 윈도에서 도스모드로 컴파일 하는 기초적인 것들은 알구 있구요... xcode에서 컴파일하는 방법을 모르겠어요...--; xcode에서 새화일 선택해서 코딩한다음 빌드를 하고픈데 메뉴들이 전부 비활성화 …

2004.01
06

[App 개발] Carbon과 Cocoa중에서 어떤 것을 선택할까?

저는 C/C++ 프로그래머입니다. 옛날 터보씨 시절부터 C를 썼기 때문에 사실 이것을 고치기가 쉽지 않습니다. 자바 프로그래밍은 밥먹고 사는 문제 때문에 프로젝트를 하면서 배우게 되었습니다. 처음에는 C++의 개념을 갖고 접근하는 바람에 많이 헤매었는…

2004.01
05

[App 개발] NeHe Lesson 6

텍스쳐 매핑을 배우면 여러가지 잇점이 있습니다. 만약 화면을 가로질러 날아가는 미사일을 표현한다고 합시다. 지금까지 배운 것을 토대로 하자면 미사일 전체를 형형색색의 다각형을 모아서 만들어야만 합니다. 텍스쳐 매핑을 사용한다면 진짜 미사일 사진 한 장…

2004.01
04

[App 개발] NeHe Lesson 5

오늘은 지난 시간의 프로그램을 확장하여 3차원 공간에 2차원 물체 대신 3차원 물체를 만들어 보도록 하겠습니다. 삼각형 의 왼쪽, 오른쪽, 뒤쪽 면을 덧붙이고, 사각형에는 왼쪽, 오른쪽, 뒷면, 밑면을 덧붙일 것입니다. 그리고 나면 삼각형은 피라밋 모…

2003.12
30

[App 개발] 코코아에서 Color QuickDraw 의 CopyBits에 해당되는게 먼가요?

왕초보 질문있슴다! 코코아에서 캐릭터가 키보드 이벤트에 따라 걷는걸 맹글어 볼랍니다. 예전엔 Color QuickDraw 의 CopyBits를 이용해서 했던거 같은데, 코코아에서는 어떻게 해야 되는지 좀 갈챠주세요. 캐릭 움직…

2003.12
30

[App 개발] NeHe Lesson 4

지난시간에는 삼각형과 사각형에 색상을 입히는 것을 배웠습니다. 오늘은 이 도형들을 축을 기준으로 회전하도록 만들겠습니다. 지난 시간에 썼던 코드에 몇 가지만 추가하면 됩니다. 밑에는 전체 코드를 기록할 것이기 때문에 어떤 부분이 추가되었고 어떤 부분…

2003.12
29

[App 개발] 오디오 어플리케이션을 개발하고 싶습니다.

아직 맥을 가지고 있지는 않지만, 매킨토시 기반으로 오디오 프로그램을 개발하고 싶습니다. 혹시 맥으로 소프트 신서나 브이에스티 플러그인등을 개발하는것에 관심이 있으신분이 계신가요 제가 아직 초보라서 모르는것이 너무 많습니다…

2003.12
28

[App 개발] NeHe Lesson 3

지난 시간에는 삼각형과 사각형을 화면에 출력하는 것을 배웠습니다. 오늘은 도형에 색상을 입하는 두 가지 방법에 대해서 배울 것입니다. Flat Coloring으로 사각형을 단색으로 칠할 것이고, Smooth Coloring으로 삼각형의 꼭지점에 각각 …

2003.12
27

[App 개발] NeHe Lesson 2

원래는 Lesson 1부터 해야 하는데, 이미 살펴보신 분은 아시겠습니다만, 윈도우 여는 방법 설명이 반 이상입니다. MUG 게시판에 디바이스 컨텍스트가 어쩌고 저쩌고 설명하고 있으면 짜증나시겠죠 ^^; 빠진 부분은 나중에 다루어질 것으로 믿고, Le…

2003.12
26

[App 개발] NeHe Tutorial 따라가기 (0)

OpenGL 사이트 중에서 꽤 명성이 있는 NeHe 프로젝트의 튜토리얼을 따라가 보려고 합니다. 저는 지금까지 Win32와 DirectX 프로그래밍을 주로 해 왔고, 따라서 매킨토시의 Xcode도 처음이고, OpenGL도 처음입니다. 저 혼자 공부하는…

2003.12
23

[App 개발] xcode에서요...

그저께 파워북 구입한 쌩초보입니다... 제가 소프트웨어공학과 제학중이라 C++하고 JAVA를 공부해야하는데요... Xcode라는게 프로그래밍툴 맞져 살때 같이 딸려나온 씨디에 보면 여러가지 패키지가 많은데요 어떤거 설치해야하나요 …

2003.12
12

[App 개발] 맥용 간단한 자바 IDE 슈가 입니다.

장점은 1. 용량이 작다. 2. 쉬운 인터페이스 담점은 1. 한글지원이 조금 아쉽다.. (글자 깨짐) 2. 지원하는 옵션이 적다. 제가 Xcode와 더불어 사용하는 툴입니다. 기존에 아범에서 에디트 플러스나 메모장으로 짜시…

2003.12
07

[App 개발] 초보, 인사드립니다.!

아범으론 몇가지 어플 개발했던 경험이 있지만, 맥은 초보자입니다. 지금은 웹프로그램개발(별로 실력은 없음)을 하고 있고요. 개인적으로 맥에서 돌아갈 (OS9) 회원관리 프로그램을 개발해야 할 일이 생겼는데, 자료 구하기가 만만치 않군요. 컴…

2003.12
07

[App 개발] 코코아는 아니고.. 자바 개발툴..

이번에 알북 12인치를 구입하고, 자바 툴을 찾던중.. 제 구미를 당긴 것이 3가지정도 있었는데.. 1. J 빌더 2. BBedit 3. Xcode 4. sugar 이정도입니다. 모두 돌려봤는데.. 제가 하는 작업이 JSP보다…

2003.11
28

[App 개발] 코코아?? 카본??

안녕하세요. 저는 자바 프로그래머입니다. C언어도 할줄은 아는데.. 포인터땜시.. 자바로 바로 스위칭한 넘입니다. 맥으로 앞으로 작업하려고하는데.. 코코아나.. 리얼 베이직이란 것도 배워보려고 하는데.. 고수님들의 많은 조언 부탁드립니다~ …

2003.11
27

[App 개발] 개발자들이 많은 케이머그가 되면 좋겠습니다..

엑스에는 개발툴이 있으니까.. 많은 개발자들이 모이면 좋겠습니다.. 많이 공부도 좀하고.. 많이 많이 개발하게요.. 하하하..그럼 즐 개발..