2011-04-06 4 views
0

평면 3D 표면에서 마우스의 좌표를 찾으려고합니다. 약간의 인터넷 검색을 한 후, 나는 당신이 그렇게하기 위해 gluUnProject를 사용한다는 것을 알았다. 그래서 구현했습니다. 여기 내 코드는 (흥미하지 않은 부품에 촬영시) :gluUnProject()가 작동하지 않는 이유는 무엇입니까?

public class Input { 
private FloatBuffer modelView = BufferUtils.createFloatBuffer(16); 
private FloatBuffer projection = BufferUtils.createFloatBuffer(16); 
private IntBuffer viewport = BufferUtils.createIntBuffer(16); 
private FloatBuffer location = BufferUtils.createFloatBuffer(3); 
private FloatBuffer winZ = BufferUtils.createFloatBuffer(1); 

public float[] getMapCoords(int x, int y) 
{ 
    modelView.clear().rewind(); 
    projection.clear().rewind(); 
    viewport.clear().rewind(); 
    location.clear().rewind(); 
    winZ.clear().rewind(); 

    glGetFloat(GL_MODELVIEW_MATRIX, modelView); 
    glGetFloat(GL_PROJECTION_MATRIX, projection); 
    glGetInteger(GL_VIEWPORT, viewport); 

    float winX = (float)x; 
    float winY = (float)viewport.get(3) - (float)y; 

    glReadPixels(x, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, winZ); 
    gluUnProject(winX, winY, winZ.get(0), modelView, projection, viewport, location); 
    return new float[] {location.get(0), location.get(1), location.get(2)}; 
} 
} 

나는 X에 전달이 함수를 호출하고 Y는 마우스 좌표, 나는 모든 100 증가 몇 가지 숫자를 얻을 수를 pixel 마우스로 움직입니다 (약 1이어야합니다). 다양한 변수에서 인쇄를 한 후 winZ 버퍼에 값 1.0이 있음을 알았습니다. 내 gluPerspective는 가까운 클리핑이 0.1에 해당하고 10000에 먼 지점을 가리키는 방식으로 설정되므로 숫자가 빠르게 증가하는 이유를 설명 할 수 있습니다. 그러나 OpenGl이이 거리를 찾기 위해 대신 내 평면을 사용하도록하는 방법을 알지 못합니다.

그래서 지금 궁금합니다. 이것이 3D 세계의 표면에서 마우스 좌표를 찾는 올바른/최선/가장 쉬운 방법이라면 무엇을 잘못 할 수 있습니까? 그것이 아니라면, 그것을하는 더 좋은 방법은 무엇입니까?

답변

0

예. 올바른 방법입니다. 행렬에 "좋은 값"(코드에서 glPush/PopMatrix() 함수로 인해 발생할 수 있음)이 포함되지 않은 지점에서 호출하는 것일 수 있습니다.

좋은 좌표를 얻고 있는지 확인하려면 얻은 좌표에서 단일 GL_POINT를 그립니다 (깊이 테스트를 비활성화하고 포인트 크기를 10 픽셀로 늘립니다). 점이 마우스 아래에서 움직이는 경우 계산 된 좌표는 정확하지만 행렬은 정확하지 않습니다.

+0

나는 그것을 꽤 오래 전에 실제로 풀었다. 어떻게 실제로 기억하지만, 어쨌든 몇 가지 명성을 가지고 :) – Bartvbl

+0

감사합니다 :) 다음에 다른 사람들을위한 솔루션을 게시하려고합니다. 또한 귀하의 질문에 "대답 함"으로 표시하고 답변이없는 질문 목록에서 제거하는 것이 좋습니다. –

관련 문제