ย ย 


39b8c332abc236a14e81d2b628f1726a7105



๋‹ค์ด๋ ‰ํŠธ x9์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๊ณ  ๋จผ์ € ์ƒํ™ฉ๋ถ€ํ„ฐ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋น„ํ–‰๊ธฐ ๊ฒŒ์ž„์„ ๋งŒ๋“ค๊ณ  ์žˆ๋Š”๋ฐ Look ๋ฒกํ„ฐ ์ถ•์œผ๋กœ ์ขŒ์ถ•, ์šฐ์ธก ํšŒ์ „์„ ํ–ˆ๋Š”์ง€ ํ™•์ธ์ธ Roll ๋ฐฉํ–ฅ ํšŒ์ „ ๊ฐ๋„๋ฅผ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋น„ํ–‰๊ธฐ์— ๋ฒกํ„ฐ ํ•˜๋‚˜๋ฅผ ๊ผฌ๋ฆฌ ๋ถ€๋ถ„์— ๋‹ฌ์•„ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

๋ถ‰์€ ์ƒ‰์ด ๊ผฌ๋ฆฌ ๊ธฐ์ค€์ถ•์ด๊ณ  ์ดˆ๋ก์ƒ์€ ๋น„ํ–‰๊ธฐ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ Look๋ฒกํ„ฐ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

์ดˆ๋ก์ƒ‰ ํ™”์‚ดํ‘œ๋Š” ๋น„ํ–‰๊ธฐ์˜ Up๋ฒกํ„ฐ์ž…๋‹ˆ๋‹ค.

๋ถ‰์€ ์ƒ‰ ๊ผฌ๋ฆฌ ๊ธฐ์ค€์ธก์€ ๋น„ํ–‰๊ธฐ๊ฐ€ D3DXVECTOR3(0.f, 1.f, 0.f)์ถ• ๊ธฐ์ค€์œผ๋กœ ํšŒ์ „(์ขŒ์šฐ ํšŒ์ „), Right๋ฒกํ„ฐ๋กœ ํšŒ์ „(Pull up)ํ•  ๋•Œ ๊ฐ™์ด ํšŒ์ „ํ•˜๊ณ 

Look ๋ฒกํ„ฐ๊ฐ€ ํšŒ์ „ํ•  ๋•Œ๋Š” ๊ฐ™์ด ํšŒ์ „ํ•˜์ง€ ์•Š์•„ ๊ธฐ์ค€์ถ•์œผ๋กœ ์‚ผ์•„ ๋น„ํ–‰๊ธฐ๊ฐ€ roll ์ถ•์œผ๋กœ ์–ผ๋งˆ๋งŒํผ ํšŒ์ „ํ–ˆ๋Š”์ง€ ํŽธํ•˜๊ฒŒ ๊ณ„์‚ฐํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜...

๊ฐ๊ฐ 1ํšŒ์”ฉ ๋”ฐ๋กœ ํ”„๋ ˆ์ž„๋ณ„ ๋”ฐ๋กœ ๋™์ž‘ํ•˜๋ฉด ํฐ ๋ฌธ์ œ๋Š” ์—†์œผ๋‚˜ ๋™์‹œ์— ํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ ํšŒ์ „ ์‹œํ‚ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์กฐํ•ฉ์„ ํ•˜๋ฉด ํ•ญ์ƒ ๋ถ‰์€ ์ƒ‰ ๊ผฌ๋ฆฌ ๊ธฐ์ค€์ธก์ด ์ •์ƒ์ ์œผ๋กœ ๋น„ํ–‰๊ธฐ ๊ผฌ๋ฆฌ์— ๋ถ™์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


ย Look ๋ฒกํ„ฐ ํšŒ์ „ + Right๋ฒกํ„ฐ ํšŒ์ „(Pull up)

ย Look ๋ฒกํ„ฐ ํšŒ์ „ + D3DXVECTOR3(0.f, 1.f, 0.f)


์ง๋ฒŒ๋ฝ ํ˜„์ƒ๋„ ๊ณ ๋ฏผํ–ˆ๊ธด ํ–ˆ๋Š”๋ฐ ํšŒ์ „ ํ–‰๋ ฌ์•  x, y, z์ถ• ํšŒ์ „์„ ๋™์‹œ์— ๊ณฑํ•ด์„œ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹Œ๋ฐ ๋ฐœ์ƒํ•˜๋Š” ๊ฑด์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋กœ์ง๋„๊ฐ€

// Look ๋ฒกํ„ฐ ํšŒ์ „, Roll

if (๋งˆ์šฐ์Šค +x์ถ•)

