게임 시스템 모듈 구성

게임개발로그 2011. 2. 13. 23:42



일반적인 게임 시스템의 구조는 다음과 같다.  각 모듈별로 설명하기가...귀차니즘...OTZ

'게임개발로그' 카테고리의 다른 글

아이폰 2D 게임엔진 Cocos2D  (1) 2011.03.16
게임 개발 기초  (2) 2011.02.14
게임 시스템 모듈 구성  (0) 2011.02.13
DirectX 와 OpenGL  (0) 2011.02.13
3차원의 기초  (0) 2011.02.13
3D 렌더링의 종류와 Java  (0) 2011.02.13

DirectX 와 OpenGL

게임개발로그 2011. 2. 13. 23:13


OpenGL은 DirectX 가 개발되기 전인 1992년 3D 그래픽을 주도하던 SGI 사에 개발한 3차원 SDK이다.
초창기 OpenGL을 사용하기 위해서는 고가의 그래픽 가속기를 장착해야만 했다. Microsoft 사는 3차원
렌더링이 저사양 기계에서도 동작할 수 있는 가벼운 SDK로 DirectX를 만들게 되었다.
OpenGL과 DirectX의 우열을 따지는 것은 큰 의미가 없으며, 개발 게임의 목표 플랫폼이 무엇인지를
고려해야 한다.  windows XP에서는 OpenGL1.1을, Vista에서는 OpenGL 1.4를 opengl32.dll 형태로
제공하지만, 최신버전을 지원하는 일에는 매우 소극적이다. 
DirectX는 Mircrosoft 운영체제에서만 작동하며,  많은 부분 OpenGL의 기본원리들을 가져다 사용한다.
하지만 PC 운영체제 시장 대부분을  윈도우가  점유하고 있기 때문에, 게임업계에서는 DirectX가 사실상
표준으로 자리매김하고 있다.
자신이 개발하는 게임의 대상 플랫폼에 적절한 3차원 SDK를 사용하자.

'게임개발로그' 카테고리의 다른 글

아이폰 2D 게임엔진 Cocos2D  (1) 2011.03.16
게임 개발 기초  (2) 2011.02.14
게임 시스템 모듈 구성  (0) 2011.02.13
DirectX 와 OpenGL  (0) 2011.02.13
3차원의 기초  (0) 2011.02.13
3D 렌더링의 종류와 Java  (0) 2011.02.13

visual studio2008 에서 커스텀 헤더파일과 라이브러리 포함시키기

개발도구로그 2011. 2. 13. 21:54


도구메뉴 > 옵션 > 프로젝트 및 솔루션 > VC++ 디렉토리 에서 임의의 헤더파일과 라이브러리를 포함시킬 수 있다.

우측상단의 드롭다운 리스트에서 포함(include)파일 / 라이브러리 파일을 선택한 뒤, 해당 경로 디렉토리를 추가시켜 줄수 있다. 이런 설정값들은 한번 설정하면, 다른 프로젝트들에도 적용이 된다.

3차원의 기초

게임개발로그 2011. 2. 13. 21:05


3차원을 모델링하는 과정은 카메라로 사진을 찍는 과정과 유사하다.  3차원 모델링의 목표는 
3차원상의 모델을 2차원의 모니터 화면으로 변환 또는 투영하는 것이다. 이러한 과정은 카메라에서
볼 수 있는 시야각(화각)을 정의하고, 이 시야각에 들어오는 3차원 상의 물체좌표를 삼각함수와 
간단한 비례공식을 이용하여 2차원상의 좌표로 변환하여 이루어진다. 
수학적으로 표현한 3차원 공간은 데카르트 좌표계를 사용하고, 모니터는 그 특성상 화면좌표계를 사용한다. 
화면 좌표계는 좌측상단이 원점(0,0)이고 아래방향으로 갈수록 y가 증가하지만, 대부분의 게임 3차원 공간에서
사용하는 데카르트 좌표계는 좌측하단을 0,0으로 하여 위로 갈수록 y가 증가한다.  이러한 좌표 차이로 인해
둘 간에 적절한 변환이 이루어져야 한다. 
결국 3차원 엔진이라는 것은 수학적으로 가상의 3차원 공간을 설정하고, 그것에 대한 연산을 하여 2차원으로
변경하고 그리는 과정이다. 끊김없이 부드럽게 보여줘야 하기 때문에, 불필요한 수학연산을 하지않고 최소화
하는 것이 중요하다.  그래서 카메라 시야각에 존재하는 모든 사물을 그리는 것은 비효율적이기 때문에 
잘려진 피라미드 모양의 절두체 공간에 존재하는 사물만을 그린다. 
또 그 공간 안에서 카메라에 가까이 있는 물체가 뒤의 물체를 가리게 될 경우, 뒤 물체는 그릴 필요가 없어진다. 
즉 보이지 않는 면에 대해서는 (화면에) 그릴 필요가 없는 것이다. 절두체의 경계에 걸려있는 물체는 다 그려질
필요없이 보여질 부분만 잘라내어 그리면 좀더 효율적으로 그릴 수 있게된다.  

