ogre3d for iPhone

OGRE3D 2009/12/08 23:21 Posted by <!--r'i"z&i\n+#]]x juree23
http://www.ogre3d.org/wiki/index.php/Ogre_iPhone
저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

ogre3d for iPhone  (0) 2009/12/08
OGRE에서 빌보딩 사용하기  (0) 2009/11/16
'와우' 같은 근거리 처리법  (0) 2009/11/16
OGREMAX 플러그인에서 메쉬 통합하기  (0) 2009/11/16
자작 FPS  (0) 2009/11/16
자작 슈팅게임  (0) 2009/11/16

OGRE에서 빌보딩 사용하기

OGRE3D 2009/11/16 15:20 Posted by <!--r'i"z&i\n+#]]x juree23

- Billboard 클래스와 BillboardSet 클래스를 이용

- 우선 BillboardSet 클래스의 인스턴스를 생성

- BillboardSet클래스의 createBillboard() 함수를 이용하여 Billboard 인스턴스 생성

- BillboardSet을 SceneNode에 갖다 붙인다.

 

코드로 보면

 

    // SceneNode생성. 필요한 SceneNode를 사용하면 된다. 여기서는 그냥 참고용.

    SceneNode* myNode = static_cast<SceneNode *>

        (mSceneMgr->getRootSceneNode()->createChild());
    BillboardSet* mySet = mSceneMgr->createBillboardSet("mySet");

    // 다음과같이 BillboardSet 의 재질을 정의할 수 있다.

    mySet->setMaterialName("Examples/FlyingLightMaterial");


    Billboard* myBillboard = mySet->createBillboard(Vector3(100, 0, 200));

    myBillboard->setColour(ColourValue::Red);

    myBillboard->setDimensions(1500.0f,1500.0f);


    myNode->attachObject(mySet);


저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

ogre3d for iPhone  (0) 2009/12/08
OGRE에서 빌보딩 사용하기  (0) 2009/11/16
'와우' 같은 근거리 처리법  (0) 2009/11/16
OGREMAX 플러그인에서 메쉬 통합하기  (0) 2009/11/16
자작 FPS  (0) 2009/11/16
자작 슈팅게임  (0) 2009/11/16

'와우' 같은 근거리 처리법

OGRE3D 2009/11/16 15:18 Posted by <!--r'i"z&i\n+#]]x juree23

기본개념은 페이지(타일)별로 기본 높이맵 데이타(RENDER_QUEUE_WORLD_GEOMETRY_1)와 저해상도 단일 메쉬(RENDER_QUEUE_WORLD_GEOMETRY_2) 두벌을 준비합니다. 먼저 고해상도 지형을 랜더링하고, 스텐실버퍼에 랜더링된 부분을 기록 해둡니다. 그리고, 나머지 부분에 저해상도 메쉬로 채워넣습니다. 이때 두 부분을 자연스럽게 연결하기위해 포그를 고해상도 지형의 끝부분에 주고, 저해상도 메쉬는 전부 포그색으로 덮어버립니다.

 

이때 카메라의 NearClip/FarClip 스텐실버퍼 설정을 한 랜더링 주기에서 조절을 해줘야되는, 오거에서는 랜더링큐 리슨어를 이용해야 됩니다. 샘플 코드와 간단한 설명 그림을 첨부하겠습니다. 참고하세요.

 

#define STENCIL_VALUE_FOR_TERRAIN 0x1
#define STENCIL_FULL_MASK               0xFFFFFFFF

 

#define NEAR_CLIPDIST    1.0f
#define FAR_CLIPDIST      733.0f
#define FOG_DIST             200.0f
#define FARFAR_CLIPDIST 2000.0f

 

class TerrainOpRenderQueueListener : public RenderQueueListener {
public:
 TerrainOpRenderQueueListener()
 {
 }

 virtual void renderQueueStarted(uint8 queueGroupId, const String& invocation, bool &skipThisInvocation)
 {
  if (queueGroupId == RENDER_QUEUE_WORLD_GEOMETRY_1) {
   RenderSystem *renderSystem = Root::getSingleton().getRenderSystem();

   renderSystem->clearFrameBuffer(Ogre::FBT_STENCIL);
   renderSystem->setStencilCheckEnabled(true);
   renderSystem->setStencilBufferParams(Ogre::CMPF_ALWAYS_PASS,
    STENCIL_VALUE_FOR_TERRAIN, STENCIL_FULL_MASK,
    SOP_KEEP,SOP_KEEP,SOP_REPLACE,false);

  } else if (queueGroupId == RENDER_QUEUE_WORLD_GEOMETRY_2) {
   RenderSystem *renderSystem = Root::getSingleton().getRenderSystem();
   Camera *camera = renderSystem->_getViewport()->getCamera();

   Real nearDist = camera->getNearClipDistance();
   Real farDist  = camera->getFarClipDistance();
   camera->setNearClipDistance(NEAR_CLIPDIST);
   camera->setFarClipDistance(FARFAR_CLIPDIST);
   renderSystem->_setProjectionMatrix(camera->getProjectionMatrixRS());
   renderSystem->_setViewMatrix(camera->getViewMatrix(true));
   camera->setNearClipDistance(nearDist); //이전값 복원
   camera->setFarClipDistance(farDist);

   renderSystem->setStencilCheckEnabled(true);
   renderSystem->setStencilBufferParams(Ogre::CMPF_NOT_EQUAL,
    STENCIL_VALUE_FOR_TERRAIN, STENCIL_FULL_MASK,
    SOP_KEEP,SOP_KEEP,SOP_REPLACE,false);
  
  }
 }

 virtual void renderQueueEnded(uint8 queueGroupId, const String& invocation, bool &repeatThisInvocation)
 {
  if (queueGroupId == RENDER_QUEUE_WORLD_GEOMETRY_2 - 1) {
  } else if (queueGroupId == RENDER_QUEUE_WORLD_GEOMETRY_2) {
   RenderSystem *renderSystem = Root::getSingleton().getRenderSystem();
   renderSystem->setStencilCheckEnabled(false);
   renderSystem->setStencilBufferParams();
  }
 }
};

void createScene()

{

//저해상도 지형은 Entity::setRenderQueueGroup(RENDER_QUEUE_WORLD_GEOMETRY_2); 으로 등록

 ...

 m_pAppCamera->setClipDistance(NEAR_CLIPDIST, FAR_CLIPDIST);

 

 ColourValue skyColour(0.557, 0.996, 1.000);
 ColourValue fogColour(0.373, 0.737, 0.906);  

 m_pSceneManager->setFog( FOG_LINEAR, fogColour, 1, FAR_CLIPDIST-FOG_DIST, FAR_CLIPDIST);
 m_pRenderWindow->getViewport(0)->setBackgroundColour(skyColour);


 m_pSceneManager->addRenderQueueListener(new TerrainOpRenderQueueListener());

 ...

}

저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

ogre3d for iPhone  (0) 2009/12/08
OGRE에서 빌보딩 사용하기  (0) 2009/11/16
'와우' 같은 근거리 처리법  (0) 2009/11/16
OGREMAX 플러그인에서 메쉬 통합하기  (0) 2009/11/16
자작 FPS  (0) 2009/11/16
자작 슈팅게임  (0) 2009/11/16

OGREMAX 플러그인에서 메쉬 통합하기

OGRE3D 2009/11/16 15:17 Posted by <!--r'i"z&i\n+#]]x juree23

안녕하세요.

ogremax를 사용하는 개발자 입니다~

 

개발도중에 문제가 생겨서 이렇게 질문을 올립니다.

 

질문은요~~

통매쉬로 되어 있는 max파일은 익스포팅하면 정상정으로 익스포팅이 되고 재생이 되는데요~

 

매쉬가3개로 되어 있는 max파일은 특정 한개의 매쉬만 익스포팅되어 재생이 되는것을 확인했습니다.

 

이 현상에 대해서 아시는 분 있나요?ㅠ_ㅠ

도통 모르겠습니다~~ㅠ_ㅠ

 

첫 이미지는 익스포팅할때 이상하게 되는 것( 매쉬가 여러개 있습니다. )

두번째 이미지는 익스포팅했을때 이상없이 잘 되는 것( 매쉬가 하나 있습니다. )입니다.

 

매쉬가 다수개로 있으면 안되는 것인가요??흠..잘 모르겠습니다.ㅠ_ㅠ

[출처] 캐릭터 본 애니메이션 익스포터 질문입니다.ㅠ_ㅠ (OGRE3D) |작성자 불꽃남자

 ====================================

아마도 Object Setting에 SubMesh/Entity 라는 옵션항목이 있을겁니다.
그걸 선택해주고 익스포팅해준 기억이 나네요. 

| 신고

맥스 상에서 오브젝트가 따로 있으면 전부 별개의 메쉬로 익스포트 되지 않나요?
하나로 익스포트하려면 하나의 오브젝트로 어터치해서 해야하고... 
| 신고

네글자만 네, 저도 그렇게 되서 옵션을 조정해봤는데 서브메시라는 항목으로 같이 익스포트가 되었습니다.ㅎ
어태치를 하면 하나의 오브젝트로 인식하게되서 사용하기에 좀 힘든경우가 있더군요. 

| 신고

불꽃남자 오..SubMesh라는걸 찾았습니다. 감사합니다
저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

