2016-08-16 4 views
0

OpenGL 라이브러리를 사용하여 3D Android 게임을 만들려고합니다. 내가 말할 수있는 것부터 안드로이드 플랫폼 (또는 OpenGL)은 카메라 객체를 제공하지 않기 때문에 스스로 만들었습니다. 나는 그 화면에 그려진 사각형을 만들 수 있었다. 나는 또한 카메라를 문제없이 3 방향으로 모두 움직이게 만들었다. 제가 가지고있는 문제는 x 또는 y 축에서 카메라를 돌리면 사각형이 매우 이상하게 표시됩니다. 그것은 그 관점을 왜곡 한 것처럼 보입니다. 여기 원점Android의 OpenGL에서 카메라의 순방향 벡터가 이상한 결과를 내고 있습니다.

카메라가 기대 일부 사진입니다 : 위치 [0,0,0.55f, 앞으로 [0, 0, -1]까지 [0,1,0]

No transformations on the camera, at the origin

카메라가 오른쪽으로 이동 : 위치 [3,0,0.55f, 앞으로 [0, 0, -1]까지 [0,1,0]

Camera moved to the right, so object to the left

카메라가 약간 오른쪽으로 설정 : 위치 [0,0,0.55f], 전달 [0.05f, 0, -1], 위쪽 [0,1,0]

Camera turned to the right, while at the origin

어디서 문제가 발생하는지 잘 모르겠습니다. 다음은 정사각형의 꼭지점입니다.

static float vertices[] = { 
     // Front face (CC order) 
     -1.0f, 1.0f, 1.0f, // top left 
     -1.0f, -1.0f, 1.0f, // bottom left 
     1.0f, -1.0f, 1.0f, // bottom right 
     1.0f, 1.0f, 1.0f, // top right 
}; 

내가 읽은 바로는 행렬 곱셈의 순서가 정확합니다. 나는 버텍스 쉐이더로 행렬을 전달하고 거기에 곱셈을 수행

private final String vertexShaderCode = 
     "uniform mat4 uVMatrix;" + 
     "uniform mat4 uMMatrix;" + 
     "uniform mat4 uPMatrix;" + 
     "attribute vec4 aVertexPosition;" +  // passed in 
     "attribute vec4 aVertexColor;" + 
     "varying vec4 vColor;" + 
     "void main() {" + 
     " gl_Position = uPMatrix * uVMatrix * uMMatrix * aVertexPosition;" + 
     " vColor = aVertexColor;" + // pass the vertex's color to the pixel shader 
     "}"; 

모델 매트릭스 그냥 원점을 이동하고 1을 확장한다 :

Matrix.setIdentityM(ModelMatrix, 0); 
Matrix.translateM(ModelMatrix, 0, 0, 0, 0); 
Matrix.scaleM(ModelMatrix, 0, 1, 1, 1); 

을 나는 업데이트 내 카메라 객체를 사용하여 보기 매트릭스 :

float ratio = width/(float) height; 

Matrix.frustumM(ProjectionMatrix, 0, -ratio, ratio, -1, 1, 0.01f, 10000f); 
01 : 여기

Matrix.setLookAtM(ViewMatrix, 0, 
      position.x, position.y, position.z, 
      position.x + forward.x, position.y + forward.y, position.z + forward.z, 
      up.x, up.y, up.z); 

내 ProjectionMatrix입니다

무엇이 누락 되었습니까?

답변

1

는 :

Matrix.frustumM(ProjectionMatrix, 0, -ratio, ratio, -1, 1, 0.01f, 10000f); 

당신은 매우 강한 관점을 가지고있다. 이것이 기하학적 형상을 약간만 돌리 자마자 매우 왜곡 된 모양이되는 이유입니다.

는 상부 값 가까운 클립면의 깊이에서 측정 된 거리이다 오른쪽, 바닥를 떠났다.따라서 예를 들어 의 경우 값이 1.0이고, 값이 0.01 인 경우보기 볼륨의 상단 평면은 0.01의 거리에서보기 방향에서 1.0 거리로 이동합니다.

수학을 수행하면 세로보기 각도의 절반에 대해 atan (1.0/0.01) = atan (100.0) = 89.42도 또는 전체보기 각도에 대해 178.85 도가됩니다. 극단적 인 물고기 눈 lense 카메라 앞에서 거의 모든 공간을 덮고 카메라에.

보다 수준의 원근감을 사용하려면 원하는보기 각도를 기준으로 값을 계산할 수 있습니다. 관점 대체로 만족스러운 양 45 내지 60 도의 범위의 시야각과

float near = 0.01f; 
float top = tan(0.5f * alpha) * near; 
float right = top * ratio; 
Matrix.frustumM(ProjectionMatrix, 0, -right, right, -top, top, near, 10000f); 

시작 : 알파 수직 시야각되면서. 그리고 위에서 사용 된 tan() 함수는 라디안 단위의 각도를 사용하므로 원래 각도가도 단위 인 경우 먼저 변환해야합니다.

또는 수학을 두려워한다면 항상 perspectiveM()을 사용할 수 있습니다. ;)

1

설정에 따라 정점 버퍼가 잘못되었을 수 있습니다. 정점 배열은 vec3입니다. 그리고 쉐이더의 속성 위치는 vec4입니다.

또한 투영 행렬은 이상한 결과를 초래할 가로 세로 비율에 따라 이상합니다.

대신 perspectiveM을 사용해야합니다. 당신이 frustrumM()에 전달하는 매개 변수와

+0

정점 배열은 vec3이고 쉐이더는 vec4입니다. Android 튜토리얼을 따르고 3D에서 모양을 회전하면 문제가 없으므로 그 자체가 문제가되는 사각형이라고 생각하지 않습니다 – robev

+0

As 튜토리얼은 3D 게임을 할 때 frustumM을 사용한다고 말했고, 이것들은 그것을 제공하는 매개 변수입니다. perspectiveM을 테스트 할 것입니다.하지만 아무것도 변경하지 않을 것이라고 생각합니다. – robev

+0

perspectiveM이 작동했습니다. t 절두체? https://developer.android.com/training/graphics/opengl/projection.html 사용을 말합니다 ... – robev

관련 문제