Programming

[OGRE] 매뉴얼 객체로 좌표축 만들기

반응형

원문 http://cafe.naver.com/ogre3d/1556

 

매뉴얼 객체로 좌표축을 만드는 코드이다.

 

좌측 하단으로 위치를 고정해주는 코드.

Vector3 AppCamera::getScreenPos(SCREEN_POS sp)
{  
	Vector3 pos = getPosition();
	Quaternion ori = getOrientation();

	float x=20, y=13, z=40;

	if (sp == LT)
 		return pos +  ori * Vector3(-x, y,-z);
	else if (sp == LB)
 		return pos +  ori * Vector3(-x,-y,-z);
 	else if (sp == RT)
  		return pos +  ori * Vector3(x,y,-z);
 	else //RB
  		return pos +  ori * Vector3(x,-y,-z);
}

 

메인 코드

MovableObject *axis = createAxis(mSceneMgr, "AxisObj", 2);
axis->setRenderQueueGroup(RENDER_QUEUE_OVERLAY);
SceneNode *mAxisNode = mRootNode->createChildSceneNode();
mAxisNode->attachObject(axis);

in Update() : 카메라 방향과 일치하게, 씬노드를 회전시키고, 화면 하단왼쪽에 위치하게 위치를 변경 시킨다.

mAxisNode->setPosition(mCamera->getScreenPos(AppCamera::LB));

 

사용하는 리소스

abstract material med/color/base
{
 	technique
	{
		pass
		{
   			//lighting off
   			ambient $color
   			diffuse $color
   			emissive $color
            
            depth_check off
		}
	}
}

material med/color/red : med/color/base
{
	set $color "1 0 0"
}

material med/color/green : med/color/base
{
 	set $color "0 1 0"
}

material med/color/blue : med/color/base
{
	set $color "0 0 1"
}

 

좌표축 객체를 생성하는 코드

//-- 선언

ManualObject *createAxis(SceneManager *smgr, const String &name, float axisLen=2);

//-- 구현

#define MAT_X_AXIS "med/color/red"
#define MAT_Y_AXIS "med/color/green"
#define MAT_Z_AXIS "med/color/blue"


ManualObject *createAxis(SceneManager *smgr, const String &name, float axisLen)
{
 	assert(smgr && !name.empty() && axisLen > 0);
 	ManualObject *mobj = smgr->createManualObject(name);
 	Vector3 p0(0,0,0), px(axisLen,0,0), py(0,axisLen,0), pz(0,0,axisLen);
 	float tx = 0.15f, ty = 0.25f, tz = 0.2f;
 	float x = px.x + 0.2f, y = py.y + 0.5f, z= pz.z + 0.2f;

	//--
	mobj->begin(MAT_X_AXIS, Ogre::RenderOperation::OT_LINE_LIST);

	//x-axis
 	mobj->position(p0); mobj->position(px);
	//x-char
 	mobj->position(x - tx,  ty, 0); mobj->position(x + tx, -ty, 0);
 	mobj->position(x - tx, -ty, 0); mobj->position(x + tx,  ty, 0);

	mobj->end();

	//--
	mobj->begin(MAT_Y_AXIS, Ogre::RenderOperation::OT_LINE_LIST);

	//y-axis
 	mobj->position(p0); mobj->position(py);
	//y-char
 	mobj->position(-tx, y + ty, 0); mobj->position(0, y, 0);
 	mobj->position( tx, y + ty, 0); mobj->position(0, y, 0);
 	mobj->position(  0, y - ty, 0); mobj->position(0, y, 0);

	mobj->end();

	//--
 	mobj->begin(MAT_Z_AXIS, Ogre::RenderOperation::OT_LINE_LIST);
    
	//z-axis
 	mobj->position(p0); mobj->position(pz);
	//z-char
 	mobj->position(-tx,  tz, z); mobj->position(tx,  tz, z);
 	mobj->position(-tx, -tz, z); mobj->position(tx,  tz, z);
 	mobj->position(-tx, -tz, z); mobj->position(tx, -tz, z);

	mobj->end();

 	return mobj;
}

 

좌측 하단에 화면 회전 각도를 표현하는 좌표계가 표현된다.

반응형