OGRE에서 빌보딩 사용하기  (0) 2009/11/16
'와우' 같은 근거리 처리법  (0) 2009/11/16
OGREMAX 플러그인에서 메쉬 통합하기  (0) 2009/11/16
자작 FPS  (0) 2009/11/16
자작 슈팅게임  (0) 2009/11/16
길찾기 AI  (0) 2009/11/16

자작 FPS

OGRE3D 2009/11/16 15:13 Posted by <!--r'i"z&i\n+#]]x juree23
개발 환경 : Windows XP, Visual Studio 6.0, DirectX SDK 2005 December
개발 기간 : 2008. 11. 01 ~ 2008. 12. 01

처음으로 만들어 본 간단한 FPS(First Person Shooting) 게임입니다.

[ 사용된 리소스들 ]
지형 : Dark GDK Sample 예제의 map1.bmp, texture.jpg, detail.jpg
적 캐릭터 : Dark GDK Sample 예제의 Germen 캐릭터 모델

[ 적용된 알고리즘 ]
구-구 충돌 : RealTime Rendering 제2판 - 13.12.1. 구/구 교차
절두체 선별 : Game Programming Gems 5 - 1.6. 개선된 절두체 선별

[ 기타 ]
Detail mapping, Fog, 적 캐릭터의 AI, 간단한 총의 반동 효과 구현

[ 적 캐릭터의 AI 상태 ]
Idle, Move, Attack, Impact, Die

[ 적 캐릭터의 AI 구현 ]
적 캐릭터는 아래와 같이 간단한 상태변화에 따라서 구현되었습니다.
Idle -> Move : 적과 플레이어 사이의 거리가 10.0f 미만일때
Idle -> Impact : 멀리서 플레이어가 적을 맞췄을 때
Move -> Attack : 적과 플레이어 사이의 거리가 5.0f 미만일때
Move -> Impact : 플레이어가 이동하고 있는 적을 맞췄을 때
Move -> Idle : 적과 플레이어 사이의 거리가 10.0f 이상일때
Attack -> Impact : 플레이어가 공격하고 있는 적을 맞췄을 때
Attack -> Move : 적과 플레이어 사이의 거리가 5.0f 이상일 때
Impact -> Idle : 멀리서 플레이어가 적을 맞추다가 중지된 경우
Impact -> Die : 적이 총을 맞다가 체력이 다한 경우

[플레이 방법]
W, S, A, D : 플레이어 전, 후, 좌, 우 이동
Mouse 이동 : 플레이어의 방향 전환
Mouse 왼쪽 버튼 : 플레이어의 사격
Alt + Enter : 화면 모드 전환
F1 : 화면 출력 정보 On/Off


저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

'와우' 같은 근거리 처리법  (0) 2009/11/16
OGREMAX 플러그인에서 메쉬 통합하기  (0) 2009/11/16
자작 FPS  (0) 2009/11/16
자작 슈팅게임  (0) 2009/11/16
길찾기 AI  (0) 2009/11/16
눈 내리는 지형 Rendering  (0) 2009/11/16

자작 슈팅게임

OGRE3D 2009/11/16 15:11 Posted by <!--r'i"z&i\n+#]]x juree23
개발 환경 : WindowsXP, Visual Studio 2005, DirectX SDK 2008 August
개발 기간 : 2009. 01. 21 ~ 2009. 01. 27

윈도우 응용 프로그램 기반의 1인칭 슈팅 게임입니다.
플레이어와 적의 정보는 구조체로 관리되고, 이동과 같은 이벤트는 클래스로 구현하였습니다.
미사일의 종류에 따라서 다른 발사 패턴을 구현하였습니다.
디자인 패턴의 Smart Pointer를 사용하여 객체의 생성과 소멸을 관리하도록 하였습니다.

[ 적용된 알고리즘 ]
상자-상자 교차

[ 플레이 방법 ]
스페이스 바 : 단일 Cannon Ball 발사
V : 4중 Cannon Ball 발사
Z : Beam Cannon 발사
N : 반 시계 방향으로 Cannon Ball 발사
H : 시계 방향으로 Cannon Ball 발사
ESC : 게임 종료
저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

OGREMAX 플러그인에서 메쉬 통합하기  (0) 2009/11/16
자작 FPS  (0) 2009/11/16
자작 슈팅게임  (0) 2009/11/16
길찾기 AI  (0) 2009/11/16
눈 내리는 지형 Rendering  (0) 2009/11/16
ogre3d 자작 게임 소스  (0) 2009/11/16

길찾기 AI

OGRE3D 2009/11/16 15:10 Posted by <!--r'i"z&i\n+#]]x juree23
개발 환경 : Windows 98, Visual Studio 6
개발 기간 : 2005. 03. 21 ~ 2005. 03. 25

2005년도 인공지능 과제로 간단하게 구현한 자료 입니다.
개미는 먹이를 찾으면 페로몬을 흘리면서 개미 집과 먹이 사이를 왕복하게 됩니다. 먹이를 찾으러 나간 다른 개미는 다른 개미가 흘린 페로몬을 발견하고 이곳이 먹이를 찾는 경로인 것을 인식하고 그 길을 따라서 먹이를 발견합니다. 이러한 개념을 적용하여 Starcraft에서 등장하는 SCV가 임의 공간에서 미네랄을 찾아서 Command Center로 이동하도록 하는 AI 시뮬레이션을 구현한 것입니다.
Command Center에서 떠난 SCV들은 처음에 랜덤하게 이동 방향을 결정하여 이동합니다. 매 순간마다 랜덤하게 이동 방향을 결정하여 이동하고, 미네랄을 찾게 되면 Command Center로 복귀합니다. 이때, 이동 경로에 미네랄을 찾았다는 것을 알리는 특별한 표시를 해 놓게 됩니다. 다른 SCV들은 이 표시를 보고 미네랄이 있는 위치를 인식하게 됩니다.

[ 플레이 방법 ]
File -> Start : 미네랄 찾기 시작
File -> Pause : 일시 정지
File -> Speed : 이동 속도 조절


저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

자작 FPS  (0) 2009/11/16
자작 슈팅게임  (0) 2009/11/16
길찾기 AI  (0) 2009/11/16
눈 내리는 지형 Rendering  (0) 2009/11/16
ogre3d 자작 게임 소스  (0) 2009/11/16
Ogre3D Tutorial 소스코드 모음입니다.  (0) 2009/11/16

눈 내리는 지형 Rendering

OGRE3D 2009/11/16 15:09 Posted by <!--r'i"z&i\n+#]]x juree23
개발 환경 : WindowsXP, Visual Studio 2005, DirectX SDK 2008 August
개발 기간 : 2009. 04. 13 ~ 2009. 04. 17

Direct3D API를 사용하여 눈내리는 지형을 구현하였습니다. 높이맵을 사용하여 지형을 표현하고, Detail mapping을 하여 보다 사실감 있는 지형을 구현하였습니다. 마우스 왼쪽 버튼을 누르면 지형이 선택되는데, 여기에서 사용된 알고리즘은 RealTime Rendering 제2판의 반직선-삼각형 교차 방법 입니다. 눈은 Particle System을 사용하여 구현하였습니다.

[ 플레이 방법 ]
Mouse 왼쪽 버튼 : 지형 선택
Mouse 이동 : 카메라 이동 방향 회전
W, S, A, D : 카메라 이동
Num Pad : Teapot 이동 및 회전
Mouse Wheel : 카메라 Zoom in /Zoom out


저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

자작 슈팅게임  (0) 2009/11/16
길찾기 AI  (0) 2009/11/16
눈 내리는 지형 Rendering  (0) 2009/11/16
ogre3d 자작 게임 소스  (0) 2009/11/16
Ogre3D Tutorial 소스코드 모음입니다.  (0) 2009/11/16
OGRE3D Tutorial.03 카메라 뷰포트 설정  (0) 2009/11/16

ogre3d 자작 게임 소스

OGRE3D 2009/11/16 15:08 Posted by <!--r'i"z&i\n+#]]x juree23
개발 환경 : WindowsXP, Visual Studio 2005, DirectX SDK 2008 August, Ogre3D SDK 1.6.2
개발 기간 : 2009. 05. 11 ~ 2009. 07. 17
개발 인원 : 6인
맡은 분야 : 클라이언트 메인, 물리, 사운드

2D 슈팅 게임인 포트리스를 3D로 구현한 게임입니다. 게임은 포트리스의 턴 방식과는 달리 실시간으로 진행됩니다. Ogre3D의 add-on 중 Editable Terrain Manager를 사용하여 지형을 구현하였습니다.
공개 사운드 라이브러리인 FMod를 사용하여 3차원 입체 사운드를 출력하도록 구현하였습니다. 게임 플레이 중에서 캐릭터가 이동하는 소리, 미사일 발사하는 소리, 미사일이 지형이나 캐릭터에 충돌한 소리는 모두 3차원 사운드로 출력됩니다.
게임의 장면 관리는 State Pattern을 사용하여 구현하였습니다. 각 장면 사이에 공유되어야 하는 객체 정보와 사운드 정보는 Bridg Pattern을 사용하여 구현하였습니다.
미사일과 캐릭터의 충돌은 RealTime Rendering 제2판의 구-구 교차 알고리즘을 사용하여 구현하였습니다.
게임 상에서 표현되는 캐릭터, 미사일, 그리고 사운드 크기에 대한 정보는 Lua Script를 사용하여 관리되도록 구현하였습니다.

[ 플레이 방법 ]
스페이스 바 Down : 미사일 발사힘 증가
스페이스 바 Up : 미사일 발사
상, 하 : 고각(Altitude) 조절
W, S : 전, 후 이동
A, D : 좌, 우 회전


