OpenGL Game Programming

Image - 정보문화사 상세 페이지 - 원서 사이트 - 소스 코드, 가격 검색

정오표

번역서 초판은 원서 사이트의 2001년 9월 오류 정보를 반영한 것입니다.

2장 63p (2002-11-03)

그림 2.3의 PeakMessage()는 PeekMessage()의 오타입니다.

2장 67p (2002-11-03)

코드 제일 아래 if 문에서 닫는 괄호가 빠졌습니다.

if (msg.message == WM_QUIT )

3장 96p 벡터 덧셈 공식 (2005-09-29)

윗 부분에 A(Xa,Ya,Za) + B(Xb,Yb,Zb) = C(Xa + Xb, Ya + Yb, Za + Xb)라는 공식이 나오는데 C의 마지막 성분은 Za + Xb가 아니라 Za+Zb입니다.

A(Xa,Ya,Za) + B(Xb,Yb,Zb) = C(Xa + Xb, Ya + Yb, Za + Zb)

3장 107p

중간의 '행렬의 결합'은 '변환의 결합'이라고 해야 맞습니다. pressf1 님이 알려주셨습니다.

3장 113p 원근 변환 행렬

 | 1  0  0    0     |   | x |   |    x    |
 | 0  1  0    0     | * | y | = |    y    |
 | 0  0  0  1/focus |   | z |   |    -1   |
 | 0  0 -1    0     |   | 1 |   | z/focus |

라고 되어있는데,

| 1  0    0    0   |   | x |   |    x    |
| 0  1    0    0   | * | y | = |    y    |
| 0  0    0    -1  |   | z |   |    -1   |
| 0  0  1/focus  0 |   | 1 |   | z/focus |

라야 맞습니다. pressf1님과 zungzu 님이 알려주셨습니다.

6장 200-201p (2001.11.26)

CrossProduct 함수들의 소스 코드에 - 표시가 빠졌습니다. 그리고 normal[0] = ... 부분의 마지막 부분 색인이 틀렸습니다. vector[2]가 아니라 vector[1]이어야 합니다.

정확한 소스는:

void CrossProduct(float point1[3], float point2[3], float point3[3], float normal[3])
{
     float vector1[3], vector2[3];

     // 외적을 구하는데 필요한 두 개의 벡터들을 만들어낸다.
     vector1[0] = point1[0] - point2[0];
     vector1[1] = point1[1] - point2[1];
     vector1[2] = point1[2] - point2[2];

     vector2[0] = point2[0] - point3[0];
     vector2[1] = point2[1] - point3[1];
     vector2[2] = point2[2] - point3[2];

     // 두 벡터의 외적을 구하고 그것을 normal[]에 저장한다.
     normal[0] = vector1[1]*vector2[2] - vector1[2]*vector2[1];
     normal[1] = vector1[2]*vector2[0] - vector1[0]*vector2[2];
     normal[2] = vector1[0]*vector2[1] - vector1[1]*vector2[0];
}

void CrossProduct(float vector1[3], float vector2[3], float normal[3])
{
     // 두 벡터의 외적을 구하고 그것을 normal[]에 저장한다.
     normal[0] = vector1[1]*vector2[2] - vector1[2]*vector2[1];
     normal[1] = vector1[2]*vector2[0] - vector1[0]*vector2[2];
     normal[2] = vector1[0]*vector2[1] - vector1[1]*vector2[0];
}

202p 아래쪽 배열 정의 오타

202p 아래쪽 normalVector 배열 정의 중

GLfloat normalVector = {0.0f, 1.0f, 0.0f};

에서 []가 빠졌습니다.

normalVector[] = ...
또는
normalVector[3] = ...

가 맞습니다. 참참님이 알려주셨습니다.

p.209 입방체의 앞면 법선 (2003-01-09)

예를 들어서 입방체의 앞면의 법선은 (0, 1, 0)으로 지정되는데, ....의미이다. (0, 1, 0)은 단위 법선이므로..." 에서 (0, 1, 0)이 아니라 (0, 0, 1)이어야 그 문장의 "양의 Z 방향을..."과 일치합니다.

p.245 코드 (2003-01-09)

 // 2D 뷰포트를 설정
 glOrtho(0.0f, width 1.0, 0.0, height 1.0, 1.0, 1.0);

에서 - 기호가 빠졌습니다. 다음과 같이 되어야 합니다.

 glOrtho(0.0f, width - 1.0, 0.0, height - 1.0, 1.0, 1.0);

p.260 Targa 파일 헤더 구조체

crowy님이 알려주셨습니다...

