¹è Á¶Á¾Çϱâ¶ó°í Çؼ­ °ÅâÇÑ ¹è°¡ ¾Æ´Ï¶ó »ç°¢Çü 2°³ »ï°¢Çü 1°³¸¸ ¿òÁ÷ÀÏ °ÍÀÌ´Ù. 
ÅؽºÃĵµ ¾ø´Â ½ä··ÇÑ Æú¸®°ïµéÀÌ´Ù. ´ÙÀ½Àå¿¡¼­ ID3DXMatrixStack¿¡ ´ëÇؼ­ ´Ù·ç±â À§Çؼ­ ÀÌÀåÀ» ¸¸µé¾ú´Ù. ÀÌ Àå¿¡¼­ 1. Ä«¸Þ¶óÀÇ Á¤È®ÇÑ °¡·Î ¼¼·Î ºñÀ² Á¶Á¤, 2. ¹è ¿òÁ÷À̱â 3. ¹è ·»µå¸µÀÇ ¼ø¼­´ë·Î ¼³¸íÇÒ°ÍÀÌ´Ù. 1. Ä«¸Þ¶óÀÇ Á¤È®ÇÑ °¡·Î ¼¼·Î ºñÀ² Á¶Á¤ ¿ø·¡ ÇÏ´ø ¹æ½Ä´ë·Î D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 800.0f/640.0f, 1.0f, 100.0f ) Aspect°ª¿¡ 800.0f/640.0fÀ̶õ °ªÀ» ³Ö°í Á¤»ç°¢ÇüÀÇ Æú¸®°ïÀ» Ãâ·ÂÇßÁö¸¸, ¼¼·Î ºÎºÐÀÌ ±æÀÌ°¡ ´õ ª°Ô ³ª¿Ô´Ù. À©µµ¿ì ¸ðµåÀ϶§´Â ŸÀÏƲ â ¶§¹®¿¡ ¼¼·Î ±æÀÌ°¡ ½ÇÁ¦ ±æÀ̺¸´Ù ´õ ª¾Æ Áø´Ù. Á¤È®ÇÑ °ªÀ» ³Ö±â À§Çؼ­´Â ´ÙÀ½°ú °°ÀÌ ½ÇÁ¦ ·»µå¸µµÇ´Â À©µµ¿ìÀÇ Å¬¶óÀ̾ðÆ® Å©±â¸¦ ±¸Çؼ­ Aspect¿¡ ³Ö¾î¾ß ÇÑ´Ù. // Setup Projection RECT rect; GetClientRect(hWnd, &rect); float width = (float)rect.right, height = (float)rect.bottom; D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, width/height, 1.0f, 100.0f ); ÀÌ·¸°Ô ÇÏ¸é °¡·Î ¼¼·Î ±æÀÌ°¡ ÀÏÄ¡ÇÏ´Â Á¤»ç°¢ÇüÀÌ ³ª¿Ã°ÍÀÌ´Ù. ================================================================================================

2. ¹è ¿òÁ÷À̱â 

¹è¸¦ ¿òÁ÷À϶§´Â ÇöÀç ÁÂÇ¥¿¡¼­ ¿òÁ÷ÀÎ °Å¸®¸¦ »ï°¢ÇÔ¼ö¸¦ ÀÌ¿ëÇØ xÃàÀ¸·Î ¾ó¸¶ yÃàÀ¸·Î ¾ó¸¶ ¿òÁ÷¿´´ÂÁö ¾Ë¼öÀÖ´Ù.
¹èÀÇ À§Ä¡¸¦ ³ªÅ¸³»´Â ÇÊ¿äÇÑ º¯¼ö´Â ´ÙÀ½°ú °°´Ù.

float g_fx = 0.0f;			   //ÇöÀç xÃà¿¡¼­ÀÇ À§Ä¡
float g_fy = 0.0f;			   //ÇöÀç yÃà¿¡¼­ÀÇ À§Ä¡	
float g_fDegree = 0.0f;        //¹è º»Ã¼ÀÇ ¿ùµå¿¡¼­ ÇâÇÏ´Â ¹æÇâ
float g_fTurretDegree = 0.0f;  //Æ÷½ÅÀÇ ·ÎÄÿ¡¼­ ÇâÇÏ´Â ¹æÇâ

