glm::unProject 问题,世界到屏幕空间对齐错误

Posted

技术标签:

【中文标题】glm::unProject 问题,世界到屏幕空间对齐错误【英文标题】:glm::unProject issues, world to screen space alignment error 【发布时间】:2013-03-29 18:17:49 【问题描述】:

我在 3D 空间中有一个平面,它面向我希望能够放置在与我单击的位置相同的位置的相机。但是,平面的位置超出了鼠标光标。这是一个动态的 GUI,我希望它能够移动并与 UI 上的小部件进行交互。

void mouse::unProjectMouse(float width, float height, camera* viewportCamera)

    if(NULL == viewportCamera)
    
        std::cout<<CNTRLCALL<<"camera failed! failed to un-project mouse";
     else 
        glm::vec4 viewport = glm::vec4(0, 0, width, height);
        glm::mat4 tmpView = viewportCamera->updateView();
        glm::mat4 tmpProj = viewportCamera->updateProjection();
        glm::vec3 screenPos = glm::vec3(mouseX, height-mouseY - 1.0f, 1.0f);

        glm::vec3 worldPos = glm::unProject(screenPos, tmpView, tmpProj, viewport);

        worldPos = worldPos / (worldPos.z * -1.0f);

        mouseWorldX = worldPos.x;
        mouseWorldY = worldPos.y;
        mouseWorldZ = worldPos.z;
    

我不知道为什么飞机没有正确对准鼠标。

【问题讨论】:

您是如何得出 screenPos.z 的 1.0f 值的?这是怎么回事? “worldPos = worldPos / (worldPos.z * -1.0f)”。没有必要搞乱 unProject 给你的东西。只要确保你的输入是正确的。 我将其保留为 1.0f,因为我没有 z 组件的输入,您会推荐什么是合适的输入。我还对 worldPos z 组件进行了更改,以在摄像机前获得 1 个单元,以进行测试。 z 组件在这里很重要,这就是导致 unProject 失败的原因。尝试将 z 设置为 0。此外,删除您正在执行的除法。这是不正确的。 这两件事我都做过。然而,unproject x 的范围仅在 [-49.x - -50] 之间,并且 y 仅在微小的小数位之间存在偏差。这仍然不能正确。还有什么建议吗? 感谢您的意见,我现在已经解决了。干杯 Aeluned 【参考方案1】:

这是解决方法:

  void mouse::unProjectMouse(float width, float height, camera* viewportCamera)

if(NULL == viewportCamera)

    std::cout<<CNTRLCALL<<"camera failed! failed to un-project mouse";
 else 


    glm::vec4 viewport = glm::vec4(0.0f, 0.0f, width, height);
    glm::mat4 tmpView = glm::lookAt(glm::vec3(viewportCamera->getCameraPosX(),viewportCamera->getCameraPosY(),viewportCamera->getCameraPosZ()),
                                    glm::vec3(viewportCamera->getForward().x,viewportCamera->getForward().y,viewportCamera->getForward().z),glm::vec3(0,1,0));
    glm::mat4 tmpProj = glm::perspective( 90.0f, width/height, 0.1f, 1000.0f);
    glm::vec3 screenPos = glm::vec3(mouseX, height-mouseY - 1, 0.0f);

    glm::vec3 worldPos = glm::unProject(screenPos, tmpView, tmpProj, viewport);

    mouseWorldX = worldPos.x;
    mouseWorldY = worldPos.y;
    mouseWorldZ = worldPos.z;



然后要将对象与光标位置对齐,相机的 Z 元素必须准确:

UIcamera->translateCameraX(0.0f);
UIcamera->translateCameraY(0.0f);
UIcamera->translateCameraZ(0.744f);

【讨论】:

以上是关于glm::unProject 问题,世界到屏幕空间对齐错误的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 射线 OBB 相交

glm::unProject 将鼠标位置转换为 3 个坐标

将 2d 屏幕位置投影到 3d 世界空间中

Unity Shaderlab-从屏幕空间到世界空间的转换

在 CUDA 中,如何在内核函数中将屏幕空间坐标转换为世界空间坐标

Unity - 如何在屏幕覆盖画布上方显示世界空间画布?