簡體   English   中英

C ++-使用DirectX11進行光線投射

[英]C++ - Ray Casting in with DirectX11

我的光線投射計算遇到很多麻煩,無法完全弄清問題出在哪里。 我正在使用DirectX的Math庫來創建向量等。

到目前為止,這是我的代碼:

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));

我檢查了規范化的設備坐標是否正確,射線方向的長度也為一,射線方向似乎是正確的(僅憑數字很難分辨)。

任何信息將是有用的。 我已經在這里查看了一些有關堆棧溢出和其他論壇的信息,但是卻一無所獲。

我的隊友能夠解決此問題。 他剛剛開始使用DirectX Math函數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);

希望這可能對將來的某人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM