ย ย
๋ค์ด๋ ํธ 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)์ผ๋ก ํ์ ํ๋ฉด ์ ๊ฐ ์ํ๋ ๋ฐ๋ก ๊ผฌ๋ฆฌ ๊ธฐ์ค์ถ์ด ์ ์์ ์ผ๋ก ๋นํ๊ธฐ ๊ผฌ๋ฆฌ ๋ถ๋ถ์ ๋ฌ๋ ค ์์ต๋๋ค.
์ง์ธ ๋ง๋ก๋ ์ง๋ฒ๋ฝ์ด ์์ฌ๋๋ค๊ณ ํ๋๋ฐ ์ด๊ฑด ํ ๋ฒ์ ์ฌ๋ฌ๋ฒ ์ถ์ ํ์ ํ ๋ ๋ฐ์ํ๋ ๊ฑธ๋ก ์๊ณ ์๋๋ฐ ์ด๋ ํ ์ถ ํ ์ถ ํ์ ํ๋๊ฑด๋ฐ ๋ฌธ์ ๊ฐ ๋๋์?
์ฌ์ง ์๋์์
ํค๋ฅผ ๋์์(์์ขor์ฐ)๋ฅผ ๋๋ ์๋ ๋ฐ์, ํค๋ฅผ ๋ฒ๊ฐ์๊ฐ๋ฉด์ ์์ข์์ข ํ์๋ ์๋ฐ์ํจ?
๋ด๊ฐ์๋ ์ง๋ฒ๋ฝ์ ํ๋ฒ์ ํ์ ์ํฌ๋ ์ง๋ฒ๋ฝ ๋ฐ์์ด ์๋๋ผ ์ค์ผ๋ฌ๊ฐ์ ์ฐ๋ํ ์ง๋ฒ๋ฝ์ ํ๋์ ํ์ ์ถ์ด ํ์ ํ์๋ ๋๋จธ์ง ์ถ์ด ์์ง์ด์ง ์๋ ํ์์ธ๋ฐ. ํ๋ ์์ด๋ ์๊ด์๋ ๊ทธ๋ฐ๊ฒ ์๋๊ฑธ๋ก ์
ํ ์ถ ํ ์ถ ํ์ ํด๋ ๋ฐ์ํด์
ใ ใ ์ง๋ฒ๋ฝ
์ง๋ฌธ์ด ์ฝ๊ฐ ํ๋ ค์ ์์ ์ ํ๋๋ฐ Look ๋ฒกํฐ ํ์ + Right๋ฒกํฐ ํ์ (Pull up) Look ๋ฒกํฐ ํ์ + D3DXVECTOR3(0.f, 1.f, 0.f)
DirectXํ์ง ๋๋ฌด ์ค๋๋์ ์ฝ๋๋ณด๋ฉด ๋ญ๊ฐ๋ชฌ์ง ํ๋๋ ๋ชจ๋ฅด๊ฒ ๊ณ . ๊ทผ๋ฐ ์ด๊ฒ ์ง๋ฒ๋ฝ ๋ฌธ์ ๋ผ๋๊ฑธ ๊ฝค ํ์ ํ๋ ์ด์ ๋
ํ๋์ ์ถ์ 90๋๋ก ๋๋ฆฌ๋ฉด, ๋จ์ ํ์ถ์ด ๊ทธ์ถ์ ์ ๋ ฌ์ด ๋๋ฒ๋ ค
์ด๊ฒ ๋ฒ์ด์ง๋ ์ด์ ๋ ์ค์ผ๋ฌ ํ์ ์ xyz์์ผ๋ก ๊ณฑํด์ ์ ์ฉํด์ ๊ทธ๋.
x๋ฅผ 90๋ ํ๋ฉด y๋ ํ์ ์ํ๋๋ฐ, z๊ฐ ์ง๋ฒ๋ฝ์ ๊ฑธ๋ ค์ x์ถ์ฒ๋ผ ํ์ ํด๋ฒ๋ฆฐ๋จ ๋ง์ด์ฌ.
https://www.youtube.com/watch?v=zc8b2Jo7mno
์์์
๋ด๋ฐ. ์ค๋ช ๋์์ผ๋๊น.
ใด ์ ์์๋ณด๋ฉด ์ดํด ๋ฐ๋ก๋ ๊บผ์ ๊ตณ๊ตณ
Right๋ฒกํฐ ํ์ (Pull up) + D3DXVECTOR3(0.f, 1.f, 0.f) ํ ๋๋ ๋ฌธ์ ๊ฐ ์์
์ง๋ฒ๋ฝ ๋ฌธ์ ๋ผ๋ฉด Right๋ฒกํฐ ํ์ (Pull up) + D3DXVECTOR3(0.f, 1.f, 0.f) ์์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํด์ผ ํ๋๋ฐ Look๋ฒกํฐ ํ์ ์กฐํฉ์ด ๋ค์ด๊ฐ๋ฉด ๊ธฐ์ค์ถ์ด ํ์ด์ง;;;;