2012-12-02 85 views
2

好吧,這將是一個很容易解釋。我正在用AndEngine製作一個非常基本的「僞3D」賽車遊戲(反過來,openGL--我認爲)。我不相信使用AndEngine真的與這個問題有任何關係,因爲我直接訪問openGL函數來完成我的繪圖。OpenGL繪製扭曲的精靈(圖像)僞觀-3D透視

無論如何,我複製pasta'd一些代碼,允許通常2D的AndEngine有一個3D透視圖(教程可以找到here。這工作相當好,我也不相信這很多用我的問題做,但是我不完全瞭解openGL,所以對我來說有點難。下面是來自onLoadEngine(在應用程序啓動時調用)的代碼,它用3d透視圖設置相機:

this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT) { 
    //other methods... 
    private void setFrustum(GL10 pGL) { 
     // set field of view to 60 degrees 
     float fov_degrees = 60; 
     float fov_radians = fov_degrees/180 * (float)Math.PI;       

     // set aspect ratio and distance of the screen 
     float aspect = this.getWidth()/(this.getHeight()); 
     float camZ = this.getHeight()/2/(float)Math.tan(fov_radians/2);        

     // set projection 
     GLHelper.setProjectionIdentityMatrix(pGL); 
     GLU.gluPerspective(pGL, fov_degrees, aspect, camZ/10, camZ*10); 

     // set view 
     GLU.gluLookAt(pGL, 0,120f, camZ, 0, 0, 0f, 0, 1, 0); // move camera back+up 
     pGL.glScalef(1,-1,1); // reverse y-axis 
     pGL.glTranslatef(-CAMERA_WIDTH/2,-CAMERA_HEIGHT/2,0); // origin at top left 
    } 
}; 

然後在onLoadScene(繪圖發生的地方),我畫了一堆我的圖像,如下所示:

for (int n=0;n<=100;n++) { 
    final int k = n; 

    final Sprite line = new Sprite(0, 0,CAMERA_WIDTH,16f, [AndEngine texture holding road img]) { 
    @Override 
     protected void applyTranslation(GL10 pGL) { 
      pGL.glTranslatef(this.mX, 120f, 15f*k); //16*k causes a sliver of a space between each segment 
      pGL.glRotatef(90f, 1, 0, 0); //**MAY BE MY ISSUE** 
     }   
    }; 
    scene.attachChild(line); //actually draws the image to the screen   
} 

除了一件事以外,它的工作也非常棒!它扭曲了我的圖像中的狗屎。圖片簡潔PNG格式,既符合CAMERA_WIDTH,都在尋找與此類似: "road" segment - 320 x 16

當我畫它沒有旋轉線,我得到這個: without the rotating

其中有一個體面的直線中間(tbh我會很滿意這種方式),但是你可以看到道路的邊緣都面對着他們應該面對的方向。我想,爲什麼不把它們翻轉呢?我以爲我必須圍繞X軸旋轉180度,但相反,它只是使它們消失,而我發現90度的作品(???)。不管怎麼說,這是我得到:

final product

所以,是的。這裏是我的問題所在 - 中間車道分隔線扭曲爲廢話!標誌着道路邊緣的線條奇妙,但無論出於何種原因,它真的與中間線相混淆。我掌握了3D背後的大部分數學知識,但我真的不知道該怎麼做......這幾乎就像圖像被壓縮一樣,因爲它的視角很銳利,但我並不知道我怎麼能解決這個問題,而不是簡單地把它視爲自上而下的觀點? :S

反正...任何想法或指導是受歡迎的。對不起,這是一個漫長而令人費解的帖子 - 當我真的不知道問題出在哪裏時,它會變得很難。

另外 - 值得注意的是,我對OpenGL或3D圖形幾乎沒有經驗,而且對深入瞭解它們的興趣甚少。我需要一個創可貼的解決方案!

回答

3

好吧,我找到了解決方案!原來有這個小問題叫做透視正確紋理,這基本上只是一個標誌,需要在OpenGL中打開,以便在透視圖中繪製圖像時不會產生傾斜圖像。

在我的相機初始化代碼,我添加了此行的方法setFrustum(GL10 PGL):

pGL.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 

那這基本上解決了這個問題。行直到現在爲止:)我發現在另一個stackoverflow帖子中,這個答案實際上不是提問者想要的東西,但它恰好爲我工作:D導致我回答的線程可以是發現here