2013-03-29 40 views
0

我在3D空间中有一架飞机,它面向相机,我希望能够放置在与单击位置相同的位置。但是,平面的位置会超出鼠标光标。这是一个动态GUI,我希望能够在UI上移动并与小部件进行交互。glm :: unproject问题,世界到屏幕空间对齐错误

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

Here we see the mapping from viewport coords to world coords

我很茫然这里,为什么飞机不能用鼠标正确对齐。

+1

你是如何在抵达screenPos.z的值为1.0f? 这是什么? “worldPos = worldPos /(worldPos.z * -1.0f)”。 有没有必要乱搞unproject回馈你的东西。只要确保你的输入是正确的。 – Aeluned

+0

我把它留作1.0f,因为我没有z组件的输入,你会推荐什么样的输入。我还对worldPos z组件进行了改动,以在相机前获得1个单元进行测试。 – GenericController

+0

z组件很重要,这就是导致你的unProject失败的原因。尝试将z设置为0.另外,删除您正在执行的部门。这是不正确的。 – Aeluned

回答

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