[DX11 입문 제14장] FPS 카메라 질문!

GPG 시리즈 관련 질답, 논의 공간.

Moderator: 류광

bigthewar
Posts: 5
Joined: 2014-06-29 21:21

FPS 카메라 질문!

Post by bigthewar »

http://www.youtube.com/watch?v=M8A1H7xW ... e=youtu.be

위의 동영상을 보시면 좌우 회전은 아무 문제 없이 되는데 상하 회전시 총이 저렇게 됩니다;;;

행렬 합성으로 해결해 보려고 노력해봤지만 원하는 결과과 나오질 않아 이렇게 질문을 올립니다.

제 생각에는 축이 문제인것 같아서 축을 먼저 이동시킨 뒤 회전을 하고 다시 원래 위치로 이동하여 좌우회전을 하고

이런식으로 행렬합성을 해봤지만 원하는 결과를 얻는데 실패했습니다.

아래는 소스 입니다.

총을 그리는 소스
// 스케일
XMMATRIX matScale = XMMatrixIdentity();
matScale = XMMatrixScaling(m_Scaling.x, m_Scaling.y, m_Scaling.z);

// 회전
XMMATRIX matRoation = XMMatrixIdentity();
matRoation *= XMMatrixRotationNormal(XMLoadFloat3(&XMFLOAT3(0.0f, 1.0f, 0.0f)), m_fRotAngleY);
matRoation *= XMMatrixRotationNormal(XMLoadFloat3(&vRight), m_fRotAngleX);

// 이동
XMMATRIX matTranslate = XMMatrixIdentity();
matTranslate = XMMatrixTranslation(m_Pos.x, m_Pos.y, m_Pos.z);

XMMATRIX matWorld = XMMatrixIdentity();
matWorld = matScale * matRoation * matTranslate;

XMStoreFloat4x4(&m_f4x4World, matWorld);
XMStoreFloat4x4(&m_f4x4ViewProj, matViewProj);
XMStoreFloat4x4(&m_f4x4WorldViewProj, matWorld * matViewProj);


카메라 뷰행렬을 계산하는 소스
XMVECTOR vRight = XMLoadFloat3(&m_vRight);
XMVECTOR vUp = XMLoadFloat3(&m_vUp);
XMVECTOR vLook = XMLoadFloat3(&m_vLook);
XMVECTOR vPosition = XMLoadFloat3(&m_vPosition);

// 룩벡터와 업벡터, 횡벡터를 정규직교화 한다.
vLook = XMVector3Normalize(vLook);
vUp = XMVector3Normalize( XMVector3Cross(vLook, vRight) );

// 룩벡터와 업벡터는 이미 정규화과 되어 있으므로 횡벡터를 정규화 할 필요가 없다.
vRight = XMVector3Cross(vUp, vLook);
vRight = XMVector3Normalize(vRight);

// 뷰행렬의 내용물을 설정한다.
XMStoreFloat3(&m_vRight, vRight);
XMStoreFloat3(&m_vUp, vUp);
XMStoreFloat3(&m_vLook, vLook);

m_f4x4View(0, 0) = m_vRight.x;
m_f4x4View(1, 0) = m_vRight.y;
m_f4x4View(2, 0) = m_vRight.z;
m_f4x4View(3, 0) = -m_fOffsetX;
//m_f4x4View(3, 0) = -XMVectorGetX(XMVector3Dot(vPosition, vRight));

m_f4x4View(0, 1) = m_vUp.x;
m_f4x4View(1, 1) = m_vUp.y;
m_f4x4View(2, 1) = m_vUp.z;
m_f4x4View(3, 1) = -XMVectorGetX(XMVector3Dot(vPosition, vUp));

m_f4x4View(0, 2) = m_vLook.x;
m_f4x4View(1, 2) = m_vLook.y;
m_f4x4View(2, 2) = m_vLook.z;
m_f4x4View(3, 2) = -m_fOffsetZ;

m_f4x4View(0, 3) = 0.0f;
m_f4x4View(1, 3) = 0.0f;
m_f4x4View(2, 3) = 0.0f;
m_f4x4View(3, 3) = 1.0f;

m_vPosition.x -= m_fOffsetX;
m_vPosition.z -= m_fOffsetZ;
vPosition = XMLoadFloat3(&m_vPosition);

XMFLOAT4X4 tempTranslateMatrix;
XMStoreFloat4x4(&tempTranslateMatrix, XMMatrixIdentity());
tempTranslateMatrix(3, 0) = -XMVectorGetX(XMVector3Dot(vPosition, vRight));
tempTranslateMatrix(3, 1) = 0.0f;
tempTranslateMatrix(3, 2) = -XMVectorGetX(XMVector3Dot(vPosition, vLook));;
tempTranslateMatrix(3, 3) = 1.0f;

XMMATRIX tempView = XMLoadFloat4x4(&m_f4x4View);
tempView *= XMLoadFloat4x4(&tempTranslateMatrix);
XMStoreFloat4x4(&m_f4x4View, tempView);
류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Post by 류광 »

FPS에서 총은 시선 방향과 무관하게 항상 고정된 위치에 나타나니 그냥 그대로 그리면 되지 않을까요?
bigthewar
Posts: 5
Joined: 2014-06-29 21:21

해결했습니다 ㅎ

Post by bigthewar »

제가 FPS 정석대로 안만들고 조금 다른 방식으로 만들고 있어서

총이 모델에 붙어 있다 보니까 총의 위치가 조금 애매해 졌었습니다.

현재는 카메라의 위치를 조정하여 해결하였습니다.
Post Reply