저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

길찾기 AI  (0) 2009/11/16
눈 내리는 지형 Rendering  (0) 2009/11/16
ogre3d 자작 게임 소스  (0) 2009/11/16
Ogre3D Tutorial 소스코드 모음입니다.  (0) 2009/11/16
OGRE3D Tutorial.03 카메라 뷰포트 설정  (0) 2009/11/16
OBB 를 이용한 충돌처리!!!!  (2) 2009/11/16

Ogre3D Tutorial 소스코드 모음입니다.

OGRE3D 2009/11/16 15:01 Posted by <!--r'i"z&i\n+#]]x juree23

http://rockenrollz.tistory.com


Ogre3D Tutorial Source-Code 최종형태 묶음 project file 입니다.

Visual Studio 2008로 작성되었습니다.
다른 버젼을 사용하시는 분은 디렉토리별 소스코드를 개별적으로 참조해 주세요.

A1~A7 까지는 Advenced Tutorial 편이며
B1~B8 까지는 Basic Tutorial 편 입니다.

몇 개 튜토리얼은 결과물을 보기좋게 볼 수 있도록 ViewPoint나 특정 수치값이 조금 바뀐경우도 있습니다.


그리고 Decal_filter.png와 Decal.png는 Advenced Tutorial 6를 위한 파일입니다.
$(OGRE_HOME)\media\materials\textures 폴더로 붙여넣어 주세요.
저작자 표시 비영리 변경 금지

OGRE3D Tutorial.03 카메라 뷰포트 설정

OGRE3D 2009/11/16 15:00 Posted by <!--r'i"z&i\n+#]]x juree23

Tutorial Basic Setup

  1. New Project -> SDK Application -> Minimal application
  2. "프로젝트 속성 -> 구성속성 C/C++ -> 일반 -> 추가 포함 디렉터리" 항목에 "$(OGRE_HOME)\samples\include" 을

  1. #include "ExampleApplication.h"  
  2.   
  3. class OgreTestApp : public ExampleApplication  
  4. {  
  5. public:  
  6.     OgreTestApp()  
  7.     {  
  8.     }  
  9.     ~OgreTestApp()  
  10.     {   
  11.     }  
  12. protected:  
  13.     void createCamera(void)  
  14.     {  
  15.         mCamera = mSceneMgr->createCamera("PlayerCam");  
  16.         mCamera->setPosition(Vector3(0,10,500));  
  17.         mCamera->lookAt(Vector3(0,0,0));  
  18.         mCamera->setNearClipDistance(5);  
  19.           
  20.   
  21.     }  
  22.       
  23.     void createViewports(void)  
  24.     {  
  25.         Viewport* vp = mWindow->addViewport(mCamera);  
  26.         vp->setBackgroundColour(ColourValue(0, 0, 0));  
  27.         mCamera->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));  
  28.   
  29.     }  
  30.   
  31.     void createScene(void)  
  32.     {  
  33.         mSceneMgr->setAmbientLight(ColourValue( 1, 1, 1 ) );  
  34.         Entity *ogreHead = mSceneMgr->createEntity("house""tudorhouse.mesh");  
  35.         SceneNode *ogreHeadNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("OgreNode");  
  36.         ogreHeadNode->attachObject(ogreHead);  
  37.     }  
  38. };  


Ogre Cameras

A Camera is what we use to view the scene that we have created. A Camera is a special object which works somewhat like a SceneNode does. The Camera object has setPositionyawroll, and pitch functions, and you can attach it to any SceneNode. Just like SceneNodes, a Camera's position is relative to its parents (it's nice to respect one's elders). For all movement and rotation, you can basically consider a Camera a SceneNode.
One thing about Ogre Cameras that is different from what you may expect is that you should only be using one Camera at a time (for now). That is, we do not create a Camera for viewing one portion of a scene, a second camera for viewing another portion of the scene and then enabling or disabling cameras based on what portion of the scene we want to display. Instead the way to accomplish this is to create SceneNodes which act as "camera holders". These SceneNodes simply sit in the scene and point at what the Camera might want to look at. When it is time to display a portion of the Scene, the Camera simply attaches itself to the appropriate SceneNode. We will revisit this technique in the FrameListener tutorial.

Creating a Camera

{PROJECT_NAME}App::createCamera 멤버 함수에 다음과 같은 코드를 추가한다.
  1. 카메라를 생성
    This creates a Camera with the name "PlayerCam". Note that you can use the getCamera function of SceneManager to get Cameras based on their name if you decide not to hold a pointer to it.
    • mCamera = mSceneMgr->createCamera("PlayerCam");
  2. 카메라의 위치 및 방향을 설정
    The lookAt function is pretty nifty. You can have the Camera face any position you want to instead of having to yaw, rotate, and pitch your way there. SceneNodes have this function as well, which can make setting Entities facing the right direction much easier in many cases.
    • mCamera->setPosition(Vector3(0,10,500));
      mCamera->lookAt(Vector3(0,0,0)); // lookAt = yaw + roll pitch
  3. 카메라의 클리핑 거리 설정
    The clipping distance of a Camera specifies how close or far something can be before you no longer see it.
    • mCamera->setNearClipDistance(5);

 

Ogre Viewports

three of Ogre's constructs: the Camera, the SceneManager, and the RenderWindow.
The SceneManager object creates Cameras to view the scene. You must tell the RenderWindow which Cameras to display on the screen, and what portion of the window to render it in. The area in which you tell the RenderWindow to display the Camera is your Viewport.
 

Creating the

{PROJECT_NAME}App::createViewports 멤버 함수에 다음과 같은 코드를 추가한다.
  1. 뷰포트를 생성
    1. Viewport* vp = mWindow->addViewport(mCamera);
  2. 뷰포트의 배경색을 설정
    1. vp->setBackgroundColour(ColourValue(0, 0, 0));
  3. 카메라의 종횡비를 설정
    1. mCamera->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
저작자 표시 비영리 변경 금지

OBB 를 이용한 충돌처리!!!!

OGRE3D 2009/11/16 14:58 Posted by <!--r'i"z&i\n+#]]x juree23
Ogre로 프로젝트를 하면서 가장 시간을 많이 들였던 충돌 처리 부분 입니다.
처음에는 물리 엔진을 써보고자 Physx , bullet, OgreODE 등 많은 물리엔진을 찾아서 사용 해보려 했지만...;;
결국 Ogre로 구현을 하게 되었습니다. ;;
게임 개발에 필요한 수학적 지식이 부족한 상황에서 검색을 하던중 directx 로 구현한 OBB 충돌 소스를 찾게 되어서
그 소스를 이용하여 Ogre에서 구현을 해봤습니다. 

dx 소스는 GpgStudy 에서 참고 하였습니다. 
Link에 추가 해놓으테니까 참고 하시면 좋을 것 같습니다~~
그리고 이만희님의 OBB 충돌 논문(Fast Overlap Test for OBB)
을 보시면 그래도 이해더 좀더 되 실 겁니다.
첨부 파일로 올려 놓겠습니다.(올려도 되려나??)


 
-소스 코드-

