레이 캐스팅 계산에 많은 문제가있어 문제가 어디에 있는지 알 수 없습니다. 저는 벡터 등을 만들기 위해 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));
, 광선 방향의 길이도 하나이며, 광선의 방향은 말할 어려운 (올바른 것으로 보인다 숫자 만).
모든 정보가 유용 할 것입니다. 이미 스택 오버플로 및 다른 포럼에서도 일부 정보를 살펴 봤지만 아무 것도받지 못했습니다.
평면에있는 광선 점은 y 축에서만 정확하다는 것을 잊었습니다 (올바른 -0.1). x와 z 위치는 5 일 때 정확하지 않지만 0.1입니다. –
이 테스트를 위해''DirectXCollision.h'' 함수를 사용해 보셨습니까? 또한''.cpp'' 파일에서''네임 스페이스 DirectX;를 사용하십시오. –
그 머리글을 확인해보고 거기에 유용한 기능이 없는지 확인하십시오. Chuck에게 감사드립니다. 그러나 저는 이전 프로그래머가 코딩 스타일을 따라 코드를 유창하게하려고합니다. –