빌보드
빌보드는 버퍼가 항상 카메라를 바라보도록 처리 하는 것이다.
항상 카메라를 바라봐야 하므로 이펙트 등을 처리할 때 효과적이다.
방법은 물체의 월드 행렬 회전 값(1행,2행,3행)에 카메라의 월드 행렬 회전 값(1,2,3행)을 넣어주면 된다.
카메라의 월드 행렬은 뷰 변환 행렬의 역행렬이다.
_float4x4 CameraWorldMatrix;
m_pGraphic_Device->GetTransform(D3DTS_VIEW, &CameraWorldMatrix);
D3DXMatrixInverse(&CameraWorldMatrix, nullptr, &CameraWorldMatrix);
m_pTransformCom->Set_State(CTransform::STATE_RIGHT, *(_float3*)&CameraWorldMatrix.m[0][0]);
m_pTransformCom->Set_State(CTransform::STATE_UP, *(_float3*)&CameraWorldMatrix.m[1][0]);
m_pTransformCom->Set_State(CTransform::STATE_LOOK, *(_float3*)&CameraWorldMatrix.m[2][0]);
지형 타기
지형을 타고 움직이기 위해서 물체가 지형의 어떤 부분에 있는지 먼저 알아야 한다.
2D API에서 사용한 타일 Picking을 이용하기 위해 물체의 월드좌표를 지형의 로컬 좌표계로 변환한다.
그렇게 하기 위해서 물체의 월드 좌표와 지형의 월드좌표의 역행렬(로컬 좌표)를 곱하면 된다.
_float3 vLocalPos;
_float4x4 OwnerWorldMatrixInv = *D3DXMatrixInverse(&OwnerWorldMatrixInv, nullptr, &OwnerWorldMatrix);
D3DXVec3TransformCoord(&vLocalPos, &vWorldPos, &OwnerWorldMatrixInv);
지금 몇번째 사각형 위에 있는지 구해야 하는데 API에서 타일 Picking에 썼던 식을 이용하자.
INDEX = (y좌표 / 타일의 y크기)* 한행의 타일개수 + (x좌표 / 타일의 x크기)
이 INDEX는 사각형 기준 왼쪽 아래 점의 INDEX를 나타내고, INDEX를 구하면 사각형의 네 점을 모두 구할 수 있다.
어떤 사각형 안에 있는지 확인했으면 물체의 위치와 INDEX의 좌표를 비교해 x값의 차이가 더 큰지,
y값의 차이가 더 큰지를 통해 왼쪽 아래 삼각형인지 오른쪽 위 삼각형인지를 판별한다.
/* 오른쪽 위 */
if (fWidth > fDepth)
{
//D3DXPlaneFromPointNormal();
D3DXPlaneFromPoints(&Plane, &m_pVerticesPos[iIndices[0]],
&m_pVerticesPos[iIndices[1]],
&m_pVerticesPos[iIndices[2]]);
}
/* 왼쪽 하단 */
else
{
D3DXPlaneFromPoints(&Plane, &m_pVerticesPos[iIndices[0]],
&m_pVerticesPos[iIndices[2]],
&m_pVerticesPos[iIndices[3]]);
}
D3DXPlaneFromPoints는 점 3개로 평면을 구해주는 함수이다. 어느 삼각형인지에 따라 그 평면을 Plane에 저장한다.
이제 vLocalPos의 x,z값을 평면의 방정식에 넣으면 vLocalPos의 y값(높이)를 구할 수 있다.
평면의 방정식은 ax + by + cz + d = 0인데 y = (-ax - cz - d) / b로 구할 수 있다.
앞서 구한 평면의 Plane의 a,b,c,d값이 모두 있으므로 x,z에 vLocalPos의 좌표를 넣어주면 된다.
마지막으로 구한 y값은 지형의 로컬좌표계 기준이므로 지형의 월드 변환행렬을 곱해주면 마침내 지형을 타게 된다.
'Today I Learned' 카테고리의 다른 글
| 23.06.12 - Cube Mapping, Skybox (0) | 2023.06.12 |
|---|---|
| 23.06.09 - Picking (0) | 2023.06.09 |
| 23.06.07 - SetSamplerState, MipMap(밉맵), 높이 맵 (0) | 2023.06.07 |
| 23.05.30 - 직교 투영 행렬 만들기 (0) | 2023.05.30 |
| 23. 05. 26 - 알파 블렌딩 vs 알파 테스트 (0) | 2023.05.26 |