BOOL PlayState::centerOBB(OBBoxRenderable* OBB1, OBBoxRenderable* OBB2)
{

 //box1이 이동하는 OBB / box2는 고정되어 있는 OBB

 Vector3 obb1_center, obb2_center, T, LL; //box1,box2 의 각각 센터 좌표,
 Real box_len, a1, a2, a3, b1, b2, b3, TL;
 Matrix4 obb1_invers_mat, obb2_rotae_mat;
 Matrix4 R ;

 //OBB 박스의 월드 좌표??
 obb1_invers_mat = OBB1->getCharMat.inverse();
 obb2_rotae_mat = OBB2->getMonMat();

 //box1 의 좌표계를 box2의 좌표계로 회전변환 행렬 R = RA-1 * RB(-1은 iverse)
 R = obb1_invers_mat * obb2_rotae_mat;

 //box의 좌표축의 normal vector x, y, z 값 (제가 이해한 내용 - 틀린 내용 일 수도 있음 ㅋ)

 Vector3 obb1_size = OBB1->getWorldBoundingBox().getSize();
 Vector3 obb2_size = OBB2->getWorldBoundingBox().getSize();

 a1 = obb1_size.x;
 a2 = obb1_size.y ;
 a3 = obb1_size.z ;

 b1 = obb2_size.x ;
 b2 = obb2_size.y ;
 b3 = obb2_size.z ;

 obb1_center = OBB1->getWorldBoundingBox().getCenter();
 obb2_center = OBB2->getWorldBoundingBox().getCenter();


 //box1 의좌표계에서 box1 중심에서 box2의 중심으로의 이동을 나타내는 vector3
 T = Vector3(obb1_center.x - obb2_center.x, obb1_center.y - obb2_center.y, obb1_center.z - obb2_center.z);

 //0. LL = A1
 box_len = a1 + b1 * R[0][0] + b2*R[0][1] + b3*R[0][2];
 LL =Vector3(1.0f, 0.0f, 0.0f); //분할 축의 벡터 
 TL = T.absDotProduct(LL); //T 와 L의 내적의 절대값
 box_len = Math::Abs(box_len);
 if(TL  > box_len)
 {
  /*cout << "충돌되지 않음" << endl;*/
  return 0;
 }
 
 //1. LL = A2
 box_len = a2 + b1 * R[1][0] + b2*R[1][1] + b3*R[1][2];
 LL = Vector3(0.0f, 1.0f, 0.0f);
 TL = T.absDotProduct(LL);
 box_len = Math::Abs(box_len);
 if(TL  > box_len)
 {
  /*cout << "충돌되지 않음" << endl;*/
  return 0;
 }

 //2. LL = A3
 box_len = a3 + b1 * R[2][0] + b2*R[2][1] + b3*R[2][2];
 LL = Vector3(0.0f, 0.0f, 1.0f); 
 TL = T.absDotProduct(LL);
 box_len = Math::Abs(box_len);
 if(TL  > box_len)
 {
  /*cout << "충돌되지 않음" << endl;*/
  return 0;
 }

 //3. LL = RB1[R11 R21 R31]
 box_len = a1*R[0][0] + a2 * R[1][0] + a3*R[2][0] + b1;
 LL = Vector3(R[0][0], R[1][0], R[2][0]);
 TL = T.absDotProduct(LL);
 box_len = Math::Abs(box_len);
 if(TL  > box_len)
 {
  /*cout << "충돌되지 않음" << endl;*/
  return 0;
 }

 //4. LL = RB2[R12 R22 R32]
 box_len = a1*R[0][1] + a2 * R[1][1] + a3*R[2][1] + b2;
 LL = Vector3(R[0][1], R[1][1], R[2][1]);
 TL = T.absDotProduct(LL);
 box_len = Math::Abs(box_len);
 if(TL  > box_len)
 {
  /*cout << "충돌되지 않음" << endl;*/
  return 0;
 }

 //5. LL = RB3[R13 R23 R33]
 box_len = a1*R[0][2] + a2 * R[1][2] + a3*R[2][2] + b3;
 LL = Vector3(R[0][2], R[1][2], R[2][2]);
 TL = T.absDotProduct(LL);
 box_len = Math::Abs(box_len);
 if(TL  > box_len)
 {
  /*cout << "충돌되지 않음" << endl;*/
  return 0;
 }

 //6. LL = A1 X RB1 = [1 0 0] X [R13 R23 R33] = [ 0 -R31 R21 ]
 box_len = a2*R[2][0] + a3*R[1][0] + b2*R[0][2] + b3*R[0][1];
 LL = Vector3(0.0f,  R[2][0], R[1][0]);
 TL = T.absDotProduct(LL);
 box_len = Math::Abs(box_len);
 if(TL  > box_len)
 {
  /*cout << "충돌되지 않음" << endl;*/
  return 0;
 }

 //7. LL = A1 X RB2 = [1 0 0] X [R12 R22 R32] = [ 0 -R32 R22 ]
 box_len = a2*R[2][1] + a3*R[1][1] + b1*R[0][2] + b3*R[0][0];
 LL = Vector3(0.0f,  -R[2][1], R[1][1]);
 TL = T.absDotProduct(LL);
 box_len = Math::Abs(box_len);
 if(TL  > box_len)
 {
  /*cout << "충돌되지 않음" << endl;*/
  return 0;
 }

 //8. LL = A1 X RB3 = [1 0 0] X [R13 R23 R33] = [ 0 -R33 R23 ]
 box_len = a2*R[2][2] + a3*R[1][2] + b1*R[0][1] + b2*R[0][0];
 LL = Vector3(0.0f,  -R[2][2], R[1][2]);
 TL = T.absDotProduct(LL);
 box_len = Math::Abs(box_len);
 if(TL  > box_len)
 {
  /*cout << "충돌되지 않음" << endl;*/
  return 0;
 }

 //9. LL = A2 X RB1 = [0 1 0] X [R11 R21 R31] = [R31 0 -R11]
 box_len = a1*R[2][0] + a3*R[0][0] + b2*R[1][2] + b3*R[1][1];
 LL = Vector3(R[2][0], 0.0f, R[0][0]);
 TL = LL.absDotProduct(T);
 box_len = Math::Abs(box_len);
 if(TL  > box_len)
 {
  /*cout << "충돌되지 않음" << endl;*/
  return 0;
 }

 //10. LL = A2 X RB2 = [0 1 0] X [R12 R22 R32] = [R32 0 -R12]
 box_len = a1*R[2][1] + a3*R[0][1] + b1*R[1][2] + b3*R[1][0];
 LL = Vector3(R[2][1], 0.0f, -R[0][1]);
 TL = T.absDotProduct(LL);
 box_len = Math::Abs(box_len);
 if(TL  > box_len)
 {
  /*cout << "충돌되지 않음" << endl;*/
  return 0;
 }

 //11. LL = A2 X RB3 = [0 1 0] X [R13 R23 R33] = [R33 0 -R13]
 box_len = a1*R[2][2] + a3*R[0][2] + b1*R[1][1] + b2*R[1][0];
 LL = Vector3(R[2][2], 0.0f, -R[0][2]);
 TL = T.absDotProduct(LL);
 box_len = Math::Abs(box_len);
 if(TL  > box_len)
 {
 /* cout << "충돌되지 않음" << endl;*/
  return 0;
 }

 //12. LL = A3 X RB1 = [0 0 1] X [R11 R21 R31] = [-R21 R11 0]
 box_len = a1*R[1][0] + a2*R[0][0] + b2*R[2][2] + b3*R[2][1];
 LL = Vector3(-R[1][0], R[0][0], 0.0f);
 TL = T.absDotProduct(LL);
 box_len = Math::Abs(box_len);
 if(TL  > box_len)
 {
  /*cout << "충돌되지 않음" << endl;*/
  return 0;
 }

 //13. LL = A3 X RB2 = [0 0 1] X [R12 R22 R32] = [-R22 R12 0]
 box_len = a1*R[1][1] + a2*R[0][1] + b1*R[2][2] + b3*R[2][0];
 LL = Vector3(-R[1][1], R[0][1], 0.0f);
 TL = T.absDotProduct(LL);
 box_len = Math::Abs(box_len);
 if(TL  > box_len)
 {
  /*cout << "충돌되지 않음" << endl;*/
  return 0;
 }

 //14. LL = A3 X RB3 = [0 0 1] X [R13 R23 R33] = [-R23 R13 0]
 box_len = a1*R[1][2] + a2*R[0][2] + b1*R[2][1] + b2*R[2][0];
 LL = Vector3(-R[1][2], R[0][2], 0.0f);
 TL = T.absDotProduct(LL);
 box_len = Math::Abs(box_len);
 if(TL  > box_len)
 {
 /* cout << "충돌되지 않음" << endl;*/
  return 0;
 }

 //cout << "충돌!!" << endl;
 return 1;
}

구현을 해서 실행을 시켜본 결과 충돌 검출은 잘 하는데 살짝 떨어져 있어도 충돌 체크를 하는 경우가 있는데,
이유는 저도 잘...ㅠㅠ 그래도 이렇게해서 충돌 체크를 한다는거에 감사할 따름입니다. ㅋㅋ
혹시 소스 자체에 수정 할 부분이 있다고 생각되시는 분은 가르침 부탁 드리겠습니다^^ㅋ

인증샷!!!!



 Ps. box의 Matrix를 받아 오는 함수를 사용해서 Matrix값을 받아오게 했었는데, 값이 이상 했나 보네여 ;; 충돌 처리가  정확히 되지 않았습니다. 그래서 객체의 Entity 의_getBoneMatrices.transpose()를 사용해서 Matrix값을 받아 와서 충돌처리를 했더니 정확하게 OBB의 충돌 위치에서 멈추는 것을 확인 할 수 있었습니다. 

아직 정확한 Ogre의 분석이 되지 않은 상태에서 이것 저것 해보다가 얻어 걸린 것이라서 정확하게 어떻다라는 것을 제가 말씀 드릴 수는 없을 것 같습니다. 이해해 주시길..^^;; ㅋㅋ

(소스에서 이상한점을 발견 하시거나 잘못 된 곳을 발견하시면 저에게도 살포시 알려주세요~ㅋㅋㅋ)

저작자 표시 비영리 변경 금지

BillBoard를 이용한 EffectManager 구현!!

OGRE3D 2009/11/16 14:56 Posted by <!--r'i"z&i\n+#]]x juree23

음.. 프로젝트에서 사용되는 이펙트 처리를 어떻게 할까 생각하다가 3D 그래픽 툴을 사용할 줄 몰라서 결국
BillBoard를 사용하기로 했습니다. ㅠㅠ

//Effect.h

class Effect
{
private:
 SceneManager* eSceneMgr; //빌보드를 생성할 SceneManager
 SceneNode* myBillBoard;  //빌보드 Scene 생성
 Billboard* myBill;   //빌보드 생성
 BillboardSet* myBillSet; //빌보드 Set
 Real mLast;
 bool eAlive;
 OBBoxRenderable *billOBB;
 
public:
 void initEffect(SceneManager* mSceneMgr);
 void makeEffect(int eType, String eName, String materName, Vector3 oPosition);
 void updateEffect(const FrameEvent& evt);
 bool getAlive();
};

//Effect.cpp

using namespace std;

void Effect::initEffect(SceneManager* mSceneMgr)
{
 eSceneMgr = mSceneMgr;
 mLast = 0;
}