short int colorMapEntrySize 의 형이 short int 가 아니라 unsigned char여야 합니다. 단 그 뒤에 나오는 헤더를 읽는 소스 코드는 정확합니다(1 바이트를 읽습니다).

p. 262 LoadTGAFile 함수의 주석 오류 ( 2002-08-13 )

중간의

 //불필요한 13 바이트는 건너뛴다.

에서 13이 아니라 9 입니다. 그 아래 코드를 보면 아시겠지만 2 바이트 네 개와 1 바이트 하나를 건너 뛰므로 9 바이트입니다...

p.277 오타 하나... (2002.01.29)

itsuki 님이 알려주셨습니다.

p277 중에서 GL_TEXTURE_ID는 GL_TEXTURE_1D의 오타입니다. I가 아니라 숫자 1입니다.

p.283 주석 부분

itsuki 님이 알려주셨습니다. 289 페이지 코드의 주석에 오타가 있는데, 다음과 같이 되어야 합니다.(간단히 말하면 왼쪽 아래부터 반시계 방향입니다...)

glBegin(GL_QUADS);
     glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.5f);    // 왼쪽 아래
     glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);      // 오른쪽 아래
     glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, -0.5f);     // 오른쪽 위
     glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f);    // 왼쪽 위
glEnd();

10장 370p MD3 언급 부분

370p 제일 처음 문단에 Quake3과 MD3 파일에 대한 언급이 있는데 오류입니다. 책에 실제로 나오는 것은 Quake2의 MD2 파일 다루기입니다..

15장 482p 소스 오류 ( 2002-08-14 )

중간 부분에

// 3D 공간 상의...
...
pos.y = GetHeight(pos.x, pos.z) + size 0.5f;

size와 0.5f 사이에 - 가 빠졌습니다. 제대로된 코드는

pos.y = GetHeight(pos.x, pos.z) + size - 0.5f;

18장의 MD2 모델 로딩

639 p를 비롯한 곳곳에 MD2 모델의 삼각형 색인 저장 부분이 나오죠... 639p를 보면 for(i = 0; inumTris; i++) 루프가 for(j = 0; ..) 루프 안에 들어 있는데, 루프 내부를 자세히 보면 j는 전혀 쓰이지 않습니다. for (j=0;..) 루프는 쓸데없이 시간만 낭비하는 것이므로 제거해 버리세요..

p 807 역자 추천 KGDA 홈페이지 주소 ( 2002.01.29)

역시 itsuki 님이 알려 주셨습니다. http://www.kdga.or.kr가 아니라 http://www.kgda.or.kr 입니다.

10장, 15장 cacti 예제 다운 현상 (2002-01-30)

저자의 얘기로는 코드 중

    glLockArraysEXT(0, MAP_X * MAP_Z * 6);

이것을 이렇게 바꾸면 해결이 된다고 합니다.

    glLockArraysEXT(0, MAP_X * MAP_Z);

(참고: http://glbook.gamedev.net/errata.asp )

20 장 예제 simpengine.h

원서 사이트에서 다운받은 소스 코드 중 simpengine.h이 없습니다. 책에 나온 것을 적당히 입력한 것을 OgpSimpEngineHeader 페이지에 올려 두었습니다.

17, 21장 키보드 코드 버그

17, 21장에 나오는 코드의 KeyDown, KeyUp 메서드의 매개변수가 char 형인데 char는 부호 있는 형식이기 때문에 127 이상의 값을 음수로 해석합니다. 그래서 키 코드가 127 이상인 키들을 제대로 처리하지 못합니다. 이를 해결하려면 매개변수들의 형식을 unsigned char로 바꿔야 합니다.

기타 정보

MD2 파일에 대해

^^ MD2 파일이 간단하고 다루기도 편해서 좋죠. 그러나 퀘이크 2 자체가 한물 갔으니... MD2는 캐릭터 파일 다루는 법을 연습하는 용도로만 공부하시고, 실제로 뭔가를 만드신다면 퀘이크 2 다음 세대의 게임들에 쓰이는 파일들을 공부하시길.. 저는 머리, 상체, 하체를 따로 움직일 수 있는 퀘이크 3의 MD3 쪽에 관심이 갑니다.

이런 게임 모델 파일들에 대한 정보는 개발자 사이트들보다는 게이머 사이트들에 더 많은 듯 하구요. 또 MD2를 비롯한 여러 게임 캐릭터 모델의 작성에 특화된 모델링 도구도 있습니다. 검색 엔진에서 MilkShape 를 찾아보세요.... 그리고 퀘이크 팬 사이트, 모드 제작 사이트도 찾아 보시구요.. http://www.planetquake.com 등등...