c++ - 3D 屏幕空间光线转换/拾取 DirectX9

标签 c++ matrix 3d directx raycasting

我需要根据特定深度(用于光线转换)将 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/

相关文章:

c++ - 如何使用 WriteProcessMemory (WPM) 替换字符串?

c# - 如何在给定的持续时间内从 0..1..0..1..0 等创建脉动值?

css 3dscale(x,y,z) 没有按预期工作

javascript - 三JS : Simple City Performance Issue

math - 学习游戏编程(第 2 部分)(数学)

c++ - 来自发布的调试差异的结果

c++ - 什么是 __pragma 以及 __pragma 和 #pragma 之间的区别是什么

matlab - 通过重复重叠向量创建矩阵

c# - 如何反转 4x4 矩阵的 y 坐标?

python - 为什么这两种查找特征向量的方法在 python 中不同?