검색결과 리스트
2011/02에 해당되는 글 34건
- 2011.02.13 3차원의 기초
- 2011.02.13 3D 렌더링의 종류와 Java
- 2011.02.13 수학 교과과정 (초등학교~고등학교)
- 2011.02.13 OpenGL ES 사용설정
글
3차원의 기초
게임개발로그
2011. 2. 13. 21:05
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, 기하와 벡터, 미적분학과 통계 과목이 있었다.
| 수학 | 수학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
아이폰에서는 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번 이후 과정부터는 애플리케이션에 따라 사용자 입력에 대한 렌더링을 수행하는 작업들이다.
'아이폰' 카테고리의 다른 글
| Sprite Sheet 제작툴 Zwoptex (0) | 2011.03.16 |
|---|---|
| 애플리케이션 응답성 향상을 위해 동시성 사용하기 (0) | 2011.03.15 |
| OpenGL ES 게임 프레임웍 (0) | 2011.02.14 |
| OpenGL ES 사용 (0) | 2011.02.14 |
| OpenGL ES 사용설정 (0) | 2011.02.13 |
| [iPhone] 로깅 프레임웍 cocoalumberjack (0) | 2010.12.21 |