0

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

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;
    }
}

在这里,我们看到了从视口坐标到世界坐标的映射

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

4

1 回答 1

0

这是修复:

  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);
于 2013-03-29T22:07:59.630 回答