2012-01-08 3 views
2

2 차원 화면 위치를 3 차원 월드 공간으로 변환하는 다음 문제에 대해 glm maths 라이브러리를 사용하고 있습니다. 문제를 추적하기위한 시도에서2 차원 화면 위치를 3 차원 월드 공간에 투영하지 마십시오.

, 나는 다음에 코드를 단순화 :

float screenW = 800.0f; 
    float screenH = 600.0f; 
    glm::vec4 viewport = glm::vec4(0.0f, 0.0f, screenW, screenH); 
    glm::mat4 tmpView(1.0f); 
    glm::mat4 tmpProj = glm::perspective(90.0f, screenW/screenH, 0.1f, 100000.0f); 
    glm::vec3 screenPos = glm::vec3(0.0f, 0.0f, 1.0f); 
    glm::vec3 worldPos = glm::unProject(screenPos, tmpView, tmpProj, viewport); 

을 이제 GLM :: unProject이 경우 내가 worldPos가 될 것으로 기대 것 (0, 0, 1). 그러나 그것은 (127100.12, -95325.094, -95325.094)로 전달됩니다.

glm :: unProject가해야 할 일을 오해하고 있습니까? 나는이 함수를 추적 해 보았고, 잘 작동하는 것으로 보인다.

답변

3

screenPos의 Z 구성 요소는 깊이 버퍼의 값에 해당합니다. 따라서 0.0f는 가까운 클립 평면이고 1.0f는 먼 클립 평면입니다.

당신이 하나 개의 단위 화면에서 멀리는 세계의 POS를 찾으려면, 당신은 벡터 재조정 할 수 있습니다 : 0,0의 screenPos이의 왼쪽 하단 모서리를 지정하는 것도

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

주 화면에있는 반면, worldPos에서는 0,0이 화면의 중심입니다. 따라서 0,0,1은 -1.3333, -1, -1 및 400,300,1을 주어서 0,0, -1을 제공해야합니다.

+0

의미가 있습니다. 감사 – JimFing