Direct3D12

[Direct3D12] 과제2

태현123 2019. 11. 1. 11:47
728x90
반응형
SMALL

[과제 내용]

- 과제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;

 

반응형
LIST

'Direct3D12' 카테고리의 다른 글

[DirectX12] 렌더링 파이프라인  (0) 2021.07.11
[Direct3D12] 과제1  (0) 2019.11.01