void Effect::makeEffect(int eType, String eName, String materName , Vector3 oPosition)
{
 static int i = 0;
 
 myBillBoard = eSceneMgr->getRootSceneNode()->createChildSceneNode();
 myBillSet = eSceneMgr->createBillboardSet("My" + StringConverter::toString(i++));

 myBillSet->setMaterialName(materName);
 myBill = myBillSet->createBillboard(oPosition);
 myBill->setDimensions(100.0f, 100.0f);
 std::vector<FloatRect> coords;
 int row = 60;
 int col = 1;
 float rf = 1.0f / row;
 float cf = 1.0f / col;

 for(int j = 0; j < 60; j++)
 {
  coords.push_back(FloatRect(rf*j,cf*0, rf*(j+1), cf*1));
 }

 myBillSet->setTextureCoords(&coords[0], coords.size());
 //FloatRect r(0,0,.25,.25);
 //b->setTexcoordRect(r);
 myBillBoard->attachObject(myBillSet);
 billOBB = new OBBoxRenderable();
 billOBB->setupVertices(myBillSet->getBoundingBox());
 myBillBoard->attachObject(billOBB);

 mLast = 0.05;
 eAlive = true;
}

void Effect::updateEffect(const FrameEvent& evt)
{
 if(eAlive)
 {
  if(mLast < 0)
  {
   mLast = 0.05f;
   Ogre::uint16 it = myBill->getTexcoordIndex();
   myBill->setTexcoordIndex(++it%60);
   cout << it << endl;
  }
  else
  {
   mLast -= evt.timeSinceLastFrame;
  }
  //eAlive = false;
 }
 else
 {
  mLast = 0;
  myBillBoard->detachAllObjects();
  myBillSet->removeBillboard(myBill);
  eSceneMgr->destroyAllBillboardSets();
  eSceneMgr->destroySceneNode(myBillBoard);
  myBillBoard = NULL;
  myBill = NULL;
  myBillSet = NULL;
 }
}

bool Effect::getAlive()
{
 return eAlive;
}

우선 이건 Effect 클래스 이구여 이제 Effect 클래스를 list로 사용하기 위해서 EffecMgr 이라는 매니저 클래스를 만들었습니다.

앞서 말씀드린 것과 같이 Effect 클래스를 list로 사용하기 위해서 EffectMgr 이라는 매니저 클래스를 따로 만들었습니다. 

Effect가 불려질때 여러개가 불려지고 사라지고 할 수 있기때문에 싱글톤으로 구현을 해보았습니다.

//EffectMgr.h

class EffectMgr
{
private:
 static EffectMgr* mEffectMgr;
 std::list<Effect *> elist;
 EffectMgr(){};

public:
 ~EffectMgr(){};
 void makeEffectMgr(SceneManager* eSceneMgr, String eName, String materName, int eType, Vector3 oPosition);
 void updateMgr(const FrameEvent& evt);
 static EffectMgr* getinstance();
};

//EffectMgr.cpp

EffectMgr* EffectMgr::mEffectMgr;

void EffectMgr::makeEffectMgr(Ogre::SceneManager *eSceneMgr, Ogre::String eName, String materName, int eType, Ogre::Vector3 oPosition)
{
 static int i = 0;

 Effect* E = new Effect();
 E->initEffect(eSceneMgr);
 E->makeEffect(eType, eName + StringConverter::toString(i++), materName , oPosition);
 elist.push_back(E);
}

void EffectMgr::updateMgr(const FrameEvent& evt)
{
 if(!elist.empty())
 {
  Effect* E;
  std::list<Effect *>::iterator i = elist.begin();
  while(i != elist.end())
  {
   E = *i;
   if(E->getAlive())
   {
    E->updateEffect(evt);
    i++;
   }
   else
   { 
    i = elist.erase(i);
   }
  }
 }
 
}

EffectMgr* EffectMgr::getinstance()
{
 if(!mEffectMgr)
 {
  mEffectMgr = new EffectMgr();
 }
 return mEffectMgr;
}

싱클톤은 친구의 도움으로 구현 했습니다.;;;(아.. 공부좀를 더 해야지 이거 원...ㅠㅠ )

이상 허접한 저의 소스를 보셨습니다.^^ㅋ

저작자 표시 비영리 변경 금지

Ogre 마우스 Picking && Robot 이동

OGRE3D 2009/11/16 14:56 Posted by <!--r'i"z&i\n+#]]x juree23

기본 코드는 용수님의 블로그에 번역되어 있는 Ogre 중금 튜토리얼 1, 2 의 코드를 섞에서
마우스 Picking 을 이용하여 캐리터 이동을 한번 구현 해봤습니다.
튜토리얼 소스를 보고 하면 누구나 따라하실 수 있는 코드입니다. ㅋㅋㅋ

약간 다른 코드가 있는데 이것은 네이버 OGRE3D 카페에서 참고하였습니다.

//------------------------------------------------------------------------------

Ray Noderay(mNode->getPosition(), mNode->getOrientation()*Vector3(0,-100.0f, 0));
    mRaySceneQuery->setRay(Noderay);

    RaySceneQueryResult &result = mRaySceneQuery->execute();
    RaySceneQueryResult::iterator itr = result.begin();

    for(itr = result.begin(); itr != result.end(); ++itr)
    {
     if(itr->worldFragment)
     {
      Real terrainHeight = itr->worldFragment->singleIntersection.y;
      mNode->setPosition(mNode->getPosition().x, terrainHeight ,mNode->getPosition().z);
     }
    }

//---------------------------------------------------------------------------------

위의 소스 부분입니다.

튜토리얼에 나와있는 Ray를 사용하는 방법만으로 Robot 이동을 구현하고나니까 이동은 하는데
Picking된 지형보다 낮은 지형을 지나갈때는 로봇이 공중에 떠서 가는 문제가 발생하여서 
위 코드를 추가했습니다.
저작자 표시 비영리 변경 금지

ogre3d 투터리얼

OGRE3D 2009/11/16 13:22 Posted by <!--r'i"z&i\n+#]]x juree23
http://starlike.cafe24.com/moniwiki/wiki.php/Ogre3DMain
저작자 표시 비영리 변경 금지

먼저 기본이 되는 Mesh 와 Skeleton, Material 을 익스포트하고


난 뒤 나머지 메쉬들은 메쉬와 재질만 익스포트 한다.


그뒤에 오우거에서는


 Entity *ent = mSceneMgr->createEntity( "Body", "body.mesh" );


SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode( "BodyNode" );


node->attachObject( ent );


node->scale( 2, 2, 2 );


Entity *ent2 = mSceneMgr->createEntity("Head", "head.mesh");


ent->attachObjectToBone( "Bip01_Neck", ent2, Quaternion::ZERO );


요렇게 하면 된다


더 좋은 방법이 있을 줄 알지만 서도..-_-;;


머리가 않따가주네..ㅋㅋ


저작자 표시 비영리 변경 금지

컴파일 방법

OGRE3D 2009/11/16 11:40 Posted by <!--r'i"z&i\n+#]]x juree23
http://www.neojijon.pe.kr



http://www.opengameengine.org/wiki/index.php?title=Building_dependencies_windows

Those libraries & versions are required:

  • Poco - svn revision 533 or later.
  • Intel TBB
  • Fast Delegates - v. 1.5
  • OIS (Object Oriented Input System) - v. 1.2


