1

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

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

如果有必要将vector4乘以matrix4,我唯一可用的同时采用vector4和matrix4的函数是transformVector4(vector4Source,matrix4Source)。如果这很重要,我不确定它将它们乘以哪个顺序。

任何帮助将不胜感激:)我已经为此工作了几个小时,但我只是没有得到 3D 数学......

4

1 回答 1

5

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

将鼠标坐标从像素坐标转换为 -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 (否则会影响归一化)。

于 2013-10-03T07:18:10.787 回答