2013-03-29 41 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);