3D 屏幕空间光线投射/拾取 DirectX9

3D Screenspace Raycasting/Picking DirectX9

本文关键字:拾取 DirectX9 光线投射 屏幕 空间 3D      更新时间:2023-10-16

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

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

如果需要将向量 4

乘以矩阵 4,我唯一可用的同时接受向量 4 和矩阵 4 的函数是 transformVector4(vector4Source,matrix4Source) 。如果这很重要,我不确定它会将它们乘以哪个顺序。

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

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

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

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

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

射线端是(远平面的矢量)

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

现在您需要对这些向量应用 TRANSFORM,首先需要为其创建转换矩阵:

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

要提取方向,请确保首先将向量4转换为向量3(否则会影响归一化)。