2014-01-23 3 views
0

저는 OpenGL과 관련된 작업을하고 있습니다. 지금까지 내가 GL_LINES를 사용하여 상상의 "테두리"를 그리는 뷰포트를 얻었습니다. 그것은 다음과 같은 setLookAt 세트로, 다음과 같습니다OpenGL - 자체 비전 회전?

Matrix.setLookAtM(mViewMatrix, 0, 0, 0, 5, 0, 0, 0, 0, 1, 0);

enter image description here

내 프러스 텀이 설정됩니다 Matrix.frustumM(mProjectionMatrix, 0, -2, 2, -2, 2, 1, 11); 그래서 나는 "큐브"내부 어딘가에 위치하고 있습니다.

지금 내가 성취하고자하는 것은 사용자가 주변을 둘러 보도록하는 것입니다. onTouchEvents를 캡처하여 렌더러에 x/y 방향의 움직임을 전달합니다. 내가하는 일은 터치 리스너로부터받은 특정 각도로 그려진 모든 선을 회전시키는 것입니다.

그것은 다음과 같습니다

enter image description here

그래서 큐브는 대신 그것에서 오는 어디 내가 모르는 어떤 점을 중심으로, 시청자 또는 눈 중앙을 중심으로 회전되지 않습니다.

내 문제는 : 뷰어의 중심/위치에서 개체를 어떻게 회전시킬 수 있습니까? setLookAtM에서 가져온 mViewMatrix을 회전해야합니까? 그렇다면 간단히 Matrix.setRotateM(mViewMatrix, ...)을 사용 하시겠습니까?

라인의 드로잉 방법은 다음과 같습니다 : 기능에서

public void draw(float[] mViewMatrix, float[] mProjectionMatrix) { 
    Matrix.multiplyMM(mViewProjectionMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0); 
    GLES20.glUseProgram(iProgId); 
    lineBuffer.position(0); 
    GLES20.glVertexAttribPointer(iPosition, 3, GLES20.GL_FLOAT, false, 0, lineBuffer); 
    GLES20.glEnableVertexAttribArray(iPosition); 

    colorBuffer.position(0); 
    GLES20.glVertexAttribPointer(iColor, 3, GLES20.GL_FLOAT, false, 0, colorBuffer); 
    GLES20.glEnableVertexAttribArray(iColor); 

    Matrix.setIdentityM(mModelMatrix, 0); 
    Matrix.rotateM(mModelMatrix, 0, rotX, 1, 0, 0); 
    Matrix.rotateM(mModelMatrix, 0, -rotY, 0, 1, 0); 
    Matrix.setIdentityM(mViewProjectionMatrix, 0); 
    Matrix.multiplyMM(mViewProjectionMatrix, 0, mViewMatrix, 0, mModelMatrix, 0); 
    //GLES20.glUniformMatrix4fv(iVPMatrix, 1, false, mMVPMatrix, 0); 

    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewProjectionMatrix, 0); 
    GLES20.glUniformMatrix4fv(iVPMatrix, 1, false, mMVPMatrix, 0); 


    //GLES20.glDrawElements(GLES20.GL_LINES, mVertices.length/2, GLES20.GL_UNSIGNED_SHORT, indexBuffer); 
    GLES20.glDrawArrays(GLES20.GL_LINES, 0, mVertices.length/2); 
} 
+0

"둘러보기"를 원할 경우보기 매트릭스를 회전해야합니다. – vbo

답변

1

보기는 3 개 정점, 눈 위치, 목표 위치 및 벡터까지 소요됩니다. 기본적으로 그것은 눈 위치에서 목표 위치를 바라 보는 것처럼 장면을 렌더링하기 위해 장면을 움직이는 매트릭스를 생성합니다. 당신의 예제에서 당신은 0,0,0에 있고 5, 0, 0을 보았습니다 (그래서 여러분은 + x 방향을보고 위로는 0, 1, 0으로 정의됩니다 (y 값이 높다는 것은 객체가 창 상단에 있음을 의미합니다). .) 대신에 그 상수를 사용

, 먼저 대상 벡터와 함께 작동하도록 어렵

float cameraX, cameraY, cameraY; 

. 카메라 위치를 정의, 그래서 대신에 당신이

보고있는 방향을 정의하는 각도를 사용
float angle; 

및이 각도를 사용하여 대상 벡터를 계산하십시오.

float targetX = cameraX + cos(angle); 
float targetY = cameraY; 
float targetZ = cameraZ + sin(angle); 

이제 카메라를 이동하려면 cameraX-Y-Z를 수정해야합니다. 앞으로 이동하려면 카메라를 대상 벡터쪽으로 이동해야합니다. 예를 들어 10 단위 전진.

targetX += cos(angle)*10; 
targetY += sin(angle)*10; 

대상 위치도 이동해야하기 때문에 대상 벡터를 다시 계산해야합니다.

역방향으로 이동하려면 대신 - = 연산자를 사용하십시오. 면을 이동하려면 그 계산에서 각도 PI/2를 추가하거나 제거해야합니다.

각도를 증가/감소시키는 것만으로 카메라를 회전시키고 대상 벡터를 다시 계산하려면.

이것은 매우 기본적인 카메라이며 위아래로 볼 수 없습니다. 위아래로 볼 수 있으려면 피치/요우 카메라를 사용해야합니다.

+0

도움 주셔서 감사합니다! 하지만 제대로 작동하지는 않습니다. onTouch 메소드에서, 나는 하나의 각도를 부여하기 위해 그것을 적용했다. (처음에는 위치 차이였다.) ACTION_DOWN : X/Y 위치를 저장, ACTION_MOVE : angle = atan2 (newX - oldX, newY - oldY); + cos (angle)과 + sin (angle)을 사용하여 스 니펫을 적용하려고했지만 값이 높을 때 즉시 +1000 또는 그 이상으로 올라 갔고 회전이 멈췄습니다. 지금은 화면의 터치 움직임에 따라 대상 벡터를 어떻게 움직여야할지 모르겠다. – damian