Soon

  • OGRE (Object-Oriented Graphics Rendering Engine) - v. 1.6.x
  • (RakNet - v. 3.2 (will perhaps be replaced by Poco::Net)
  • OpenAl - v. 1.1 (svn version June 07)
  • SqPlus - An easy to use binding system for Squirrel - v. 23 (not v.25 because this version doesn't compile with gcc for now).
  • Ogg - 1.1.3
  • Vorbis - 1.2.0


Fast delegates library

See the article Member Function Pointer and the Fastest Possible C++ Delegates from CodeProject to get the code.

  • Copy both .h files (FastDelegates.h and FastDelegatesBind.h) in ogeroot/oge/include/fastdelegates


OGRE - Object-Oriented Graphics Rendering Engine

See Ogre and Ogre wiki for infomations about Ogre. Ogre must be build with thread support (and ogre memory manager disabled) hence you must build it from source: see Building_From_Source for instructions.

  • Copy all in OgreSDK/include in ogeroot/oge/include/ogre.
  • Copy OgreMain.lib from OgreSDK/lib in ogeroot/oge/lib/release.
  • Copy OgreMain_d.lib from OgreSDK/lib in ogeroot/oge/lib/debug.
  • Copy all *.dll and *.cfg from OgreSDK/bin/debug in ogeroot/samples/lib/debug.
  • Copy all *.dll and *.cfg from OgreSDK/bin/release in ogeroot/samples/lib/release.
  • Copy the directory OgreSDK/media in ogeroot/samples/.
  • Copy the files OgreSDK/samples/include/OgreCEGUIRenderer.h and OgreCEGUIResourceProvider.h into ogeroot/oge/include/OGRE.

Important: The Ogre memory manager must be disabled to run the debug version of Oge. The easiest is to comment out the line 353 to 373 of file include/ogre/ogrememorymanager.h and replace the line 381 by "#include "OgreNoMemoryMacros.h". (Btw you don't need to rebuild ogre with the memory manager disabled.). Be sure that in OgreConfig.h the following define is set to 0:

/** Set this to 0 if you want to use the standard memory manager in Debug  builds
Release builds always use the standard memory manager
*/
#define OGRE_DEBUG_MEMORY_MANAGER 0


Important: Ogre3D must be compiled with thread support. This means you need to set 1 in OgreConfig.h to have:

#ifndef OGRE_THREAD_SUPPORT
#define OGRE_THREAD_SUPPORT 1
#endif

Note: The two files OgreCEGUIRenderer.h and OgreCEGUIResourceProvider.h will perhaps be rewritten to simplify the include path search and make the copying of those two files obsolete.

CEGUI - Crazy Eddie's Gui System

See CEGUIs website

OGE currently uses the version that comes with OGRE 1.4.x dependencies.

  • copy all from ogrenew/Dependencies/include/CEGUI to ogeroot/oge/include/cegui/
  • (copy all *.h ogrenew/Samples/Common/CEGUIRenderer/include to ogeroot/include/ogre !)
  • copy CEGUIBase.dll, CEGUIFalagardWRBase.dll, CEGUITinyXMLParser.dll from ogrenew/Dependencies/lib/Debug to ogeroot/oge/lib/debug
  • copy CEGUIBase.dll from ogrenew/Dependencies/lib/Release to ogeroot/oge/lib/release


OIS - Object Oriented Input System

See Object Oriented Input System.

  • Compile the ois library in dynamic debug and release. For those interested compile also the static version.
  • Copy the *.a files in ogeroot/oge/lib (with each debug/release version in its appropriate folder).
  • Copy all *.hpp files and subdirectories) from oisroot/includes in ogeroot/oge/include/ois.
  • Copy the *.dll in ogeroot/oge/bin and ogeroot/samples/bin.


RakNet - UDP game network library
  • Download a copy from Rakarsoft
  • Copy RakNetDll.lib from RakNet/Lib/ in ogeroot/oge/lib/release
  • Copy RakNetDebugDll.lib from RakNet/Lib/ in ogeroot/oge/lib/debug
  • Copy RakNet.dll from RakNet/Lib/ in ogeroot/samples/lib/release
  • Copy RakNetDebug.dll from RakNet/Lib/ in ogeroot/samples/lib/debug


OPAL - Open Physics Abstraction Layer

See OPALs website

OPAL and ODE must be built with the same floating point precision. My current version uses double precision as its defaulted to that.

  • copy all files in OPAL/include to ogeroot/oge/include/opal
  • copy OPAL/lib/opal-ode.lib to ogeroot/oge/lib/release/
  • copy OPAL/lib/opal-ode_d.lib to ogeroot/oge/lib/debug/
  • copy OPAL/bin/opal-ode.dll to ogeroot/samples/bin/release/
  • copy OPAL/bin/opal-ode_d.dll to ogeroot/samples/bin/debug/


OpenAl - Open Audio Library

Note: There are two versions of OpenAl: One is totally open-source (this is the one you get when you download the source), the other (the windows Openal SDK) is promoted by Creative and contain features that are NOT open-source and availble only one Windows. For now we decided to develop only with the first one and because of this we didn't try to use (and link against) the second version.

  • Download a copy of the OpenAl source from www.openal.org or http://developer.creative.com/welcome.asp
  • Compile the project OpenAl/OpenAL-Windows/ to get the OpenAl32 libs and .dlls
  • Compile the project OpenAL/alut/VisualStudioDotNET to get alut libs and .dlls
  • Copy the .libs in ogeroot/oge/lib/release and debug
  • Copy the .dlls in ogeroot/samples/lib/release and debug


Squirrel - A programming language suitable for a script language

In fact we are using SqPlus which is an easy to use binding system for Squirrel. It contains the squirrel code.

http://squirrel-lang.org/default.aspx
http://wiki.squirrel-lang.org/default.aspx/SquirrelWiki/SqPlus.html

  • Download SqPlus from the link above.
  • Compile all projects.
  • Copy *.h in SQUIRREL2_1_1_sqplus_23/include in ogeroot/oge/include/squirrel/include
  • Copy *.h in SQUIRREL2_1_1_sqplus_23/sqplus in ogeroot/oge/include/squirrel/sqplus
  • Copy *.lib from SQUIRREL2_1_1_sqplus_23/lib in ogeroot/oge/lib. Those with ***D.lib are for the debug folder.


Ticpp - C++ wrapper for TinyXML

TiCpp is also a static library hence no dll.

  • Copy all .h files from ticpp/ to ogeroot/oge/include/ticpp/
  • Copy ticppd.a from ticpp/Debug_ticpp to ogeroot/oge/lib/debug
  • Copy ticpp.a from ticpp/Release_ticpp to ogeroot/oge/lib/release


Zzip

We will use the zip libraries coming with OGRE.

  • Copy include/zzip to oge/include/zzip
  • Copy libzlib_d.a to oge/lib/debug
  • Copy libzlib.a to oge/lib/release
  • Copy the directory ogreroot/Dependencies/include/zzip into ogeroot/include/zzip
  • Copy the static lib libzlib(_d).a and lilzziplib(_d).a into ogeroot/lib/release/ and /debug/ respectively.


Ogg and vorbis

Those two libraries will enable us to support .ogg audio file. This format is especially useful for large audio file (such as background music and dialogs)

http://xiph.org/downloads/

The ogg-vorbis tool is composed of:

  • 'ogg.dll' (the format and decoder),
  • 'vorbis.dll' (the coding scheme),
  • 'vorbisenc.dll' (tools for encoding), and
  • 'vorbisfile.dll' (tools for streaming and seeking)

We will not need vorbisenc in oge now but I will provide it anyway in the sdk. Perhaps we can use it in OGEd to convert file to the ogg format :)

-- OGG --

  • Download libogg and libvorbis
  • Import the vc project and compile in debug and release mode
  • Copy the .a into lib/release and debug into oge/lib/release and debug
  • Copy all .h from libogg-1.1.3/include/ogg into oge/include/ogg
  • Copy the .dll from lib/release and debug into samples/bin/release and debug

-- vorbis --

Note: You really only need the vorbis_dynamic libs but I will give some explanations that apply to all vorbis project.

  • Copy the ogg .h and .a into the vorbis project
  • Import the vc project (codeblocks makes the converions without problem)
  • In the projects vorbis_dynamic, vorbissenc_dynamic, vorbissenc_static, vorbisfile_dynamic:
    • add to the libraries search paths the directory "../lib" (see note above)
    • link to the ogg .a files you compiled above (I created a bin folder and linked there).
  • To the project vorbisenc_dynamic in debug mode you will need to add the path "./Vorbis_Dynamic_Debug" to the compiler search path.
  • Compile the workspace in debug and release mode
  • Copy all .h from directory libvorbis-1.2.0/include/vorbis into the directory ogeroot/include/vorbis
  • Copy the .a into oge/lib/release and debug
  • Copy the .dll into samples/bin/release and debug


저작자 표시 비영리 변경 금지

CEGUI 한글설정

OGRE3D 2009/11/16 11:34 Posted by <!--r'i"z&i\n+#]]x juree23
사용자 삽입 이미지
GPG Study에서 퍼온글입니다.
CEGUI에서 한글 구현하려고 고생하고있는데. 글 올려주셔서 감사합니다.


전에 CEGUI에 대해 정리해둔게 있어서 옮깁니다.
먼저 CEGUI는 www.cegui.org.uk 에서 받을 수 있습니다.
이곳에서
cegui_mk2-0.4.0(<-최신버전 드래그 앤 드롭구현)
cegui_mk-0.4.0-deps-common(안에 dependencies 와 Samples를 같은 디렉토리 안데 넣습니다.)
cegui_mk-0.4.0-deps-vc71-xerces(역시 안에 dependencies 와 Samples를 같은 디렉토리 안데 넣습니다.)
이 세 파일을 받으신후에 (root:cegui_mk2makefileswin32VC++7.1) 안에 있는 프로젝트 파일을 열어 빌드를 합니다.
빌 드한후에 (root:cegui_mk2lib)안에 여러가지 lib화일이 만들어져 있을겁니다. 이들중 CEGUIBase.lib가 가장 중요한 lib입니다. 이 파일을 라이브러리 경로에 포함하시고 실행파일 안에 있는 CEGUIBase.dll, devil.dll, ilu.dll등등의 파일을 자신의 어플리케이션으로 옴기면 준비는 다 된것입니다.(이후 자신의 어플리케이션을 빌드할때 CEGUI헤더파일과 lib포함)

다음 자신의 그래픽엔진에 맞는 XXXCEGUIRederer와 XXXTexture를 만들면 됩니다. 이는 안에 순수 가상클래스로 만들어진 renderer와 Texture를 상속받고 인터페이스 대로 구현만 하면 됩니다. 이렇게 하면 XXXCEGUIRenderer.lib, XXXCEGUIRenderer.dll 이 만들어 지고 자신의 어플리케이션에CEGUIBase.lib, XXXCEGUIRenderer.lib를 포함하면 됩니다.

이후 한글을 사용하기 위해서는 font파일을 만들어야 합니다. 이파일을 열어서


< ?xml version="1.0" ? >
< Font Name="Tahoma-12" Filename="NGULIM.ttf" Type="Dynamic" Size="12" NativeHorzRes="800" NativeVertRes="600" AutoScaled="true" >
< GlyphRange StartCodepoint= "44032" EndCodepoint= "55203" / >
< GlyphSet Glyphs="上下" / >
< /Font >


이 안에 이미지폰트나 트루타입폰트 설정을 해주면은 됩니다. 여기서 중요한것만 설명하면 Filename은 폰트 이름 전 새굴림(NGULIM.ttf)을 사용했습니다. type 폰트종류 Dynamic은 투루타입 Static은 이미지폰트, 이 폰트에서 한글을 사용하기 위해서는 Glyph명령을 사용해서 폰트내에서 사용할 문자코드를 정해줘야 합니다.
위에서 GlyphRange 문자코드(10진수)의 시작과 끝을 정해주는 겁니다. 위에서 44032는 폰트내에서 "가"에 해당하는 문자코드이고 55203은 한글문자코드의 마지막코드입니다. 이 외에도 특수 문자나 한자등의 사용을 위해 개별적으로 입력시 GlyphSet Glyphs = " " <--여기에 원하는 문자를 넣어 주면 됩니다.

