동명대학교 게임공학과 강영민 게임프로그래밍 1 강의노트 01
강의 소개 강의목표 강의내용 강사 교재 읽을 자료 OpenSource 라이브러리를 활용한 게임 제작 능력 습득 실습 및 과제 발표 강사 강영민 교수 (제2정보통신관 309호) 전화: 629-1253 전자우편: ymkang@tu.ac.kr 교재 강사제작 유인물 읽을 자료 Pro Ogre 3D Programming. G. Junker. Apress.
강의 내용 게임 제작 능력 습득 수업 도구 실습 위주의 게임 프로그래밍 3차원 그래픽스 기술 활용 게임 엔진 활용 능력 습득 스마트 폰 프로그래밍 능력 습득 수업 도구 MicroSoft Visual Studio Ogre 3D Xcode (Mac) iPhone Simulator
Ogre3D 관련 사이트 Ogre3D를 학습하기에 유용한 싸이트 http://www.ogre3d.org http://www.ogre3d.org/wiki Tutorials: http://www.ogre3d.org/wiki/index.php/Ogre_Tutorials
설치방법 (MS Windows 수업시) 수업시 사용할 컴파일러 SDK 다운로드 Visual C++ Express 다운로드 Microsoft Visual Studio C++ Express 버전도 무방 SDK 다운로드 OGRE SDK for Visual C++ 2005 HERE. (2003 HERE) Visual C++ Express 다운로드 다운로드 HERE. 설정 다음 웹 사이트를 통해 설정: 설정
설정 가장 간단한 개발 절차 Application wizard 설치 이후 OGRE 설정에 필요한 추가적인 정보 OGRE application wizard 다운로드 here. Application wizard 설치 이후 신규 프로젝트 생성 개발에 필요한 빈 껍질 생성 OGRE 설정에 필요한 추가적인 정보 다음 웹 사이트에서 확인 here.
Ogre3D for Mac OS 다음 절차를 따른다 Go to http://www.ogre3d Prebuilt sdk를 선택한다 OS X 버전 다운로드 OgreSDK 폴더를 임의의 위치로 옮김 Cmake 설치 www.cmake.org/files/v2.8/ CG toolkit 설치 http://developer.nvidia.com/object/cg_download.html OgreSDK/ogre.xcodeproj 로드/빌드 OgreSDK/bin/debug의 SampleBrowser.app 실행
코딩 시작하기 OGRE를 학습하는 가장 좋은 방법 껍데기 프로그램 튜토리얼에 담긴 내용 껍데기 프로그램과 튜토리얼 활용 튜토리얼 링크 tutorials. 껍데기 프로그램 위 링크의 첫 튜토리얼에 포함 튜토리얼에 담긴 내용 다음 슬라이드부터 설명
장면 관리 장면관리자 OGRE에서는 SceneManager 클래스가 특정한 장면 내에 존재하는 모든 객체를 다룸 장면 노드 장면 내의 모델이나 3차원 메쉬 등은 개체(entity)로 생성되며, 장면노드인 SceneNode에 달리게 됨 장면 노드는 움직일 수 있으며, 회전이나 크기 변경이 가능하다. 튜토리얼 1 장면 관리 및 장면 노드를 다루는 튜토리얼 OGRE tutorial 1
카메라, 광원, 그림자 그림자 관련 코드 카메라, 광원, 그림자 관련 튜토리얼 카메라 코드 조명 코드 Ogre3D에서는 유사한 스타일의 명령으로 다룸 관련 튜토리얼 Ogre tutorial 2. 카메라 코드 제85행 조명 코드 제609행 그림자 관련 코드 제614행
지형과 하늘 지형과 하늘에 관한 튜토리얼 하늘 지형관련 코드 Ogre의 지형 tutorial 3 높이맵(heightmap)으로 생성 지형 장면 관리자를 통해 관리 이외에 다른 특별한 장면관리자도 존재 하늘 다양한 텍스처 이용 스카이 박스 관련 코드 제610행 지형관련 코드 제591행
입력 기법 입력 처리의 프레임워크 관련 튜토리얼 tutorial 5 FrameListener 클래스 tutorial 4 다양한 원천으로부터 입력 받음 다소 복잡한 구조 관련 튜토리얼 tutorial 4 Unbuffered input tutorial 5 Buffered input
레이(Ray) 질의 레이 질의 관련 튜토리얼 레이 질의 설정 존재하는 물체를 찾는 기능 새로운 객체를 원하는 위치에 추가할 때에도 유용 종종 이해하기 어려움 관련 튜토리얼 Intermediate tutorial 2. 레이 질의 설정 제124행
물체 찍기(picking) 물체 찍기 관련 튜토리얼 레이 질의 설정 레이 질의의 결과를 활용 마우스 클릭 위치에 있는 객체를 찾아 선택할 때 유용 관련 튜토리얼 Intermediate tutorial 3. 레이 질의 설정 제290행
준비 Ogre3D 설치 AppWizard 설치 Download OGRE SDK for Visual C++ 2005 HERE. (2003 HERE) AppWizard 설치 Ogre3D 응용 프로그램 작성을 위한 간단한 방법 Download it here.
Ogre3D 기초 프로그래밍 환경 Application Wizard 설치 간단한 응용 프로그램 생성해 보기 Microsoft Visual Studio 2003 환경 가정 Application Wizard 설치 (MS VS 2003) Application Wizard 설치 다운로드 받은 파일 압축 해제 Setup.js 실행 MS VS 2003에서 새 프로젝트 생성시 Ogre App 표시됨 간단한 응용 프로그램 생성해 보기
코드의 구조 자동생성된 코드의 구조
코드의 구조 Main 함수 int main(int argc, char *argv[]) { // Create application object Application01App app; SET_TERM_HANDLER; try { app.go(); } catch( Ogre::Exception& e ) { MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL); } return 0;
간단한 샘플 만들기 기초지식 소개 C++에 대한 기초지식은 있다고 가정 Ogre에 대한 지식은 없다고 가정 이 예제에서 다룰 내용 SceneManager SceneNode Entity 객체 Ogre에 익숙해지기
간단한 샘플 만들기 시작하기 AppWizard가 생성된 코드 사용 Application 객체 상속하기 class MyApp : public Application01App { protected : public: MyApp() { } ~MyApp() { protected: void CreateScene(void) { };
자신의 App 객체 사용 int main(int argc, char *argv[]) { MyApp app; try { app.go(); } catch(Ogre::Exception& e) { Error… } return 0;
Ogre 작동 방식 SceneManager 기초 다수 종류의 SceneManager 존재 평면, 빌보드, 광원 모두.. 다수 종류의 SceneManager 존재 BSP 맵 렌더링을 위한 SceneManager 등
Entity와 SceneNodes 기초 Entity SceneNodes 장면 내에서 그릴 수 있는 객체 타입 중 하나 3차원 메쉬로 표현될 수 있는 것 로봇, 물고기… Light, Billboards, Particles, Cameras – Entity가 아님 SceneNodes Entity는 SceneNodes에 부착됨 SceneNode는 자신에게 부착된 모든 것을의 위치와 방향 추적 계층적 모델링 지원 SceneNode의 위치는 부모 SceneNode로부터 상대적 위치
첫 Ogre 프로그램 만들기 CreateScene 구현 Ambient 광원 변경 Entity 생성 mSceneMgr->setAmbientLight(ColourValue(1,1,1)); Entity 생성 Entity *ent1 = mSceneMgr->CreateEntity(“Robot”, “robot.mesh”); “Robot” Entity의 이름 “Robot.mesh” 엔티티 메쉬 모든 Entity는 고유의 이름을 가진다 SceneNode를 생성하여 Attach SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode(“RobotNode”); SceneNode 이름도 unique해야 한다 노드에 entity를 부착 node1->attachObject(ent1);
좌표와 벡터 좌표계 Ogre 벡터 객체 X, z : 수평면 Y: 수직축 X: 왼쪽에서 오른쪽으로 Y: 아래에서 위로 위치, 방향 등을 표현 2, 3, 4차원 벡터 존재 Vector3가 가장 많이 사용됨
다른 객체 추가 위치를 지정해서 추가하기 Entity *ent2 = mSceneMgr->createEntity( "Robot2", "robot.mesh" ); SceneNode *node2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode2", Vector3( 50, 0, 0 ) ); node2->attachObject( ent2 );
Entity 유용한 Method setVisible isVisible getName getParentSceneNode
SceneNode SceneNode 객체 매우 복잡한 객체 위치, 방향, 크기 등을 다룰 수 있음 Yaw, roll, pitch, resetOrientation, setOrientation getOrientation, rotate… attachObject, detachObject, numAttachedObjects, getattachedObject, detachAllObjects
SceneNode 연습 수정해 보기 RobotNode2가 RobotNode1의 자식 SceneNode *node2 = mSceneMgr->getRootSceneNode()-> createChildSceneNode( "RobotNode2", Vector3( 50, 0, 0 ) ); node1->createChildSceneNode( "RobotNode2", Vector3( 50, 0, 0 ) ); RobotNode2가 RobotNode1의 자식
SceneNode 이동 Node1을 이동하면 node2도 같이 이동 Node2는 node1의 자식이므로 node1->translate( Vector3( 25, 0, 0 ) );
Scale Entity *ent = mSceneMgr->createEntity( "Robot", "robot.mesh" ); SceneNode *node = mSceneMgr->getRootSceneNode() ->createChildSceneNode( "RobotNode" ); node->attachObject( ent ); node->scale( .5, 1, 2 ); ent = mSceneMgr->createEntity( "Robot2", "robot.mesh" ); node = mSceneMgr->getRootSceneNode()-> createChildSceneNode ("RobotNode2", Vector3( 50, 0, 0 ) ); node->attachObject( ent ); node->scale( 1, 2, 1 );
Rotation Entity *ent = mSceneMgr->createEntity( "Robot", "robot.mesh" ); SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode", Vector3( -100, 0, 0 ) ); node->attachObject( ent ); node->yaw( Degree( -90 ) ); ent = mSceneMgr->createEntity( "Robot2", "robot.mesh" ); node = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode2"); node->pitch( Degree( -90 ) ); ent = mSceneMgr->createEntity( "Robot3", "robot.mesh" ); node = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode3", Vector3( 100, 0, 0 ) ); node->attachObject( ent ); node->roll( Degree( -90 ) );