Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将光线从屏幕投影到模型以进行拾取_C++_Qt_Opengl_3d_Matrix Multiplication - Fatal编程技术网

C++ 将光线从屏幕投影到模型以进行拾取

C++ 将光线从屏幕投影到模型以进行拾取,c++,qt,opengl,3d,matrix-multiplication,C++,Qt,Opengl,3d,Matrix Multiplication,我正在尝试从屏幕上的鼠标点击位置投射光线,并将其转换为模型空间以进行三角形相交测试。我确信交集代码工作得很好,我理解取消光线投射背后的理论。但是我的代码不起作用。我已经为同一个基本思想尝试了几个实现,我得到的结果似乎到处都是 下面的代码中是否缺少一些基本信息 // 1. Convert x, y from screen to normalized device coordinates [-1:1] auto screenPos = pick->position(); float

我正在尝试从屏幕上的鼠标点击位置投射光线,并将其转换为模型空间以进行三角形相交测试。我确信交集代码工作得很好,我理解取消光线投射背后的理论。但是我的代码不起作用。我已经为同一个基本思想尝试了几个实现,我得到的结果似乎到处都是

下面的代码中是否缺少一些基本信息

 // 1. Convert x, y from screen to normalized device coordinates [-1:1]
auto screenPos = pick->position();    
float x = (2.0f * screenPos.x()) / Viewer::window()->width() - 1.0f;
float y = 1.0f - (2.0f * screenPos.y()) / Viewer::window()->height();

// 2. Create a ray xy coordinates with a z pointing forward
QVector3D ray = QVector3D(x, y, -1.0f);

// 3. Convert from device space to view space using inverted projection matrix
QMatrix4x4 projectionMatrix = Viewer::window()->camera()->projectionMatrix();
ray = ray * projectionMatrix.inverted();

// 4. Convert from view space to world space using inverted view matrix
QMatrix4x4 viewMatrix = Viewer::window()->camera()->viewMatrix();
ray = ray * viewMatrix.inverted();
ray.normalize();

// 5. Convert from world space to object space using object transformation matrix
QMatrix4x4 modelMatrix = this->transform()->matrix();
ray = ray * modelMatrix.inverted();
ray.normalize();

// 6. Get camera position for ray origin and transform it to object coordinates
QVector3D camera_pos = Viewer::window()->camera()->position();
QVector3D origin = camera_pos * modelMatrix.inverted();

// 7. Find intersections
auto intersection = testRay(mesh.get(), origin, ray);

我认为你应该从左边乘上倒数,因为:out_vertex=projection*view*model*in_vertex你的
网格
有没有可能不在全局坐标中?否则代码看起来没问题……我认为你应该从左边乘上倒数,因为:out_vertex=projection*view*model*in_vertex你的
网格
是否不在全局坐标中?代码看起来没问题,否则。。。