본문 바로가기

OGRE 엔진활용

[Ogre] 오브젝트 투명화

이 내용은 네이버 오우거 공식 카페에서 '특정옙군' 님이 기술하신 내용을 참고로 하여, 우리 프로젝트에 맞게 변형해서 사용한것입니다. 기본적인 원리는 캐릭터의 위치로부터, 카메라의 위치를 향해 레이를 쏘고, 캐릭터와 카메라 사이에 오브젝트가 있다면 그것을 투명화 하는 원리입니다.


void CollisionTools::raycastToBlend(/*Ogre::SceneNode* &char_scenenode,*/ Ogre::Vector3 &char_position, Ogre::Vector3 &cam_position)
{

 //캐릭터의 위치로부터 카메라를 향해 ray를 쏠수 있도록 광선을 설정한다.(origin: 캐릭터위치, direction:카메라방향)
 Ogre::Vector3 direction = cam_position - char_position; //카메라가 위치한곳의 방향을 구함(x2 - x1, y2 - y1, z2-z1)
 direction.x = 0;
// (참고: 현재 밝은 색으로 되어 있는 코드는 참고 하지 않아도 됩니다.)

 Ogre::Ray ray(char_position,direction);

 mRaySceneQuery->setRay(ray);
 mRaySceneQuery->setSortByDistance(true);

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

 Ogre::String entityName;   
 for(itr = result.begin(); itr != result.end(); ++itr)
 {
  if(itr->movable)
  {
   //투명화 오브젝트 키워드 "stone"
   //이름의 처음부터 5번째까지의 글자가 'stone' 이고, 거리가 0보다 크면 오브젝트를 투명화한다.
  // 거리에 대한 처리를 하지 않으니까 투명화 하고자 하는 오브젝트와 겹쳐졌을경우 깜박이는 문제가 발생했다.
   if( itr->movable->getName().substr(0,5) == "stone" && (itr->distance > 0) )    {
    if(!m_emi) //emi 가 초기화 되어있다면
    {
     entityName = itr->movable->getName(); //Ray 에 걸린 객체 이름을 가져옴
     m_emi = new EntityMaterialInstance(mSceneMgr->getEntity(entityName));
     m_emi->setTransparency(0.5);
     break;
    }
   }
   else
   {
    delete m_emi;
    m_emi =0;
   }
  }
 }
}