我需要根据特定深度(用于光线投射)将2D鼠标坐标转换为3D世界坐标。我不是直接在C ++中使用DirectX,我使用的是专有语言,但是如果你给我一个C ++或伪代码(C ++首选)的答案,我可以转换它。
我可以访问世界矩阵,视图矩阵和投影矩阵以及各种矩阵操作函数。
如果有必要将vector4乘以矩阵4,那么我唯一可用的函数是vector4和matrix4 transformVector4(vector4Source,matrix4Source)
。如果重要的话,我不确定它会增加它们的顺序。
任何帮助都会非常感激:)我已经工作了几个小时了,我只是没有得到3D数学......
答案 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(否则会影响规范化)。