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

C++ 3D屏幕空间光线投射/拾取DirectX9,c++,matrix,3d,directx,raycasting,C++,Matrix,3d,Directx,Raycasting,我需要根据特定深度将二维鼠标坐标转换为三维世界坐标(用于光线投射)。我不是直接使用DirectX在C++中,我使用的是专有语言,但是如果你给我一个答案C++或pseudocode(C++优先),我可以转换它。 我已经获得了世界矩阵、视图矩阵和投影矩阵以及各种矩阵操作功能 如果需要将向量4与矩阵4相乘,我唯一可用的同时使用向量4和矩阵4的函数是transformVector4(vector4Source,matrix4Source)。如果这有关系的话,我不确定它们的倍数是多少 任何帮助都将不胜感激

我需要根据特定深度将二维鼠标坐标转换为三维世界坐标(用于光线投射)。我不是直接使用DirectX在C++中,我使用的是专有语言,但是如果你给我一个答案C++或pseudocode(C++优先),我可以转换它。 我已经获得了世界矩阵、视图矩阵和投影矩阵以及各种矩阵操作功能

如果需要将向量4与矩阵4相乘,我唯一可用的同时使用向量4和矩阵4的函数是
transformVector4(vector4Source,matrix4Source)
。如果这有关系的话,我不确定它们的倍数是多少


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

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

将鼠标坐标从像素坐标转换为-1/1坐标(-1,-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);

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

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

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

首先计算相机的光线对眼睛坐标(使用一些触发器)然后,将该光线与相机的modelview矩阵的倒数相乘,将其转换为世界坐标。@yngum:将目标对象坐标转换为屏幕空间(这已经是为了渲染目的而做的)更容易,并在2D中进行命中测试。@BenVoigt是的,我想这也行得通。op要求世界坐标,所以我想到了我自己一直在做的直截了当的方式。我一点也不知道如何做第一个评论答案。你能再详细一点吗?具体点?我不知道目标对象的坐标(这就是我试图计算的),我也无法访问低级渲染的内容。此外,我需要有一个起点(只是相机的位置)和一个终点,它必须是3D光线投射。我有用于光线投射本身的工具,只是不用于计算鼠标光标在3D中的位置@yngum的想法是正确的,只是没有解释清楚。谢谢:)@Clonkex答案有点长,因为我不确定你对3d转换的理解。你应该用谷歌搜索一下,这是一个常见的问题,应该有很多教程。例如,首先计算相机的光线对眼睛坐标(使用一些触发器),然后通过与相机的modelview矩阵的倒数相乘,将该光线转换为世界坐标。@yngum:将目标对象坐标转换为屏幕空间更容易(无论如何,这已经用于渲染目的),在2D中进行命中测试。@BenVoigt是的,我想这也行。op要求世界坐标,所以我想到了我自己一直在做的直截了当的方式。我一点也不知道如何做第一个评论答案。你能再详细一点吗?具体点?我不知道目标对象的坐标(这就是我试图计算的),我也无法访问低级渲染的内容。此外,我需要有一个起点(只是相机的位置)和一个终点,它必须是3D光线投射。我有用于光线投射本身的工具,只是不用于计算鼠标光标在3D中的位置@yngum的想法是正确的,只是没有解释清楚。谢谢:)@Clonkex答案有点长,因为我不确定你对3d转换的理解。你应该用谷歌搜索一下,这是一个常见的问题,应该有很多教程。好极了!谢谢你!这就是我要找的!干净、清晰、切中要害。而且它有效!非常高兴,非常感谢什么时候世界发生了变化?太好了!谢谢你!这就是我要找的!干净、清晰、切中要害。而且它有效!非常高兴,非常感谢什么时候世界发生了变化?