'게임개발로그' 카테고리의 다른 글

아이폰 2D 게임엔진 Cocos2D  (1) 2011.03.16
게임 개발 기초  (2) 2011.02.14
게임 시스템 모듈 구성  (0) 2011.02.13
DirectX 와 OpenGL  (0) 2011.02.13
3차원의 기초  (0) 2011.02.13
3D 렌더링의 종류와 Java  (0) 2011.02.13

3D 렌더링의 종류와 Java

게임개발로그 2011. 2. 13. 20:55


광선 추적법(ray tracing)
실세계의 빛을 모델링하는 것과 유사하다. 하지만 광원으로부터 우리의 눈으로 오는 광선을 모델링하는 대신, 
반대로 우리 눈이 세계를 바라보는 광선을 모델링한다. 스크린 상의 모든 픽셀에 대한 광선을 모델링하는 것은
산술적으로 많은 비용이 들기 때문에 3차원 그래픽에서 잘 사용되지 않지만, 더 현식적인 결과를 보여준다. 

다각형 모델링(polygon modeling)
실시간 게임과 컴퓨터가 생성한 이미지를 사용하는 영화에서는 3차원 렌더링 기술로 다각형 모델링을 사용한다. 
polygon modeling에서는 3차원 세계를 편평한 다각형으로 해석한다. 다각형은 편평하지만,  3개 이상의 변을 갖는
도형이다.  렌더링 속도가 빠르지만, 둥근 구와 같은 객체는 충분한 개수의 다각형을 사용하지 않으면, 잘 표현이 
되지 않는다. 3차원 가속카드와 같은 하드웨어를 사용하여 속도를 가속화 시킬 수 있다. 

자바 3D 렌더링 
Java3D는 은면제거, 충돌검사, Scene  관리를 처리해주는 하이레벨  API이다. Java3D는 자바로 작성되었지만, 
코어에서 3D  렌더링을 위해 OpenGL과 DirectX를 사용한다. Java3D는 윈도우와 리눅스에서도 사용가능하지만,
라이센스 문제로 SDK 1.4.1에 포함되지 않았으며, Mac OS X에서는 사용할 수 없다. 
반면 자바 OpenGL 바인딩은 상업용 제품을 위해 무료로 사용가능하며, Mac OS X를 포함한 다양한 하드웨어에서
사용가능하다. OpenGL API는 저수준 API이며,  장점을 활용하기 위해서는 3차원 그래픽 프로그래밍에 대해 
더 많은 지식을 필요로한다.  OpenGL 바인딩은 단순히 자바코드를 OpenGL 형식으로 접근할 수 있게한다. 

잘 알려진 자바 OpenGL 바인딩으로 GL4Java(www.jausoft.com/gl4java.html)와 LWJGL(java-game-lib.sourceforge.net)가 
있다. GL4 Java는 AWT, Swing 과 함께 사용할 수 있으며 더 많은 시스템에서 사용가능하지만 업데이트가 되지않아
최신의 OpenGL 기능을 사용할 수 없다. 
LWJGL (Light-Weight Java Game Library)는 OpenGL과 상호작용하기 위해 NIO native 버퍼를 사용하기 때문에 
속도가 더 빠르다. 현재 정기적으로 업데이트 되고 있지만, AWT, Swing과 호환하여 사용할 수 없다. 

소프트웨어 기반의  3차원 폴리곤 렌더러는, 하드웨어 기반의 렌더러 보다 속도가 더 느리지만 큰 스케일의 게임을
위한 솔루션으로 적합하다. 소프트웨어 기반의 3D 렌더러를 구축하는 과정에서 하드웨어 기반 렌더러의 동작방식을
이해하게 되고, 하드웨어 렌더러에도 적용할 수 있는 많은 3D  그래픽 기술을 배울 수 있다. 

