[과제 내용]
- 과제1을 Direct3D12를 사용하여 만들어라
+ 물체의 6면에 각각 다른 색을 넣고, 마우스로 피킹했을 때, 그 면의 색깔대로 파티클의 색을 바꾸도록 한다.
[후기]
처음에 했던 피킹도 어려웠는데 이걸 Direct의 렌더링으로 바꾸고 면의 색깔대로 파티클이 나오라고 해서 굉장히 힘들었었다.
//광선은 모델 좌표계로 표현된다.
XMVECTOR xmRayOrigin = XMLoadFloat3(&xmf3RayOrigin);
XMVECTOR xmRayDirection = XMLoadFloat3(&xmf3RayDirection);
float fNearHitDistance = 10000000;
float fHitDistance;
/*메쉬의 모든 프리미티브(삼각형)들에 대하여 픽킹 광선과의 충돌을 검사한다. 충돌하는 모든 삼각형을 찾아 광선의
시작점(실제로는 카메라 좌표계의 원점)에 가장 가까운 삼각형을 찾는다.*/
for (int i = 0; i < 36; i+=3)
{
// pVertices가 모델좌표임....;;
XMVECTOR v0 = XMVector3TransformCoord(XMLoadFloat3(&XMFLOAT3(pVertices[i].GetPos().x, pVertices[i].GetPos().y, pVertices[i].GetPos().z))
, XMLoadFloat4x4(&worldTransform));
XMVECTOR v1 = XMVector3TransformCoord(XMLoadFloat3(&XMFLOAT3(pVertices[i+1].GetPos().x, pVertices[i+1].GetPos().y, pVertices[i+1].GetPos().z))
, XMLoadFloat4x4(&worldTransform));
XMVECTOR v2 = XMVector3TransformCoord(XMLoadFloat3(&XMFLOAT3(pVertices[i+2].GetPos().x, pVertices[i+2].GetPos().y, pVertices[i+2].GetPos().z))
, XMLoadFloat4x4(&worldTransform));
//pVertices의 위치벡터와 월드변환을 곱해준다.
// v0 v1 v2는 삼각형 정점들의 위치벡터
BOOL bIntersected = TriangleTests::Intersects(xmRayOrigin, xmRayDirection, v0,v1, v2, fHitDistance); // 광선x삼각형 충돌검사
if (bIntersected) // 충돌했다면
{
if (fHitDistance < fNearHitDistance) // 거리를 잰다음에
{
idx = i;
fNearHitDistance = fHitDistance; // 가까운넘으로 초기화
}
}
}
if (-1 < idx&&idx < 6)
{
return RED;
}
else if (5 < idx&&idx < 12)
{
return BLUE;
}
else if (11 < idx&&idx < 18)
{
return GREEN;
}
else if (17 < idx&&idx < 24)
{
return MAGENTA;
}
else if (23 < idx&&idx < 30)
{
return YELLOW;
}
else if (29 < idx&&idx < 36)
{
return CYAN;
}
return 0;
'Direct3D12' 카테고리의 다른 글
[DirectX12] 렌더링 파이프라인 (0) | 2021.07.11 |
---|---|
[Direct3D12] 과제1 (0) | 2019.11.01 |