void MovPosition(float fMove)
{
#if  1		//yÃàÀ» ±âÁØÀ¸·Î ȸÀü°¢À» 0À¸·Î ÇÒ¶§
	double sin_a = -sin( D3DXToRadian(g_fDegree) );
	double cos_a = cos( D3DXToRadian(g_fDegree) );

	g_fx = float(fMove * sin_a + g_fx);
	g_fy = float(fMove * cos_a + g_fy);
#else
	double sin_a = sin( D3DXToRadian(g_fDegree) );
	double cos_a = cos( D3DXToRadian(g_fDegree) );

	g_fy = float(fMove * sin_a + g_fy);
	g_fx = float(fMove * cos_a + g_fx);
#endif
}

ÀϹÝÀûÀ¸·Î Çб³¿¡¼­ ¹è¿î ¼öÇп¡¼­ »ç¿ëÇÏ´Â ÁÂÇ¥´Â XÃàÀ» ¿µÁ¡ ±âÁØÀ¸·Î ÀâÁö¸¸ °ÔÀÓ¿¡¼­´Â YÃàÀ̳ª ZÃàÀ»
¿µÁ¡ ±âÁØÀ¸·Î Àâ´Â´Ù.

XÃàÀÌ ¿µÁ¡À϶§---
(mÀº ¿òÁ÷ÀÎ °Å¸®ÀÌ´Ù.)

x°ªÀº?
cos a = move_x / m 
move_x = m * cos a À̹ǷΠ
¸ñÀûÁö g_fx = move_x + ½ÃÀÛ À§Ä¡ x = float(fMove * cos_a + g_fx)

y°ªÀº?
sin a = move_y / m
move_y = m * sin a À̹ǷÎ
¸ñÀûÁö g_fy = move_y + ½ÃÀÛ À§Ä¡ y = g_fy = float(fMove * sin_a + g_fy)

YÃàÀÌ ¿µÁ¡ÀÏ ¶§---

XÃà°ú YÃàÀÇ °ø½ÄÀÌ ¾à°£ ´Ù¸¦ °ÍÀÌ´Ù. ¾î°¼­ ÀÌ·¸°Ô ³ª¿ÀÁö ¸Ó¸®¸¦ ½Î¸Å°í ¸çÄ¥À» »ý°¢ÇÑÀûÀÌ ÀÖ´Ù.
Á¤¼®¿¡ ³ª¿Í ÀÖ´Â »ï°¢ÇÔ¼öÀÇ µ¡¼ÀÁ¤¸®¸¦ Çѹø Âß~~~ º¸ÀÚ.

»ï°¢ ÇÔ¼öÀÇ µ¡¼À Á¤¸®

1)   sin(a + b) = sin a * cos b + cos a * sin b
      sin(a - b) = sin a * cos b - cos a * sin b

2)  cos(a + b) = cos a * cos b - sin a * sin b
     cos(a - b) = cos a * cos b + sin a * sin b


x°ªÀº?

2¹ø °ø½ÄÀ» Àû¿ëÇغ¸ÀÚ. yÃàÀÌ ±âÁØÀ̱⠶§¹®¿¡ (+90)À» ´õÇÏ¸é µÈ´Ù.

cos(a + 90)
= cos a * cos 90 - sin a * sin 90
= cos a * 0 - sin a * 1
±×·¯¹Ç·Î °¢µµ¸¦ ±¸ÇÏ´Â °ø½ÄÀº -sin aÀÌ´Ù
-sin a = move_x / m, move_x = m * (-sin a) ÀÌ´Ù.
¸ñÀûÁö g_fx = move_x + ½ÃÀÛ À§Ä¡ x = float(fMove * sin_a + g_fx) y°ªÀº?
sin(a + 90)
= sin a * cos 90 + cos a * sin 90
= sin a * 0 + cos a * sin 90
±×·¯¹Ç·Î °¢µµ¸¦ ±¸ÇÏ´Â °ø½ÄÀº cos aÀÌ´Ù.
cos a = move_y / m
move_y = m * cos a 
¸ñÀûÁö g_fy = move_y + ½ÃÀÛ À§Ä¡ y = g_fy = float(fMove * cos_a + g_fy)

