한국산업기술대학교 제 10 강광원 이대현교수
학습안내 학습목표 오우거엔진의광원을이용하여 3D 공갂에서광원을구현해본다. 학습내용 평면메쉬의생성방법광원의종류및구현방법
광원의종류 : 주변광원 주변광원 (Ambient Light) 동일한밝기의빛이장면안의모든물체의표면에서일정하게반사되는것. 공갂안에존재하는빛의평균값이론적인광원
광원의종류 : 지향광원 지향광원 (Directional Light) 한방향으로무한히뻗어나가는빛. 빛이물체면을향하여일정한방향으로진행. 거리에상관없이특정한한방향 ( 벡터 ) 에대해서빛의세기가일정하게주어진다 방향이중요 태양을흉내낼때주로쓰임. OGRE 엔진 : LT_DIRECTIONAL
광원의종류 : 점광원 점광원 (Point Light) 공갂안의한점에서모든방향으로동일하게뻗어나가는빛. 백열젂구를모델링. 광원과물체표면과의거리의제곱에비례하여밝기가약해짐 ( 감쇄 : attenuation) 거리가중요 OGRE 엔진 : LT_POINT
광원의종류 : 점적광원 점적광원 (Spot Light) 정해진위치와범위만비추는광원. 일종의점광원이지만, 모든방향으로만퍼지는것이아니고, 특정방향으로지정된각도만큼빛이퍼져나감. 무대조명을모델링. 거리에따라서빛의세기가약해짐. OGRE 엔진 : LT_SPOTLIGHT
실습 Light 다양한광원설정
class LectureApp void _drawgroundplane(void) { Plane plane( Vector3::UNIT_Y, 0 ); MeshManager::getSingleton().createPlane( "Ground", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane, 500,500, 1,1, true,1,2,2, Vector3::NEGATIVE_UNIT_Z ); 실습 } Entity* groundentity = mscenemgr->createentity("groundplane", "Ground" ); mscenemgr->getrootscenenode()->createchildscenenode()->attachobject(groundentity);
실행결과
평면메쉬의생성 생성방법 먼저평면을생성하고 (Plane 클래스사용 ), 그리고이것을메쉬로변환한다 (MeshManager 클래스사용 ) 평면의생성 두개의정보가필요 : 평면의법선벡터 (normal vector) 및평면과원점의거리 Plane plane(vector3::unit_y, 0); Y X Z
메쉬의생성 MeshManager 클래스 프로그램에서로드된모든메쉬들을관리하는클래스 메쉬이름. MeshManager::getSingleton().createPlane( "Ground", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane, 500,500, 1,1, true,1,2,2, Vector3::NEGATIVE_UNIT_Z ); 평면정보. 너비 : 500 높이 : 500
엔터티와장면노드의생성 앞에서만든메쉬의이름. Entity* groundentity = mscenemgr->createentity( "GroundPlane", Ground" ); mscenemgr->getrootscenenode()->createchildscenenode()->attachobject(groundentity); 장면노드의생성 장면노드에엔터티배치.
class LectureApp void _drawgroundplane(void) { Plane plane( Vector3::UNIT_Y, 0 ); MeshManager::getSingleton().createPlane( "Ground", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane, 500,500, 1,1, true,1,10,10, Vector3::NEGATIVE_UNIT_Z ); 실습 Entity* groundentity = mscenemgr->createentity("groundplane", "Ground" ); mscenemgr->getrootscenenode()->createchildscenenode()->attachobject(groundentity); groundentity->setmaterialname("kpu_logo"); }
텍스쳐입히기 setmaterialname() 함수사용 Entity* groundentity = mscenemgr->createentity("groundplane", "Ground" ); mscenemgr->getrootscenenode()->createchildscenenode()->attachobject(groundentity); groundentity->setmaterialname("kpu_logo"); material KPU_LOGO { technique { pass { texture_unit { texture KPU_LOGO.gif } } } } resource.zip 내의 KPU_LOGO.material 에위치. KPU_LOGO.gif 를타일이미지로사용.
텍스쳐가입혀진평면
타일갯수의변화 (10x10)
class LectureApp - 광원설정추가 void _setlights(void) { mscenemgr->setambientlight(colourvalue(0.0f, 0.0f, 0.0f)); 실습 mlightd = mscenemgr->createlight("lightd"); mlightd->settype(light::lt_directional); mlightd->setdirection( Vector3( 1, -2.0f, -1 ) ); mlightd->setvisible(false); mlightp = mscenemgr->createlight("lightp"); mlightp->settype( Light::LT_POINT ); mlightp->setposition( Vector3(-250, 50, 250) ); mlightp->setvisible(false); } mlights = mscenemgr->createlight("lights"); mlights->settype( Light::LT_SPOTLIGHT ); mlights->setdirection(ogre::vector3::negative_unit_y); mlights->setposition( Vector3( 250, 900, 250) ); mlights->setspotlightrange( Degree(10), Degree(80)); mlights->setvisible(false);
class InputController 광원설정조작추가 bool keypressed( const OIS::KeyEvent &evt ) { switch(evt.key) { case OIS::KC_A: { static float a = 0.0f; a = (a >= 1.0f)? 0.0f : a + 0.1f; mscenemgr->setambientlight(colourvalue(a, a, a)); } break; case OIS::KC_D: mlightd->setvisible(!mlightd->getvisible()); break; case OIS::KC_P: mlightp->setvisible(!mlightp->getvisible()); break; case OIS::KC_S: mlights->setvisible(!mlights->getvisible()); break; } 실습 } return true;
PlayState.cpp 그림자추가 void _setlights(void) { mscenemgr->setambientlight(colourvalue(0.0f, 0.0f, 0.0f)); mscenemgr->setshadowtechnique(shadowtype_stencil_additive);... 중략... } void _drawgroundplane(void) {... 중략... groundentity->setmaterialname("kpu_logo"); groundentity->setcastshadows(false); } void go(void) {... 중략... professoryaw->attachobject(entity); entity->setcastshadows(true); } 실습
Directional Light
Point Light
Spot Light
모든광원을 ON
광원의생성 Light 클래스 SceneManager::createLight(): 광원생성 Light::setType(): 광원종류설정 Light::setPosition(): 광원의위치설정 Light::setDirection(): 광원의방향설정 광원객체를장면노드에소속시키면, 광원을이동하는것이가능함. 캐릭터를따라다니는광원을구현할수있슴. 광원의생성 mlightd = mscenemgr->createlight("lightd"); mlightd->settype(light::lt_directional); mlightd->setdirection( Vector3( 1, -2.0f, -1 ) ); mlightd->setvisible(false); 광원의종류를설정. 지향광원으로설정함. 광원 ON/OFF 광원의방향설정.
점광원및점적광원의생성및설정 mlightp = mscenemgr->createlight("lightp"); mlightp->settype( Light::LT_POINT ); mlightp->setposition( Vector3(-250, 50, 250) ); mlightp->setvisible(false); mlights = mscenemgr->createlight("lights"); mlights->settype( Light::LT_SPOTLIGHT ); mlights->setdirection(ogre::vector3::negative_unit_y); mlights->setposition( Vector3( 250, 900, 250) ); mlights->setspotlightrange( Degree(10), Degree(80)); mlights->setvisible(false); 점광원의위치결정. 점적광원의확산각도 ( 안쪽각도, 바깥쪽각도 ) 설정. 안쪽각도는 Direct3D 에만적용가능. OpenGL 에서는 0 도로간주.
class LectureApp 광원색상설정 void _setlights(void) {... 중략... mlightd->setdiffusecolour(1.0f, 0.0f, 0.0f); mlightp->setdiffusecolour(0.0f, 1.0f, 0.0f); mlights->setdiffusecolour(0.0f, 0.0f, 1.0f); } 실습
광원색상혼합
학습정리 광원의종류 주변광원 / 지향광원 / 점광원 / 점적광원 광원의생성및설정 SceneManager::createLight(): 광원생성 Light::setType(): 광원종류설정 Light::setPosition(): 광원의위치설정 Light::setDirection(): 광원의방향설정