3D Screenspace Raycasting / Picking DirectX9

时间:2013-10-03 03:24:59

标签: c++ matrix 3d directx raycasting

我需要根据特定深度(用于光线投射)将2D鼠标坐标转换为3D世界坐标。我不是直接在C ++中使用DirectX,我使用的是专有语言,但是如果你给我一个C ++或伪代码(C ++首选)的答案,我可以转换它。

我可以访问世界矩阵,视图矩阵和投影矩阵以及各种矩阵操作函数。

如果有必要将vector4乘以矩阵4,那么我唯一可用的函数是vector4和matrix4 transformVector4(vector4Source,matrix4Source)。如果重要的话,我不确定它会增加它们的顺序。

任何帮助都会非常感激:)我已经工作了几个小时了,我只是没有得到3D数学......

1 个答案:

答案 0 :(得分:3)

要将鼠标转换为光线,请执行以下过程:

将鼠标坐标从像素坐标转换为-1/1坐标(-1,-1为左下角)。

射线原点将是(近平面处的矢量)

vector3 origin = vector3(mousex,mousey,0);

射线末端是(远处的矢量)

vector3 far = vector3(mousex,mousey,1);

现在你需要将变换应​​用于这些向量,首先需要为它创建变换矩阵:

matrix4x4 inverseviewproj = invertmatrix(view * proj)

将此转换应用于两个向量:

vector3 rayorigin = transform(origin, inverseviewproj);
vector3 rayend = transform(far, inverseviewproj);

您的光线方向是:

vector3 raydirection = normalize(rayend-rayorigin);

就是这样,现在你可以使用光线投射功能了。

如果你只能访问vector4来按矩阵变换矢量, w组件需要为1,例如:

vector4 origin = vector3(mousex,mousey,0,1);
vector4 far = vector3(mousex,mousey,1,1);

提取方向确保首先将vector4转换为vector3(否则会影响规范化)。