'게임개발로그' 카테고리의 다른 글

아이폰 2D 게임엔진 Cocos2D  (1) 2011.03.16
게임 개발 기초  (2) 2011.02.14
게임 시스템 모듈 구성  (0) 2011.02.13
DirectX 와 OpenGL  (0) 2011.02.13
3차원의 기초  (0) 2011.02.13
3D 렌더링의 종류와 Java  (0) 2011.02.13

수학 교과과정 (초등학교~고등학교)

학습로그/수학 2011. 2. 13. 17:50


본격적인 수학 학습에 돌입하기에 앞서, 학년별 수학 교과 과정을 알아봤다.  

초등학교 교과과정



중학교 교과과정
중학교 수학교과서는 개정되어, 수학1 수학2로 구성되어 있는 듯...하다.  특이한 것은 "수학1 익힘, 수학2 익힘2 교재가 
별도로 있어서 다양한 문제를 풀어볼 수 있게 한것 같았다. 
목차는 교학사 사이트를 참고하였다. 

 수학1 수학2 

 


고등학교 교과과정
고등학교는 수학, 수학1, 수학2, 기하와 벡터, 미적분학과 통계 과목이 있었다. 
 수학 수학1, 수학2 
 

 


 
 

 기하와 벡터 미적분학과 통계

 




'학습로그 > 수학' 카테고리의 다른 글

일반각과 호도법  (0) 2011.02.14
삼각함수의 성질  (0) 2011.02.14
삼각함수  (0) 2011.02.14
벡터연산을 위한 클래스 구현(cpp)  (0) 2011.02.14
벡터 연산(Vector Operations)  (0) 2011.02.14
수학 교과과정 (초등학교~고등학교)  (0) 2011.02.13

OpenGL ES 사용설정

아이폰 2011. 2. 13. 01:51


 OpenGL ES 를 사용하기 위한 설정방법을 알아보자. 
아이폰에서는 Core Animation의 CAEAGLayer 클래스를 통하여,  OpenGL ES 엔진을 사용한  그래픽 하드웨어 연산을
추상화 해준다.  UIView의 서브클래스에 일반 코어애니메이션 레이어가 아닌 CAEAGLayer 를 추가하면,   UIView의
 drawRect 메소드가 아닌 표준 OpenGL ES 함수호출을 통헤 드로잉 작업을 할 수 있게된다. 

OpenGL ES를 사용하기 위해 EAGLView 클래스를 생성해보자.  "Beginning iPhone Game Development (출판사:Apress) " 를
참고하였다. (물론 이 책도 애플 OpenGL ES 개발자 레퍼런스의 샘플을 수정한 예제를 제공한 것이다.)

1. 먼저 OpenGLES.framework와 QuartzCore.framework 를 프레젝트에 추가한다 


2. EAGLView 클래스 정의는 다음과 같다. 
#import <UIKit/UIKit.h>
#import <OpenGLES/EAGL.h>
#import <OpenGLES/ES1/gl.h>
#import <OpenGLES/ES1/glext.h>

@interface EAGLView : UIView {
    
@private
    // 백버퍼의 넓이, 높이 
    GLint backingWidth;
    GLint backingHeight;
    
    EAGLContext *context;
   
 // 렌더버퍼, 프레임버퍼 식별자
    GLuint viewRenderbuffer, viewFramebuffer;
    
   // 깊이 버퍼, 사용하지 않으면 0
    GLuint depthRenderbuffer;
}

- (void)beginDraw;
- (void)finishDraw;
- (void)setupViewLandscape;
- (void)setupViewPortrait;

3.  UIView 클래스의  +(Class)layerClass 메소드를 오버라이드하여, CAEAGLayer 반환하도록 하여 OpenGL 드로잉을 가능하게 한다
+ (Class)layerClass {
    return [CAEAGLLayer class];
}

