[DX11 입문 제6장] 초보적인 질문 입니다. box예제서 마우스 이동에 따른 연산 관련.

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

Moderator: 류광

비회원

초보적인 질문 입니다. box예제서 마우스 이동에 따른 연산 관련.

Post by 비회원 »

안녕하세요. 질문이 너무 초보적이어도 이해해 주시면 감사하겠습니다.

6장 box예제 질문입니다.

아시겠지만, 예제를 실행하면 직육면체가 나오고 마우스 좌클릭상태서 움직이면 마우스 좌표 변화량을 계산해서
box를 회전시키는 예제입니다.

일단 우클릭이동시에 카메라 시점좌표와 box간의 거리계산은 어느정도 이해가 갑니다.
그런데 좌클릭 이동시...
void BoxApp::OnMouseMove(WPARAM btnState, int x, int y)
{
if( (btnState & MK_LBUTTON) != 0 )
{
// Make each pixel correspond to a quarter of a degree.
float dx = XMConvertToRadians(0.25f*static_cast<float>(x - mLastMousePos.x));
float dy = XMConvertToRadians(0.25f*static_cast<float>(y - mLastMousePos.y));

// Update angles based on input to orbit camera around box.
mTheta += dx;
mPhi += dy;

// Restrict the angle mPhi.
mPhi = MathHelper::Clamp(mPhi, 0.1f, MathHelper::Pi-0.1f);
}
....
}

처럼 각 x,y의 좌표의 변화량의 25%를 라디언 값으로 바꿔주는데.. 뭐 이것 까진 이해가 갑니다.
그런데..

void BoxApp::UpdateScene(float dt)
{
// Convert Spherical to Cartesian coordinates.
float x = mRadius*sinf(mPhi)*cosf(mTheta);
float z = mRadius*sinf(mPhi)*sinf(mTheta);
float y = mRadius*cosf(mPhi);

// Build the view matrix.
XMVECTOR pos = XMVectorSet(x, y, z, 1.0f);
XMVECTOR target = XMVectorZero();
XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);

XMMATRIX V = XMMatrixLookAtLH(pos, target, up);
XMStoreFloat4x4(&mView, V);
}
업데이트 될때 연산이 감이 잘 안오네요..
특히
float x = mRadius*sinf(mPhi)*cosf(mTheta);
float z = mRadius*sinf(mPhi)*sinf(mTheta);
float y = mRadius*cosf(mPhi);
이 세줄좀 제발 이해하고 싶은데 머리속에 잘 그려지지 않습니다.
mPhi는 마우스의 x좌표 변화량값이고, mTheta는 마우스y좌표 변화량 값인데,
이 값들의 sin,cos값을 곱한것이 최종적인 box의 각 정점들의 X좌표?가 되는 것이 이해가 안됩니다.


그리고 한가지 더 질문있습니다.
제가 책을 정독을 안해서 그런지... 최종적인 월드,뷰,프로젝트 변환 연산을 할때
각 행렬값을 곱하는 이유가 무엇인지요?...
왠지 너무 당연한걸 물어봐서 답변이 가능한 질문일까 생각도 들긴하는데..
어렴풋이 책에 행렬과 벡터의 곱셉연산 통해 최종 적인 변환 벡터좌표가 나오는 내용(?)을 봇 것 같습니다.



앞으로 질문을 많이 올릴 것 같습니다.
많은 답변 부탁드립니다.^^
류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Post by 류광 »

그 세 줄은 주석에도 있듯이 구면좌표계를 직교좌표계로 바꾸는 것입니다. mTheta는 mPhi 둘 다 마우스 좌표 변화량만큼의 '각도'이고, mRadius는 원점으로부터의 거리입니다.

삼차원 공간의 한 점을 x, y, z로 정의할 수도 있지만 방위각과 고도각, 그리고 원점과의 거리로도 정의할 수 있지요. 학창 시절에 배운 극좌표계의 3차원 버전이라고 생각하시면 금방 이해가 갈 것이고, 그 세 줄에 해당하는 수식을 스스로 유도하는 것도 가능할 것입니다.

마지막 질문은 이미 해결책을 알고 계시는 것 같은데요:) 관련 내용이 제3장과 제5장의 5.6절에 꽤 자세히 나옵니다.
비회원

Post by 비회원 »

답변 감사합니다.
구면좌표계 -> 직교좌표계...
각 x,y,z좌표에 대한 계산법이 아직 잘 모르겠지만... 좀 더 찾아보겠습니다.
그래도 답변이 큰 도움이 된 것 같습니다.
답변 너무 감사드립니다.^^
Post Reply