2011-11-07 2 views
3

gluUnProject에 픽셀의 winZ 값을 전달해야합니다. 주어진 픽셀에서 깊이 값을 읽는 데 필요한 winZ 값을 얻기 위해 이것은 정규화 된 z 좌표입니다.OpenGL ES 1에서 픽셀의 깊이를 읽는 방법은 무엇입니까? (화면의 픽셀의 Z 좌표)

그것을 할 수있는 방법은 C와 이것이다 : glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

문제는 내가 안드로이드 1.5 및 OpenGL ES 1 프로그래밍 해요 있다는 것입니다, 그때 GL_DEPTH_COMPONENTglReadPixels를 사용할 수있는 가능성이 없습니다.

화면의 픽셀 깊이는 어떻게 얻을 수 있습니까?

해결
+0

Android에서는 OpenGL 1.0이 아니라 OpenGL ES 1.x를 사용합니다. –

+0

무슨 뜻인가요? Android 1.5에서 ?? 좋아,하지만 여전히 같은 문제가있다 ... 어떻게 안드로이드 1.5 및 OpenGL ES 1.x에서 winZ 값을 얻을 수 있습니까? – NullPointerException

+0

아무도 이것으로 나를 도울 수 없습니까? – NullPointerException

답변

1

, 누군가가 길을 찾을 수 말해 경우는 OpenGL ES 1.x에서

에 그것을 단순히 불가능하지만 검색의 주 후에 나는 단순히 불가능하다고 생각합니다.

1

체크 아웃 내가 당신을 위해 무엇을 찾고 있다고 생각이 좋은 후 다음을 얻기 위해

private boolean unProject(float winx, float winy, float winz, 
         float[] modelMatrix, int moffset, 
         float[] projMatrix, int poffset, 
         int[] viewport, int voffset, 
         float[] obj, int ooffset) { 
float[] finalMatrix = new float[16]; 
float[] in = new float[4]; 
float[] out = new float[4]; 

Matrix.multiplyMM(finalMatrix, 0, projMatrix, poffset, 
    modelMatrix, moffset); 
if (!Matrix.invertM(finalMatrix, 0, finalMatrix, 0)) 
return false; 

in[0] = winx; 
in[1] = winy; 
in[2] = winz; 
in[3] = 1.0f; 

// Map x and y from window coordinates 
in[0] = (in[0] - viewport[voffset])/viewport[voffset + 2]; 
in[1] = (in[1] - viewport[voffset + 1])/viewport[voffset + 3]; 

// Map to range -1 to 1 
in[0] = in[0] * 2 - 1; 
in[1] = in[1] * 2 - 1; 
in[2] = in[2] * 2 - 1; 

Matrix.multiplyMV(out, 0, finalMatrix, 0, in, 0); 
if (out[3] == 0.0f) 
    return false; 

out[0] /= out[3]; 
out[1] /= out[3]; 
out[2] /= out[3]; 
obj[ooffset] = out[0]; 
obj[ooffset + 1] = out[1]; 
obj[ooffset + 2] = out[2]; 

return true; 
} 

: 가까운 멀리 벡터를 계산 할 수 있습니다

사용자 정의 GLunproject을 화면상의 점 x/y에 대한 3D 좌표는 니어와 원 클리핑 평면이있는 각 교차점에 대해 한 번만 새 메서드를 호출하면됩니다.

// near clipping plane intersection 
float[] objNear = new float[4]; 
unProject(screenX, screenY, 0.1f, 
     viewMatrix, 0, projectionMatrix, 0, view, 0, objNear, 0); 

// far clipping plane intersection 
float[] objFar = new float[4]; 
unProject(screenX, screenY, 1.0f, 
     viewMatrix, 0, projectionMatrix, 0, view, 0, objFar, 0); 

그런 다음 차이 벡터 (objFar - objNear)를 계산하고 3D 공간에서 화면 이벤트에 해당하는 위치를 확인할 수 있습니다. 이것은 두 벡터 사이의 거리를 찾는 데 사용하는 간단한 함수입니다.

public float distanceBetweenVectors(float[] vec1, float[] vec2){ 
    float distance = 0; 
    // Simple math 
    distance = (float) Math.sqrt(
      Math.pow((vec1[0]-vec2[0]), 2) + 
      Math.pow((vec1[1]-vec2[1]), 2) + 
      Math.pow((vec1[2]-vec2[2]), 2) + 
      Math.pow((vec1[3]-vec2[3]), 2) 
      ); 
    return distance; 

} 
+0

바라건대 이것은 무슨 뜻인가요;) – JY2k

관련 문제