4.  드로잉 목적에 맞게 CAEAGLayer 의 속성을 설정하고, Context 생성 
- (id)initWithFrame:(CGRect)rect {
    
    if ((self = [super initWithFrame:rect])) {
        // Get the layer
        CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
        
        eaglLayer.opaque = YES;
        eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                        [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
        
        context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
        
        if (!context || ![EAGLContext setCurrentContext:context]) {
            [self release];
            return nil;
        }
		self.multipleTouchEnabled = YES;
	}
    return self;
}


5. 프레임 버퍼와 렌더링 버퍼를 생성한다. 
렌더버퍼는 색상 등의 데이터로 채워진 2차원 표면이고, 프레임버퍼는 여러 렌더버퍼로 구성된다.
(이 예제에서 프레임버터에 렌더버퍼와 깊이 버퍼를 연결하였다. )
- (void)layoutSubviews 
{
	[EAGLContext setCurrentContext:context];
	[self destroyFramebuffer];
	[self createFramebuffer];
	[self setupViewLandscape];
}

- (BOOL)createFramebuffer {    
    // 프레임버퍼와, 렌더버퍼를 위한 식별자 값 얻기 (식별자는 GLuint 형 타입)
    glGenFramebuffersOES(1, &viewFramebuffer);
    glGenRenderbuffersOES(1, &viewRenderbuffer);
    
    // 파이프라인에 바인딩 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
	
    // 렌더버퍼 메모리 할당
    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
     // 렌더버퍼를 프레임버퍼에 연결 
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
    
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
    
    // 깊이 버퍼도 사용한다면, 위와 동일한 과정으로 생성후 프레임버퍼에 연결
    if (USE_DEPTH_BUFFER) {
        glGenRenderbuffersOES(1, &depthRenderbuffer);
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
        glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
    }
    
    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
        NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
        return NO;
    }
    
    return YES;
}

- (void)destroyFramebuffer {
    
    glDeleteFramebuffersOES(1, &viewFramebuffer);
    viewFramebuffer = 0;
    glDeleteRenderbuffersOES(1, &viewRenderbuffer);
    viewRenderbuffer = 0;
    
    if(depthRenderbuffer) {
        glDeleteRenderbuffersOES(1, &depthRenderbuffer);
        depthRenderbuffer = 0;
    }
}


6. 뷰포트와 투영변환을  설정한다 
- (void)setupViewLandscape
{		
	// Sets up matrices and transforms for OpenGL ES
	glViewport(0, 0, backingWidth, backingHeight);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glRotatef(-90.0f, 0.0f, 0.0f, 1.0f);
	// set up the viewport so that it is analagous to the screen pixels
	glOrthof(-backingHeight/2.0, backingHeight/2.0, -backingWidth/2.0, backingWidth/2.0, -1.0f, 1.0f);
	
	glMatrixMode(GL_MODELVIEW);
	
	// Clears the view with black
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}

7.  카메라를 위치를 설정한다. 
-(void)perspectiveFovY:(GLfloat)fovY 
                        aspect:(GLfloat)aspect 
			 zNear:(GLfloat)zNear
			   zFar:(GLfloat)zFar 
{
	const GLfloat pi = 3.1415926;
	//	Half of the size of the x and y clipping planes.
	// - halfWidth = left, halfWidth = right
	// - halfHeight = bottom, halfHeight = top
	GLfloat halfWidth, halfHeight;
	//	Calculate the distance from 0 of the y clipping plane. Basically trig to calculate
	//	position of clip plane at zNear.
	halfHeight = tan( (fovY / 2) / 180 * pi ) * zNear;	
	//	Calculate the distance from 0 of the x clipping plane based on the aspect ratio.
	halfWidth = halfHeight * aspect;
	//	Finally call glFrustum with our calculated values.
	glFrustumf( -halfWidth, halfWidth, -halfHeight, halfHeight, zNear, zFar );
}


8. 렌더링한다. 
-(void)beginDraw
{
	// Make sure that you are drawing to the current context
	[EAGLContext setCurrentContext:context];
	glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
	// make sure we are in model matrix mode and clear the frame
	glMatrixMode(GL_MODELVIEW);
	glClear(GL_COLOR_BUFFER_BIT);
	// set a clean transform
	glLoadIdentity();	
}

-(void)finishDraw
{
	glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
	[context presentRenderbuffer:GL_RENDERBUFFER_OES];	
}


실제로 5번 과정까지가 EAGLView를 사용하기 위한 준비단계이며 한번 설정이 되면 거의 바뀌지 않는 부분들이다. 
6번 이후 과정부터는  애플리케이션에 따라 사용자 입력에 대한 렌더링을  수행하는 작업들이다.