2016-10-17 16 views
0

레이 캐스팅 계산에 많은 문제가있어 문제가 어디에 있는지 알 수 없습니다. 저는 벡터 등을 만들기 위해 DirectX의 수학 라이브러리를 사용하고 있습니다. 여기 DirectX11의 C++ - 레이 캐스팅

지금까지 내 코드입니다 : 내가 정규화 장치 좌표가 올바른지 확인했다

auto normalizedDeviceCoords = glm::vec2((float(a_frontend->GetMousePos().x)/float(a_frontend->GetWidth())) * 2.f - 1.f, 
             -((float(a_frontend->GetMousePos().y)/float(a_frontend->GetHeight())) * 2.f - 1.f)); 
auto mouseOrigin = DirectX::XMVectorSet(normalizedDeviceCoords.x, normalizedDeviceCoords.y, 0.0f, 1.0f); 
auto mouseEnd = DirectX::XMVectorSet(normalizedDeviceCoords.x, normalizedDeviceCoords.y, 1.0f, 1.0f); 

auto viewproj = DirectX::XMMatrixMultiply(a_frontend->GetViewMatrix(), a_frontend->GetProjMatrix()); 
auto determinant = DirectX::XMMatrixDeterminant(a_camera.ViewProj()); 
auto inverseviewproj = DirectX::XMMatrixInverse(&determinant, a_camera.ViewProj()); 
auto rayOrigin = DirectX::XMVector4Transform(mouseOrigin, inverseviewproj); 
auto rayEnd = DirectX::XMVector4Transform(mouseEnd, inverseviewproj); 
auto raySubtraction = DirectX::XMVectorSubtract(rayEnd, rayOrigin); 
auto rayDirection = DirectX::XMVector3Normalize(raySubtraction); 

auto planeNormal = DirectX::XMVectorSet(0.f, 1.f, 0.f, 0.f); 
auto pointOnPlane = DirectX::XMVectorSet(0.f, -0.1f, 0.f, 0.f); 

DirectX::XMFLOAT3 denominator; 
DirectX::XMStoreFloat3(&denominator, DirectX::XMVector3Dot(planeNormal, rayDirection)); 
if (fabs(denominator.x) <= 0.0001f) 
{ 
    return; 
} 

auto pointMinusRay = DirectX::XMVectorSubtract(pointOnPlane, rayOrigin); 

DirectX::XMFLOAT3 t; 
auto almostT = DirectX::XMVector3Dot(pointMinusRay, planeNormal); 
DirectX::XMStoreFloat3(&t, DirectX::XMVectorScale(almostT, 1.f/denominator.x)); 

if (t.x < 0) 
{ 
    return; 
} 

auto rayDirectionLength = DirectX::XMVector3Length(rayDirection); 
auto rayPoint = DirectX::XMVectorAdd(rayOrigin, DirectX::XMVectorScale(rayDirection, t.x)); 

, 광선 방향의 길이도 하나이며, 광선의 방향은 말할 어려운 (올바른 것으로 보인다 숫자 만).

모든 정보가 유용 할 것입니다. 이미 스택 오버플로 및 다른 포럼에서도 일부 정보를 살펴 봤지만 아무 것도받지 못했습니다.

+0

평면에있는 광선 점은 y 축에서만 정확하다는 것을 잊었습니다 (올바른 -0.1). x와 z 위치는 5 일 때 정확하지 않지만 0.1입니다. –

+0

이 테스트를 위해''DirectXCollision.h'' 함수를 사용해 보셨습니까? 또한''.cpp'' 파일에서''네임 스페이스 DirectX;를 사용하십시오. –

+0

그 머리글을 확인해보고 거기에 유용한 기능이 없는지 확인하십시오. Chuck에게 감사드립니다. 그러나 저는 이전 프로그래머가 코딩 스타일을 따라 코드를 유창하게하려고합니다. –

답변

0

팀 동료가이 문제를 해결할 수있었습니다. 그는 방금 DirectX 수학 함수 Vector3Unproject를 사용하기 시작했습니다. 이렇게하면 마우스 좌표를 가져 와서 원점과 끝점을 모두 사용하여 세계 좌표로 변환합니다 (z가 0이고 1이되도록 마우스 좌표를 취함). 그런 다음 이들을 빼서 세계 어딘가를 가리키는 벡터를 얻습니다. 우리는 그 방향을 카메라의 현재 y 위치를 방향 벡터 y의 음수로 나눈 값에 따라 변환 할 수있었습니다. 지금 우리가 가지고있는 코드는 모두 다음과 같습니다.

DirectX::XMVECTOR mouseNear = DirectX::XMVectorSet((float)a_mousePos.x, (float)a_mousePos.y, 0.0f, 0.0f); 
DirectX::XMVECTOR mouseFar = DirectX::XMVectorSet((float)a_mousePos.x, (float)a_mousePos.y, 1.0f, 0.0f); 
DirectX::XMVECTOR unprojectedNear = DirectX::XMVector3Unproject(mouseNear, 0, 0, a_width, a_height, a_nearZ, a_farZ, 
                   a_projection, a_view, DirectX::XMMatrixIdentity()); 
DirectX::XMVECTOR unprojectedFar = DirectX::XMVector3Unproject(mouseFar, 0, 0, a_width, a_height, a_nearZ, a_farZ, 
                   a_projection, a_view, DirectX::XMMatrixIdentity()); 
DirectX::XMVECTOR result = DirectX::XMVector3Normalize(DirectX::XMVectorSubtract(unprojectedFar, unprojectedNear)); 
DirectX::XMFLOAT3 direction; 
DirectX::XMStoreFloat3(&direction, result); 
return direction; 

//Get the distance to the ground. 
DirectX::XMFLOAT3 cameraPosition = a_camera.GetPosition(); 

//Get the point on the ground. 
cameraPosition.x += direction.x * (cameraPosition.y/-direction.y); 
cameraPosition.z += direction.z * (cameraPosition.y/-direction.y); 

이 코드는 앞으로 누군가에게 도움이되기를 바랍니다.