3D 屏幕空间光线投射/拾取 DirectX9
3D Screenspace Raycasting/Picking DirectX9
我需要根据特定深度将 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(否则会影响归一化)。
相关文章:
- 在 OpenGL 中使用透视与正交投影时的光线投射(鼠标拾取)
- Centos6 gcc6:编译简单的 c++11 测试文件时,默认的 ABI 不拾取
- 当我的程序不在焦点中时,不拾取 GetAsyncKeyState. 在游戏中不工作
- DIRECTX9 中自定义顶点的虚拟析构函数
- DirectX9 CreateOffscreenPlainSurface returns D3DERR_INVALIDC
- DirectX9 CreateVice()返回DLL_INVALIDCALL在注射DLL中进行VMT挂钩
- 为什么我的 for 循环无法拾取正确的错误?
- 基于慢速变换反馈的拾取
- 不带设备窗口的 DirectX9
- c ++ 如何在 while 循环中进行异常处理以拾取键入错误
- CAD程序的数据结构.鼠标拾取和渲染一个数据
- DirectX9 C++ - 在窗口最小化时加载纹理
- 无法从后缓冲区捕获数据(DirectX9)
- OpenGL彩色拾取器/变量或字段“ GlreadPixels”声明为void
- 打开GL彩色拾取器不是着色对象
- 为什么未经声明未从.cpp文件拾取模板函数的完整专业化
- VSPerf VS2010和其他分析工具没有拾取pdb
- Directx9:在 Ctrl+Alt+Del 之后重置设备
- 使用DirectX9的C++代理dll,如何旋转场景
- 3D 屏幕空间光线投射/拾取 DirectX9