m_pTransformCom->Turn(Look๋ฒกํ„ฐ, _fTimeDelta);

else if (๋งˆ์šฐ์Šค -x์ถ•)

m_pTransformCom->Turn(Look๋ฒกํ„ฐ, _fTimeDelta * -1.f);

// Right ๋ฒกํ„ฐ ํšŒ์ „, Pitch

if (๋งˆ์šฐ์Šค +y์ถ•)

m_pTransformCom->Turn(Right๋ฒกํ„ฐ, _fTimeDelta);

else if (๋งˆ์šฐ์Šค -y์ถ•)

m_pTransformCom->Turn(Right๋ฒกํ„ฐ, _fTimeDelta);

// ์ขŒ์šฐ ํšŒ์ „

if(๊ธฐ์ค€ ์ถ•์œผ๋กœ ๊ฐ๋„๊ฐ€ +- 20๋„ ๋ฒŒ์–ด์กŒ์„ ๋•Œ)

{

if (๋‚ ๊ฐœ๊ฐ€ ์™ผ์ชฝ์œผ๋กœ ํœ˜์—ˆ์„ ๋•Œ)

m_pTransformCom->Turn(D3DXVECTOR3(0.f, 1.f, 0.f), _fTimeDelta);

else if (๋‚ ๊ฐœ๊ฐ€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํœ˜์—ˆ์„ ๋•Œ)

m_pTransformCom->Turn(D3DXVECTOR3(0.f, 1.f, 0.f), _fTimeDelta * -1.f);

}


turn ํ•จ์ˆ˜ ๋‚ด๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. (์•„๋ž˜ ํ•จ์ˆ˜๋Š” Right ๋ฒกํ„ฐ ์ „์šฉ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.)

---

_float3 m_vZeroTailAxis = { 0.f, 1.f, 0.f }; // ๊ผฌ๋ฆฌ ๊ธฐ์ค€์ถ• ๋ฒกํ„ฐ ์ž…๋‹ˆ๋‹ค.

---


CTransform::Turn()

_float3 vRight = Get_State(STATE::STATE_RIGHT);
_float3 vUp = Get_State(STATE::STATE_UP);
_float3 vLook = Get_State(STATE::STATE_LOOK);

_float4x4 RotationMatrix;
D3DXMatrixRotationAxis(&RotationMatrix, &Get_State(CTransform::STATE_RIGHT), ๋ผ๋””์•ˆ ๊ฐ’);

D3DXVec3TransformNormal(&vRight, &vRight, &RotationMatrix);
D3DXVec3TransformNormal(&vUp , &vUp , &RotationMatrix);
D3DXVec3TransformNormal(&vLook , &vLook , &RotationMatrix);

D3DXVec3TransformNormal(&m_vZeroTailAxis, &m_vZeroTailAxis, &RotationMatrix); // ๊ผฌ๋ฆฌ ๊ธฐ์ค€์ถ•์„ ํšŒ์ „

Set_State(STATE::STATE_RIGHT, vRight);
Set_State(STATE::STATE_UP , vUp );
Set_State(STATE::STATE_LOOK , vLook );

์ด์™€ ๊ฐ™์ด ์ถ•๋งˆ๋‹ค ๋”ฐ๋กœ ๋”ฐ๋กœ ์ถ•๋งˆ๊ฐ€ ๊ณฑํ•ด์ฃผ๋Š”๋ฐ ๊ผฌ๋ฆฌ ํšŒ์ „์ถ•์ด 2๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ™์ด ์›€์ง์ผ ๋•Œ Look๋ฒกํ„ฐ๋กœ ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค.

์›ƒ๊ธด ๊ฒƒ์€ Right, D3DXVECTOR3(0.f, 1.f, 0.f)์œผ๋กœ ํšŒ์ „ํ•˜๋ฉด ์ œ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ๋กœ ๊ผฌ๋ฆฌ ๊ธฐ์ค€์ถ•์ด ์ •์ƒ์ ์œผ๋กœ ๋น„ํ–‰๊ธฐ ๊ผฌ๋ฆฌ ๋ถ€๋ถ„์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์ธ ๋ง๋กœ๋Š” ์ง๋ฒŒ๋ฝ์ด ์˜์‹ฌ๋œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ ์ด๊ฑด ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ๋ฒˆ ์ถ•์„ ํšŒ์ „ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฑธ๋กœ ์•Œ๊ณ  ์žˆ๋Š”๋ฐ ์ด๋Š” ํ•œ ์ถ• ํ•œ ์ถ• ํšŒ์ „ํ•˜๋Š”๊ฑด๋ฐ ๋ฌธ์ œ๊ฐ€ ๋˜๋‚˜์š”?