행렬 관련 함수들.
-> 행렬을 항등행렬로 변환해주는 함수. 어려우면 단순 행렬의 초기 값(1)이라고 생각하면 좋다.
D3DXMatrixIdentity( D3DXMATRIX *pOut )
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
행렬의 크기 관련 함수.
행렬 관련 함수들 공통 - outPut으로 받은 행렬을 먼저 항등행렬로 변환후 연산을 수행.
X 0 0 0
0 X 0 0
0 0 X 0
0 0 0 1
각각 인자로 받은 XYZ에 값으로 비율대로 크기를 키워준다. (영향을 받는 원소는 11, 22, 33 번째)
D3DXMatrixScaling( D3DXMATRIX *pOut, FLOAT sx, FLOAT sy, FLOAT sz )
행렬의 회전 관련 함수 XYZ
행렬 관련 함수들 공통 - outPut으로 받은 행렬을 먼저 항등행렬로 변환후 연산을 수행.
D3DXMatrixRotationX( D3DXMATRIX *pOut, FLOAT Angle )
1 0 0 0
0 cos sin 0
0 -sin cos 0
0 0 0 1
인자로 받은 각도 값을 각각 22, 23, 32, 33 에 영향을 끼친다.
D3DXMatrixRotationY(D3DXMATRIX *pOut, FLOAT Angle)
cos 0 -sin 0
0 1 0 0
sin 0 cos 0
0 0 0 1
인자로 받은 각도 값을 각각 11, 13, 31, 33
D3DXMatrixRotationZ(D3DXMATRIX *pOut, FLOAT Angle)
cos sin 0 0
-sin cos 0 0
0 0 1 0
0 0 0 1
위치 관련 행렬 함수
행렬 관련 함수들 공통 - outPut으로 받은 행렬을 먼저 항등행렬로 변환후 연산을 수행.
D3DXMatrixTranslation( D3DXMATRIX *pOut, FLOAT x, FLOAT y, FLOAT z )
1 0 0 0
0 1 0 0
0 0 1 0
X Y Z 1
행렬을 사용하여 회전
Update()
행렬 곱셈은 앞에 행과 뒤에 열의 수가 같아야 한다.
그런데 벡터와 행렬을 곱하려고 하는데 앞에 행과 뒤에 열의 수가 맞지 않아서 행렬 곱셈이 성립이 안된다.
해결 방법은 다음 함수를 사용하면 된다.
D3DXVec3TransformCoord()
-> 위치벡터를 얻어내고 싶다면 사용하는 함수.
-> 이 함수는 벡터와 행렬을 곱셈할 때 마지막 원소에 w=1으로 계산한다.
-> 이러한 방식으로 D3DXVec3TransformCoord 함수를 다른 함수의 매개 변수로 사용할 수 있다.
위의 함수 말고도 다음과 같이 3D 벡터 법선을 주어진 행렬로 변환하는 함수가 있다.
D3DXVec3TransformNormal()
-> 방향벡터를 얻어내고 싶다면 사용하는 함수.
-> 이 함수는 벡터와 행렬을 곱셈할때 마지막 원소에 w =0으로 계산한다.
m_fAngle += 5.f;
D3DXMATRIX matScale, matRotZ, matTrans;
D3DXMatrixScaling(&matScale, 0.5f, 3.5f, 0.f);
D3DXMatrixRotationZ(&matRotZ, D3DXToRadian(m_fAngle));
D3DXMatrixTranslation(&matTrans, 400.f, 300.f, 0.f);
m_tInfo.matWorld = matScale * matRotZ * matTrans;
for (int i = 0 ; i < 4 ; ++i)
{
D3DXVec3TransformCoord(&m_vQ[i], &m_vP[i] , &m_tInfo.matWorld);
}
행렬의 곱셈의 순서는 중요하다.
반드시 크기(Scale) * 자전(RotZ) * 이동(Translate) * 공전(RevolutionRotZ) * 부모 순서를 지켜줘야 한다.
이번엔 공전을 해보자.
공전을 시키기 위해서는 공전할 행렬 한개, 부모 행렬 한개가 필요하다.
m_fAngle += 5.f;
D3DXMATRIX matScale, matRotZ, matTrans, matRevRotZ, matParent;
D3DXMatrixScaling(&matScale, 0.5f, 0.5f, 0.f);
D3DXMatrixRotationZ(&matRotZ, D3DXToRadian(m_fAngle));
D3DXMatrixTranslation(&matTrans, 100.f, 100.f, 0.f);
D3DXMatrixRotationZ(&matRevRotZ, D3DXToRadian(m_fAngle));
D3DXMatrixTranslation(&matParent, 400.f, 300.f, 0.f);
m_tInfo.matWorld = matScale * matRotZ * matTrans * matRevRotZ * matParent;
for (int i = 0 ; i < 4 ; ++i)
{
D3DXVec3TransformCoord(&m_vQ[i], &m_vP[i] , &m_tInfo.matWorld);
}
'Programming > DirectX 9' 카테고리의 다른 글
DirectX9 - 3DS MAX .x File Exporter & 멀티 애니메이션 만들기 (0) | 2021.04.11 |
---|---|
DirectX SDK 2010 June - c4005 매크로 재정의 에러 없애기 (0) | 2020.12.09 |
DirectX 9 - 벡터 관련 함수, 내적을 이용해서 마우스를 향해 이동 (0) | 2020.11.18 |
DirectX 9 - 회전 행렬 (0) | 2020.11.18 |
DirectX 9 설치 (0) | 2020.11.17 |