我需要根据特定深度(用于光线转换)将 2D 鼠标坐标转换为 3D 世界坐标。我没有直接在 C++ 中使用 DirectX,我使用的是专有语言,但如果你用 C++ 或伪代码(首选 C++)给我一个答案,我可以转换它。
我可以访问世界矩阵、 View 矩阵和投影矩阵以及各种矩阵操作函数。
如果需要将 vector4 乘以 matrix4,我唯一可用的同时接受 vector4 和 matrix4 的函数是 transformVector4(vector4Source,matrix4Source)
。如果重要的话,我不确定将它们相乘的顺序。
任何帮助将不胜感激:)我已经为此工作了几个小时,但我只是不懂 3D 数学......
最佳答案
要将您的鼠标转换为射线,您需要执行以下过程:
将鼠标坐标从像素坐标转换为 -1/1 坐标(-1,-1 为左下角)。
射线原点将是(近平面处的 vector )
vector3 origin = vector3(mousex,mousey,0);
射线端点为(远平面 vector )
vector3 far = vector3(mousex,mousey,1);
现在您需要对这些 vector 应用变换,首先您需要为其创建变换矩阵:
matrix4x4 inverseviewproj = invertmatrix(view * proj)
将此转换应用于两个 vector :
vector3 rayorigin = transform(origin, inverseviewproj);
vector3 rayend = transform(far, inverseviewproj);
你的光线方向是:
vector3 raydirection = normalize(rayend-rayorigin);
就是这样,现在您可以使用光线转换函数了。
如果您只能访问 vector4 以通过矩阵转换 vector , w 分量需要为 1,例如:
vector4 origin = vector3(mousex,mousey,0,1);
vector4 far = vector3(mousex,mousey,1,1);
要提取方向,请务必先将 vector4 转换为 vector3(否则会影响归一化)。
关于c++ - 3D 屏幕空间光线转换/拾取 DirectX9,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19150215/