2012-05-14 2 views
0

내 응용 프로그램은 android에서 openGL ES 2.0으로 만들어졌으며 개체 위치 업데이트에 다소 심각한 문제가 있습니다. 내 게임 루프는 다음과 같습니다. 모든 오브젝트 그리기 -> 게임 개체 위치 업데이트 -> 반복. 그러나, 나는 두 종류의 위치 업데이트를 가지고 있습니다 : 하나의 종류는 계산 기반입니다. 값이 낮거나 충분히 높으면 방향이 바뀔 것입니다. 다른 종류는 터치 기반입니다. 사용자가 어떤 위치에서든 터치하거나 화면을 스 와이프하면 개체가 따라옵니다.Android openGL es 2.0 터치 및 개체 위치 버그 ... 단서

문제가 생겼습니다. 사용자가 화면 및/또는 스 와이프를 터치하면 터치에 반응하는 것으로 간주되는 객체도 계산 기반 객체의 x 값이 변경되며, 다른 위치 변수를 사용하기 때문에 왜 그런지 모릅니다. .

여기 다음 터치 위치 값이 GL 렌더러

public boolean onTouchEvent(MotionEvent e){ 
    if(e != null){ 
     if(e.getAction() == MotionEvent.ACTION_DOWN){ 
      x = e.getX(); 
      y = e.getY(); 
      if(_renderer != null){ 
       queueEvent(new Runnable(){ 

        @Override 
        public void run() { 

         _renderer.touchInput(x, y); 
        } 

       }); 
       return true; 
      } 
     } 
     if(e.getAction() == MotionEvent.ACTION_MOVE){ 
      x = e.getX(); 
      y = e.getY(); 
      if(_renderer != null){ 
       queueEvent(new Runnable(){ 

        @Override 
        public void run() { 

         _renderer.touchInput(x, y); 

        } 

       }); 


      } 

     } 

여기 따르는 코드에 전달되는 방법을 도시 한 GLsurfaceView 발췌 한 코드가 어떻게 보여 GL 렌더러에서 발췌 터치 값은 렌더러에 입력되고 월드 좌표로 변환됩니다.

public void touchInput(float x, float y){ 
    y = (float)_view[3] - y; 
    GLU.gluUnProject(x, y, -1.5f, _ModelMatrix, 0, _ProjectionMatrix, 0, _view, 0, touch_to_world_coords, 0); 

    _world_x = touch_to_world_coords[0] * touch_to_world_coords[3]; 
    _world_y = touch_to_world_coords[1] * touch_to_world_coords[3]; 
} 

다음은 비 터치 객체

public void updateObjectCoords(){ 
    _test_x += 0.05f; 
      _test_y += 0.05f; 
} 

마침내 게임 루프로 사용 메신저 렌더러에서 onDrawFrame의 새로운 위치를 계산하는 코드이다.

public void onDrawFrame(GL10 glContext) { 
    //Tell OpenGL to use this program when rendering. 
    GLES20.glUseProgram(_current_shaderProgramHandle); 

    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); 

    //Sets the active texture unit to texture unit 0 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    //Bind the texture to current unit 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, _TextureDataHandle); 

    //Tells texture uniform sampler to use this texture in the shader by binding it to unit 0 
    GLES20.glUniform1i(_TextureUniformHandle, 0); 

    //Draw square, gets coordinates from gluUnproject method 
    Matrix.setIdentityM(_ModelMatrix, 0); 
    Matrix.translateM(_ModelMatrix, 0, _world_x, _world_y, -1.0f); 
    drawSquare(); 

    //Draw square, gets coordinates from updateObjectCoords method 
    Matrix.setIdentityM(_ModelMatrix, 0); 
    Matrix.translateM(_ModelMatrix, 0, _test_x, _test_y, -1.0f); 
    drawSquare(); 


    //GLES20.glUseProgram(_point_shaderProgramHandle); 
    //drawLight(); 
    updateObjectCoords(); 

} 

편집 : IM이 대신 :) 때 발생하는 더 명확하게하기 위해 추가 그래서 내 나쁜 explenations을 발견

