2012-10-27 80 views
0

我使用的OpenGL ES吸引我的圖片,我目前我的看法是設置這些:OpenGL的遊戲滾動相機

gl.glClearColor(0.6f, 0.6f, 1f, 1f); 
    gl.glClearDepthf(1.0f); 
    gl.glViewport(0, 0, varScreenWidth, varScreenHeight); 
    gl.glShadeModel(GL10.GL_SMOOTH); 
    gl.glDisable(GL10.GL_DEPTH_TEST); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 
    gl.glLoadIdentity(); 
    gl.glViewport(0, 0, width, height); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glOrthof(0f, width, 0f, height, -10f, 10f); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

我想滾Z軸我的整個看法,但我不能使用glRotate ()。因爲我的物體從右向左移動,當我這樣做時,我必須在它們的Y位置添加偏移量。我需要一種方法來旋轉Z軸上的整個視圖,如相機膠捲,以便物體自動移動到Y位置。我已經嘗試通過乘以(ScreenWidth - ObjPositionX)和sin(Zroll)來添加y偏移量,但這存在一些視覺問題,對象不能完美地保持在它們的位置。感謝您的幫助......

  • 編輯

確定某人希望我能更清楚。所以函數glRotate正在將我的對象滾動到它們的orgin上。但我需要一種方法來在Z軸上滾動整個視圖,因爲它的視角是視圖的中心而不是單個對象。所以如果物體位於中心的左側,它會看起來更高。如果物體位於右側,則會降低。

+0

除了你的問題,你需要一個glLoadIdentity之前glOrtho – datenwolf

+0

以及我已經添加它,我沒有看到任何區別是什麼理論? –

+0

你能更清楚嗎? – Max

回答

0

嗯,我再次使用glRotatef()函數。問題在於:我正在使用glTranslate()將事物放在他們的位置上。爲此,我必須爲每個對象調用glLoadIdentity。解決方案:現在我只在開始繪製對象之前使用glRotate()一次。把東西放在他們的位置上:我意識到我可以將X偏移量添加到vertexBuffer本身。我希望這可以幫助別人...

0

我認爲這是在你的顯示功能(如果這屬於切勿將投影和視口設置窗口大小調整處理程序 - 它會咬你,厲害!)

gl.glViewport(0, 0, width, height); 

gl.glMatrixMode(GL10.GL_PROJECTION); 
gl.glLoadIdentity(); // glOrtho needs a identity matrix to work upon 
gl.glOrthof(0f, width, 0f, height, -10f, 10f); 

gl.glMatrixMode(GL10.GL_MODELVIEW); 
gl.glLoadIdentity(); 

你假設你的觀看體積跨越[0,寬度]×[0,高度]範圍(x,y)。因此,要圍繞Z軸的這個體積的中心旋轉,您必須先移動樞軸點。變換是他們乘到堆棧相反的順序應用,所以:

gl.glTranslatef(width/2., height/2., 0); // move back to origin 
gl.glRotate(angle, 0, 0, 1); // rotate about Z 
gl.glTranslatef(-width/2, -height/2., 0); // move pivot point to middle of viewing volume 

draw_scene(); 
+0

我有onSurfaceCreated()函數的視口,你給我的旋轉方式看起來不錯,但我認爲它將適用於全屏對象,我的對象比較小。無論如何,我已經嘗試過,但沒有效果:(謝謝 –

+0

@datenwolf你可以解釋你的第一行,我一直在把我的重塑回調到現在.. – Max

+1

@Max:OpenGL是一個基於狀態的**繪製** API,文字*生活在當下*許多OpenGL任務要求在渲染幀期間多次更改此狀態由於所有OpenGL狀態都與繪圖有關,因此設置狀態非常有用且有意義,無論什麼時候是必需的,當需要的時候都是正確的。 – datenwolf