그리고 나서 자신의 코드에서 button->setText((CEGUI::utf8*)"미션1"); 이런식으로 사용하면 됩니다.그러고 나서 저장할때 파일->저장 고급 옵션 에서 유니코드로 저장하시면 됩니다. 이상이 한글 출력부분이고..

한글 입력시에는 CEGUI는 기본적으로 GUI만 구현되어 있습니다. Ogre, irricht, 그곳예제에서도 한글입력에 대해서는 찾을 수 없습니다. 위에 열거한 것들의 입력부분이 한글이나 비영미권의 언어를 지워하지 않습니다. 그래서 입력부분은 따로 구현해 줘야 합니다. 한/영 키를 인식해서 키보드에서 들어오는 신호를 해당 문자코드로 변환해주는 부분은 자신이 직접 구현해야 합니다.

이상입니다. 그외 세부적인 부분 Scheme, layout 다중폰트 사용등은 레퍼런스문에다 잘 나와있습니다.
--위의 내용보고 구현한 예제입니다.
저작자 표시 비영리 변경 금지

cegui 한글 ime 입출력

OGRE3D 2009/11/16 11:25 Posted by <!--r'i"z&i\n+#]]x juree23
cegui 한글 폰트 사용하기.
cegui를 처음 설치시에는 한글입출력이 되지 않습니다.
혹시나 cegui를 사용하시는데 한글ime를 사용하시게 되면 참고 하시면 되겠습니다.
먼저 cegui 버전 0.5.0 부터는 특별한 설정을 하지 않아도 한글 출력이 가능합니다.
단, 한글폰트가 있는 font파일을 cegui에서 인식할수있게 등록해준뒤 출력할 한글문자를 utf-8형태로 인코딩
해주어야 합니다.글쓴 시점의 현재 0.6.2 버전을 기준으로 작성합니다.

-일단 cegui에 한글폰트를 등록해줘야 합니다. 폰트파일을 Datafile에서 인식할수 있도록 폰트파일을 설정합니다.
1. fonts 폴더에 font파일 복사
2. font 파일작성.( 메모장으로 새로만드신후 아래 내용을 써주신후에 파일확장자를 폰트로 바꿔주시면 됩니다 )
font 파일 내용은
<?xml version="1.0" ?>
<Font Name="enterp" Filename="enterp.ttf" Type="FreeType" Size="9" NativeHorzRes="800" NativeVertRes="600" AutoScaled="true"/>
와 같이 적으시면 됩니다.  당연히 각 항목에는 사용할 폰트에 알맞게 수정해 주셔야하구요 .
(.ttf 파일의 크기가 작을으면 작을 수록, .ttf에 들어있는 문자의 개수가 작으면작을 수록
폰트 로딩과, 폰트 삭제 시간이 줄어든다.
.ttf파일이 한글을 지원해줘야 한글 출력이 가능하고, 일어를 지원해야 일어 출력이 가능하다)

- cegui초기화를 한 후에 FontManager::getSingleton().createFont("enterp.font");
를 삽입해서 해당 폰트를 불러오도록 하세요. (주폰트로 사용하게 .. ) 저는 엔터 풀입체를 사용했습니다.

-이제 출력할 한글을 cegui에서 인식하는 utf-8 형식으로 인코딩 한후 출력하여야 합니다.
인코딩 방법은 2가지가 있습니다.
1. 소스코드 자체를 UTF-8로 만드는 방법
Visual Studio에서 애시당초 소스코드를 저장할때 utf-8로 저장하면 별 문제없이 한글이 잘 출력 됩니다.
하지만 Visual Studio 6.0에서는 저장형식을 설정할수 있는 메뉴가 없고 ..
VS 2005에서는 고급 옵션에서 UTF-8로 저장할수 있는 옵션이 있긴 하지만,, 제대로 되질 않습니다.(어디서 듣기로 2005자체에 버그가 있다고 하더군요 .. )
고로 이것도 VS 2003에서만 잘된다는 정보가 있습니다.
유효한 방법은 정적으로 출력할 스트링(=문자)들을 FILE을 만들어서 저장시켜두고 거기서 읽어와서 출력하되, 그 파일은 UTF-8로 인코딩해서 저장하면 됩니다.
VS2005에서 UTF-8로 인코딩된 파일을 읽어서 찍으니 한글이 잘 나오더군요 ..

2. MBC 문자열을 UTF-8로 변환후 CEGUI모듈로 보내주기
변환은 MBC -> Unicode -> UTF-8  순서로 이루어집니다.
strconv.h 첨부파일로 포함합니다. 해당 파일을 포함하신후 사용하시면 됩니다.
사용방법은 아래와 같습니다.

#define CONV_UTF8_MBCS(a) convUni2Mbcs(convUtf82Uni(a)).c_str()
#define CONV_MBCS_UTF8(a) convUni2Utf8(convMbcs2Uni(a)).c_str()

사용시, (utf8*)CONV_MBCS_UTF8(txt) 형태로 사용하시면 됩니다.
이런식으로..history->setText((utf8*)CONV_MBCS_UTF8("막장 타이틀!"));
2번의 방법으로 포함후 사용했는데 문제없이 출력됩니다.

-이제 출력은 해결되었고 입력관련하여 조금 추가를 하면 됩니다.
만드시는 프로젝트의 msgproc 부분에서 한글입력시에 작동되게끔 넣어주시면 됩니다.
case WM_IME_COMPOSITION:
        {
                CEGUI_ImeInput(pEventRecord->hWnd, pEventRecord->lParam);
                return true;
        }
        break;
위의 코드는 msgproc 부분에 넣어주시구요. ime에서 필요한 hwnd값과 키값을 알기위해 lparam값을
인자값으로 넘겨줍니다. 함수의 원형은 아래와 같으며 그대로 쓰셔도 될거에요.

void        LoadNif::CEGUI_ImeInput(HWND hWnd, LPARAM lParam)                                                                                // IME Input                        //
{
        
        CEGUI::Window* target=0;
        CEGUI::Window* d_modalTarget = m_pCeguiSystem->getModalTarget();

        if (!d_modalTarget)
        {
                target = m_pCeguiSystem->getGUISheet()->getActiveChild();
        }
        else
        {
                target = d_modalTarget->getActiveChild();
                if (!target)
                {
                        target = d_modalTarget;
                }
        }

        if(!target)
                return;

        CEGUI::Editbox *pEditWindow = (CEGUI::Editbox*)target;

           // IME 핸들얻기. 실패하면 IME 입력처리 안함
           HIMC hImc = ImmGetContext(hWnd);
           if(hImc == NULL)
                      return;

           // 변수 설정
           int                   nLength = 0;
           wchar_t        wszComp[4] = {0,};


           // IME 문자 조합이 완료되었다면
           if(lParam == GCS_RESULTSTR)
           {
                      nLength = ImmGetCompositionStringW(hImc, GCS_RESULTSTR, NULL, 0);

                      if(nLength > 0)
                      {
                                 ImmGetCompositionStringW(hImc, GCS_RESULTSTR, wszComp, nLength);

                                 for(int i = 0; i < nLength; i++)
                                 {
                                            if(wszComp[i] != 0)
                                                       m_pCeguiSystem->injectChar(wszComp[i]);
                                 }
                                                  // CEGUI::System::getSingleton().injectCharSelect( false );
                                 // 문자 조합이 완료되었으면 조합중인 문자 선택해제
                                 size_t caretIndex = pEditWindow->getCaratIndex();
                                 pEditWindow->setSelection(caretIndex, caretIndex);
                      }
           }
           // IME 문자 조합중이라면
           else
           {
                      nLength = ImmGetCompositionStringW(hImc, GCS_COMPSTR, NULL, 0);

                      if(nLength > 0)
                      {
                                 ImmGetCompositionStringW(hImc, GCS_COMPSTR, wszComp, nLength);

                                 for(int i = 0; i < nLength; i++)
                                 {
                                            if(wszComp[i] != 0)
                                            {
                                                       m_pCeguiSystem->injectChar(wszComp[i]);
                                            }
                                 }
                                                   // CEGUI::System::getSingleton().injectCharSelect( true );
                                 // 에디트 입력창을 위해 조합중인 문자가 선택되도록 함
                                 size_t caretIndex = pEditWindow->getCaratIndex();
                           if(caretIndex >= 0)
                                   pEditWindow->setSelection(caretIndex - 1, caretIndex);
                      }
           }

           // IME 핸들 해제
           ImmReleaseContext(hWnd, hImc);

}

