首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ -射线铸造与DirectX11

C++ -射线铸造与DirectX11
EN

Stack Overflow用户
提问于 2016-10-17 12:41:22
回答 1查看 2K关注 0票数 0

我在光线投射的计算中遇到了很多麻烦,我不知道问题出在哪里。我正在使用DirectX的数学库来创建向量等等。

到目前为止,我的代码如下:

代码语言:javascript
运行
复制
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));

我已经检查过,归一化的设备坐标是正确的,射线方向的长度也是1,射线方向似乎是正确的(很难通过数字来判断)。

任何信息都是有用的。我已经在这里看过一些关于堆栈溢出和其他论坛的信息,而且没有得到任何信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-18 19:48:09

我的队友解决了这个问题。他刚刚开始使用DirectX数学函数Vector3Unproject。这将获取鼠标坐标,并将它们转换为世界坐标,同时使用原点和结束(因此,获取鼠标坐标的z值为0,然后取1)。然后互相减去这些,得到一个指向世界某处的向量。然后,我们可以根据摄像机当前的y位置,并将其转换为方向向量y的负数。下面是我们现在所有的代码:

代码语言:javascript
运行
复制
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);

希望这对将来的人有帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40086652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档