±×¸²À» º¸¸é¼­ »ï°¢ÇÔ¼ö¸¦ »ý°¢Çϸé ÀÌÇØ°¡ ½¬¿ï °ÍÀÌ´Ù.
================================================================================================

3. ¹è ·»µå¸µ


void MoveShip(float fx, float fy)
{
	D3DXMATRIX	mScale1, mRot1, mTran1, mResult1;
	D3DXMATRIX	mScale2, mRot2, mTran2, mResult2;
	D3DXMATRIX	mScale3, mRot3, mTran3, mResult3;

	//º»Ã¼
	//SRT
	D3DXMatrixScaling( &mScale1, 1.1f, 1.1f, 1.1f );
	D3DXMatrixRotationZ(&mRot1, D3DXToRadian(g_fDegree));
	D3DXMatrixTranslation( &mTran1, fx, fy, 0.0f);

	mResult1 = mScale1 * mRot1 * mTran1;
	g_d3d_Device->SetTransform( D3DTS_WORLD, &mResult1);
	g_d3d_Device->DrawPrimitive( D3DPT_TRIANGLESTRIP, 3, 2 );

	//Æ÷ž
	D3DXMatrixScaling( &mScale2, 1.0f, 1.0f, 1.0f );
	D3DXMatrixRotationZ(&mRot2, D3DXToRadian(g_fTurretDegree));
	D3DXMatrixTranslation( &mTran2, 0.0f, -0.7f, 0.0f );
	
mResult2 = mScale2 * mRot2 * mTran2 * mResult1; g_d3d_Device->SetTransform( D3DTS_WORLD, &mResult2 ); g_d3d_Device->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 ); //Æ÷ D3DXMatrixScaling( &mScale3, 0.1f, 0.3f, 1.0f ); D3DXMatrixRotationZ(&mRot3, 0.0f); D3DXMatrixTranslation( &mTran3, 0.0f, -0.1f, -0.5f); mResult3 = mScale3 * mRot3 * mTran3 * mResult2; g_d3d_Device->SetTransform( D3DTS_WORLD, &mResult3 ); g_d3d_Device->DrawPrimitive( D3DPT_TRIANGLESTRIP, 3, 2 ); } (( º»Ã¼ -- Æ÷ž -- Æ÷ )) ¿Í °°ÀÌ ¸ðµ¨ÀÌ ºÎ¸ð¿¡ Á¾¼ÓµÇ¾î ÀÖ´Ù. ºÎ¸ð, Àڽİ£ÀÇ À̵¿½ÄÀº 9Àå¿¡¼­ º»¹Ù¿Í °°ÀÌ [Lx Ly Lz][Tm child][Tm parent] ¼ø¼­·Î ´ÙÀÌ·ºÆ® X¿¡¼­´Â Çà·ÄÀ» °öÇÑ´Ù. À̵¿, ȸÀü, È®´ë´Â [Lx Ly Lz][È®´ë][ȸÀü][À̵¿]ÀÇ ¼ø¼­·Î Çà·ÄÀ» °öÇÑ´Ù. ÀÌ µÎ°¡Áö¸¦ ¾Ë¸é ·»´õ·¯ ¼Ò½º¸¦ ÀÌÇØÇϴµ¥ ¹«¸®°¡ ¾øÀ» °ÍÀÌ´Ù.



<¿ø ÀÚÃë(±ËÀû)¿¡ ÀÖ´Â Á¡ÀÇ À§Ä¡ ±¸Çϱâ>

±¸ÇÏ°íÀÚ ÇÏ´Â ¿ø ÀÚÃëÀÇ Á¡À» x1, y1
¿øÁ¡À» x0, y0
¹ÝÁö¸§À» radius
°¢µµ¸¦ angle

x1 = x0 + (cos(angle) * radius); 
y1 = y0 + (sin(angle) * radius);