-위의 코드는 상위 msgproc에 위치할경우 edit박스에 관해서만 carat위치를 변경할수 있는데
이를 해결하기 위하여 저는 cuguisystem.h 파일에 아래와 같은 함수를 추가후 위의 코드를 아래와 같이
변경하였습니다.
void System::injectCharSelect(bool select)
{
        if (d_activeSheet)
        {
                Window* dest = getKeyboardTargetWindow();

                if( dest )                      //에디트 박스인 경우
                {
                        if( dest->getWindowRenderer()->getClass() == Editbox::EventNamespace )
                        {
                                Editbox* pEditBox = (Editbox*)dest;
                                size_t caretIndex = pEditBox->getCaratIndex();
                                if(caretIndex >= 0)
                                {
                                        if( select )
                                                pEditBox->setSelection( pEditBox->getCaratIndex() - 1, pEditBox->getCaratIndex() );
                                        else
                                                pEditBox->setSelection( pEditBox->getCaratIndex(), pEditBox->getCaratIndex() );
                                }
                        }
                        else if( dest->getWindowRenderer()->getClass() == MultiLineEditbox::EventNamespace )
                        {
                                MultiLineEditbox* pMultiLineEditBox = (MultiLineEditbox*)dest;
                                size_t caretIndex = pMultiLineEditBox->getCaratIndex();
                                if(caretIndex >= 0)
                                {
                                        if( select )
                                                pMultiLineEditBox->setSelection( pMultiLineEditBox->getCaratIndex() - 1, pMultiLineEditBox->getCaratIndex() );
                                        else
                                                pMultiLineEditBox->setSelection( pMultiLineEditBox->getCaratIndex(), pMultiLineEditBox->getCaratIndex() );
                                }
                        }
                }
        }
}
줄이 좀 밀리네요 작아서..ㅋㅋ
위의 함수를 ceguisystem.h에 추가후 저~위의 CEGUI_ImeInput 함수의 injectCharSelect 사용부분의 주석을
푸시고 바로 밑의 setSelection함수 부분을 지우시면 됩니다. 이제 에디트박스던 멀티라인박스던
상관없이 사용하실수 있습니다.

혹시나 cegui를 사용하시는 분들을 위하여 참고하시라고 남기구요. 한글을 사용하시면 이제 특문리스트도
출력을 해주셔야 할텐데 너무 길어져서 특문리스트 출력관련은 빠른시간내에 정리해서 올려드리겠습니다.
그럼 모드 즐프 하세요~
저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

컴파일 방법  (0) 2009/11/16
CEGUI 한글설정  (0) 2009/11/16
cegui 한글 ime 입출력  (0) 2009/11/16
ogre3d 빌더~굿~~~~~초강추  (0) 2009/11/15
ogre3d 씬 빌더~  (0) 2009/11/15
OGRE3D EXPORTER 모음  (0) 2009/11/15

ogre3d 빌더~굿~~~~~초강추

OGRE3D 2009/11/15 13:57 Posted by <!--r'i"z&i\n+#]]x juree23
http://freeworld3d.org/
저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

CEGUI 한글설정  (0) 2009/11/16
cegui 한글 ime 입출력  (0) 2009/11/16
ogre3d 빌더~굿~~~~~초강추  (0) 2009/11/15
ogre3d 씬 빌더~  (0) 2009/11/15
OGRE3D EXPORTER 모음  (0) 2009/11/15
OGRE3D TOOLS  (0) 2009/11/15

ogre3d 씬 빌더~

OGRE3D 2009/11/15 12:33 Posted by <!--r'i"z&i\n+#]]x juree23
http://www.ogitor.org/
저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

cegui 한글 ime 입출력  (0) 2009/11/16
ogre3d 빌더~굿~~~~~초강추  (0) 2009/11/15
ogre3d 씬 빌더~  (0) 2009/11/15
OGRE3D EXPORTER 모음  (0) 2009/11/15
OGRE3D TOOLS  (0) 2009/11/15
OGRE3D 매쉬 뷰어  (0) 2009/11/15

OGRE3D EXPORTER 모음

OGRE3D 2009/11/15 11:29 Posted by <!--r'i"z&i\n+#]]x juree23
http://cafe.naver.com/worifamily.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=300
http://www.ofusiontechnologies.com/downloads.html
저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

ogre3d 빌더~굿~~~~~초강추  (0) 2009/11/15
ogre3d 씬 빌더~  (0) 2009/11/15
OGRE3D EXPORTER 모음  (0) 2009/11/15
OGRE3D TOOLS  (0) 2009/11/15
OGRE3D 매쉬 뷰어  (0) 2009/11/15
ogre3d GOOF및 여러가지  (0) 2009/11/15

OGRE3D TOOLS

OGRE3D 2009/11/15 11:18 Posted by <!--r'i"z&i\n+#]]x juree23
http://cafe.naver.com/worifamily.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=298
저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

ogre3d 씬 빌더~  (0) 2009/11/15
OGRE3D EXPORTER 모음  (0) 2009/11/15
OGRE3D TOOLS  (0) 2009/11/15
OGRE3D 매쉬 뷰어  (0) 2009/11/15
ogre3d GOOF및 여러가지  (0) 2009/11/15
어드벤쳐 게임 개발 툴  (0) 2009/11/14

OGRE3D 매쉬 뷰어

OGRE3D 2009/11/15 11:13 Posted by <!--r'i"z&i\n+#]]x juree23

http://www.ogre3d.org/wiki/index.php/CEGUI_Mesh_Viewer
저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

OGRE3D EXPORTER 모음  (0) 2009/11/15
OGRE3D TOOLS  (0) 2009/11/15
OGRE3D 매쉬 뷰어  (0) 2009/11/15
ogre3d GOOF및 여러가지  (0) 2009/11/15
어드벤쳐 게임 개발 툴  (0) 2009/11/14
ogre3d에서 fade효과 주기  (0) 2009/11/14

ogre3d GOOF및 여러가지

OGRE3D 2009/11/15 11:11 Posted by <!--r'i"z&i\n+#]]x juree23
http://www.cs.umd.edu/class/fall2006/cmsc498m/install.shtml
저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

OGRE3D TOOLS  (0) 2009/11/15
OGRE3D 매쉬 뷰어  (0) 2009/11/15
ogre3d GOOF및 여러가지  (0) 2009/11/15
어드벤쳐 게임 개발 툴  (0) 2009/11/14
ogre3d에서 fade효과 주기  (0) 2009/11/14
ogre3d를 브라우저에서 ~~굿  (0) 2009/11/14

어드벤쳐 게임 개발 툴

OGRE3D 2009/11/14 11:35 Posted by <!--r'i"z&i\n+#]]x juree23
예전부터 게임 개발 툴에 대해서 고민을 많이 해왔는데,
예를 들면, 스타크레프트 맴 에디터 같은 것들 말입니다.
그런데, 막상 그런 툴들이 사용법이 복잡해요.
그래서 직업이 게임 개발인 저도 아직까지 제대로 게임 개발툴을 사용해본적이 없어요.

홈페이지 입구 : http://www.adventuregamestudio.co.uk
기본 튜토리얼 : http://www.bigbluecup.com/acintro.htm

그런데 이번에 Adventure 게임 개발툴을 발견했는데,
이 메뉴얼이 정말 잘 되어있더라구요.
인터페이스 같은것만 따라서 읽어도 큰 공부가 되요.
그리고 무료 프로그램이라서 아무나 다운 받아서 쓸수도 있구요.

게임 개발툴에 관심이 있으신분은 한번 보심이...
 

저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

OGRE3D 매쉬 뷰어  (0) 2009/11/15
ogre3d GOOF및 여러가지  (0) 2009/11/15
어드벤쳐 게임 개발 툴  (0) 2009/11/14
ogre3d에서 fade효과 주기  (0) 2009/11/14
ogre3d를 브라우저에서 ~~굿  (0) 2009/11/14
mesh maya3d에서 익스포트  (0) 2009/11/13

ogre3d에서 fade효과 주기

OGRE3D 2009/11/14 09:05 Posted by <!--r'i"z&i\n+#]]x juree23
http://www.ogre3d.org/forums/viewtopic.php?f=5&t=28696
저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

ogre3d GOOF및 여러가지  (0) 2009/11/15
어드벤쳐 게임 개발 툴  (0) 2009/11/14
ogre3d에서 fade효과 주기  (0) 2009/11/14
ogre3d를 브라우저에서 ~~굿  (0) 2009/11/14
mesh maya3d에서 익스포트  (0) 2009/11/13
ogre3d 무료 강좌~굿~  (0) 2009/11/13

ogre3d를 브라우저에서 ~~굿

OGRE3D 2009/11/14 08:57 Posted by <!--r'i"z&i\n+#]]x juree23
http://www.brighthub.com/hubfolio/matthew-casperson/articles/52773.aspx
저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

어드벤쳐 게임 개발 툴  (0) 2009/11/14
ogre3d에서 fade효과 주기  (0) 2009/11/14
ogre3d를 브라우저에서 ~~굿  (0) 2009/11/14
mesh maya3d에서 익스포트  (0) 2009/11/13
ogre3d 무료 강좌~굿~  (0) 2009/11/13
OGRE3D 추천 카페  (0) 2009/11/13

mesh maya3d에서 익스포트

OGRE3D 2009/11/13 15:43 Posted by <!--r'i"z&i\n+#]]x juree23
http://blog.naver.com/humantrouble/90031383245
저작자 표시 비영리 변경 금지

'OGRE3D' 카테고리의 다른 글

ogre3d에서 fade효과 주기  (0) 2009/11/14
ogre3d를 브라우저에서 ~~굿  (0) 2009/11/14
mesh maya3d에서 익스포트  (0) 2009/11/13
ogre3d 무료 강좌~굿~  (0) 2009/11/13
OGRE3D 추천 카페  (0) 2009/11/13
Ogre3D로 만든 메시뷰어 입니다. LittleMeshViewer 0.1  (0) 2009/11/13

ogre3d 무료 강좌~굿~

OGRE3D 2009/11/13 15:43 Posted by <!--r'i"z&i\n+#]]x juree23
비번: sisagames

저작자 표시 비영리 변경 금지