(큐브 1 2 updateObjectCoords에서 좌표를 얻는다 터치 입력 및 큐브지면) : 응용 프로그램 시작 : 예상대로 모든 작업을 큐브 2 (updateObjectCoords 하나) 예상대로 이동합니다. 사용자가 화면을 터치합니다 : cube2가 계속 움직이면서 cube1 (터치 제어) 좌표 데이터가 cube2와 섞여 보이는 것처럼 보입니다. 그 움직임이 겉으로보기에는 두 배나 커지고 cube2와 같은 방향으로 바뀌기 때문에 여전히 cube2를 조작 할 수 있습니다 조금 있지만 매우 반응이 없습니다.

은 (Cube2 정적으로 구성되어, 그러나 updateObjectCoords은 ​​여전히 ​​활성화되고 _test_x 및 _test_y의 값을 업데이트하는 모든 프레임에서 호출됩니다) : 응용 프로그램 시작 : 모든 : 모든 것이 예상 사용자가 화면을 터치하는 것처럼입니다 완벽하게 작동합니다

그래서 cube1의 위치를 ​​방해하는 것은 계속해서 큐브 2를 재배치 한 것으로 보입니다.

희망 사항이 더 명확하게 표시되기를 바랍니다. :)

왜 한 개체의 좌표가 그 밖의 모든 개체에 영향을 미칩니 까? 어떻게 다른 모든 물체가 터치 좌표에 영향을받지 않습니까?

+0

OpenGL ES 2에 익숙하지 않습니다.0이지만 이전 버전의 OpenGL에서는 모델 변환을 적용하기 전에 현재 View Matrix (스택에 푸시)를 저장해야한다는 것을 알고 있습니다. 스택으로 푸시 한 후 모델 변형을 적용한 다음 모델을 그립니다. 작업이 끝나면 행렬을 스택 밖으로 가져옵니다. 모든 개체에 대해 반복하십시오. 짜증나지만 OpenGL은 상태 머신입니다. – dcow

+0

댓글에 대한 고마워요, 정말 어떤 반응을 얻으려면 좋네요 :) 나는 당신이 말한 것처럼 문제가 무엇을 말하는지 정확히 알지 못한다. translateM이하는 것에서 활발히 활동하는 것 같습니다. 현재 "스택에서"무언가를 가져 오는 방법,이 스택이 무엇인지 그리고 내 경우에 도움이되는지 살펴 봅니다. 방향 친구에게 고마워! :) – user1295313

+0

저는 이제 안드로이드를위한 다양한 안드로이드 OpenGL es 2.0 튜토리얼을 보았습니다. 나는 누구나 다 그림을 그리는 것처럼 보인다. Havent는 쌓아 올리거나 어떤 식 으로든 제거하는 것을 보았습니다. 또한 나는 다른 객체를 계산 방법으로 다른 장소로 이동하려고 시도했으며 모든 것이 완벽하게 작동합니다. 문제는 내가 전에 언급 한 것처럼 터치가 제어되는 물체가 탄도를 띤다는 것입니다. 화면을 터치하기 전까지는 모든 것이 완벽하게 작동하므로 터치 구현 자체가 있어야합니다. 정적 객체를 사용하면 잘 작동합니다. 이것은 매우 사납다 : ( – user1295313

답변

0

cube1의 그림을 cube2로 전환하여이 문제를 해결했습니다. 이것은 모든 것을 해결 한 것 같습니다. 터치 컨트롤 객체를 마지막으로 드로잉하면 간섭이 종료된다고 가정합니다. D

+0

Bah에 있는지 알려줄 것입니다! 자사의 해결되지 않은 : (주위에 몇 가지 추가적인 손짓 후 나는 여전히이 문제가 – user1295313