내 응용 프로그램은 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를 재배치 한 것으로 보입니다.
희망 사항이 더 명확하게 표시되기를 바랍니다. :)
왜 한 개체의 좌표가 그 밖의 모든 개체에 영향을 미칩니 까? 어떻게 다른 모든 물체가 터치 좌표에 영향을받지 않습니까?
OpenGL ES 2에 익숙하지 않습니다.0이지만 이전 버전의 OpenGL에서는 모델 변환을 적용하기 전에 현재 View Matrix (스택에 푸시)를 저장해야한다는 것을 알고 있습니다. 스택으로 푸시 한 후 모델 변형을 적용한 다음 모델을 그립니다. 작업이 끝나면 행렬을 스택 밖으로 가져옵니다. 모든 개체에 대해 반복하십시오. 짜증나지만 OpenGL은 상태 머신입니다. – dcow
댓글에 대한 고마워요, 정말 어떤 반응을 얻으려면 좋네요 :) 나는 당신이 말한 것처럼 문제가 무엇을 말하는지 정확히 알지 못한다. translateM이하는 것에서 활발히 활동하는 것 같습니다. 현재 "스택에서"무언가를 가져 오는 방법,이 스택이 무엇인지 그리고 내 경우에 도움이되는지 살펴 봅니다. 방향 친구에게 고마워! :) – user1295313
저는 이제 안드로이드를위한 다양한 안드로이드 OpenGL es 2.0 튜토리얼을 보았습니다. 나는 누구나 다 그림을 그리는 것처럼 보인다. Havent는 쌓아 올리거나 어떤 식 으로든 제거하는 것을 보았습니다. 또한 나는 다른 객체를 계산 방법으로 다른 장소로 이동하려고 시도했으며 모든 것이 완벽하게 작동합니다. 문제는 내가 전에 언급 한 것처럼 터치가 제어되는 물체가 탄도를 띤다는 것입니다. 화면을 터치하기 전까지는 모든 것이 완벽하게 작동하므로 터치 구현 자체가 있어야합니다. 정적 객체를 사용하면 잘 작동합니다. 이것은 매우 사납다 : ( – user1295313