我的應用程序是用android上的openGL ES 2.0製作的,我的對象位置更新有一個相當嚴重的問題。我的遊戲循環是這樣的,繪製所有對象 - >更新遊戲對象位置 - >迭代。然而,我有兩種不同類型的頭寸更新:一種是基於計算的,當價值低或足夠高時,它會改變方向。另一種是基於觸摸的,當用戶觸摸任何位置和/或輕掃屏幕時,對象將隨之而來。Android openGL es 2.0觸摸和對象位置bug ...無能
現在來解決問題。當用戶觸摸屏幕和/或輕掃時,應該只響應觸摸的對象也獲得基於計算的對象的x值的變化,並且我爲什麼這樣做是無能爲力的,因爲它們使用完全不同的位置變量。
遵循這裏是從GLsurfaceView示出觸摸位置值是如何傳遞到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);
}
});
}
}
下面此處的代碼的摘錄的代碼是從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();
}
編輯:發現我的壞explenations這樣的IM加入這個反而更清晰:)時會發生什麼
(當立方體1獲得觸摸輸入和立方體2會從updateObjectCoords座標): 應用程序啓動: 一切按預期工作,多維數據集2(updateObjectCoords之一)按預期方式移動。 用戶觸摸屏幕: 立方體2繼續移動,因爲它的假想立方體1(觸摸控制)座標數據似乎與立方體2混合,因爲它的移動看起來像是立方體2的兩倍一樣大,仍然可以操縱它但它不是很響應。
(CUBE2由是靜態的,但是updateObjectCoords依然活躍,被稱爲每一幀更新_test_x和_test_y的值): 應用程序啓動: 一切都只是預期 用戶觸摸屏幕: 一切完美的作品
所以它似乎是具體不斷地重新定位cube2干擾cube1的定位。
希望這個事情更加明確! :)
爲什麼要繪製一個對象的座標影響所有其他translateM的?所有其他物體如何不受觸摸座標影響?
我不熟悉OpenGL ES 2。0,但我知道在舊版本的OpenGL中,在將模型轉換應用於它之前,您必須保存當前的View Matrix(將其推入堆棧)。將其推入堆棧後,應用模型轉換,然後繪製模型。完成後,將矩陣從堆疊中彈出。重複每個對象。令人討厭,但作爲國家機器是OpenGL .. – dcow
感謝ALOT的評論,真的很高興得到一些迴應:)我不會假裝我確切地知道你指的是什麼,但問題似乎是像你說的東西仍然似乎在任何翻譯工作中都很活躍。目前正在研究如何採取一攬子措施,該堆棧是什麼,以及它是否可以幫助我的案例。非常感謝方向伴侶! :) – user1295313
我現在看了一些不同的Android的OpenGL ES 2.0教程爲Android。每個人似乎都在和我一起畫畫。沒有看到任何刪除堆棧或類似的東西。此外,我現在試圖使不同的對象與計算方法去不同的地方,一切都很完美。唯一的問題是觸摸,就像我之前提到的那樣,觸摸控制物體會變得彈道。它必須是觸摸實現本身的東西,因爲一切都很完美,直到你觸摸屏幕。使用靜態對象時,觸摸工作正常。這是非常奇怪的:( – user1295313