好吧,這將是一個很容易解釋。我正在用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,都在尋找與此類似:
當我畫它沒有旋轉線,我得到這個:
其中有一個體面的直線中間(tbh我會很滿意這種方式),但是你可以看到道路的邊緣都面對着他們應該面對的方向。我想,爲什麼不把它們翻轉呢?我以爲我必須圍繞X軸旋轉180度,但相反,它只是使它們消失,而我發現90度的作品(???)。不管怎麼說,這是我得到:
所以,是的。這裏是我的問題所在 - 中間車道分隔線扭曲爲廢話!標誌着道路邊緣的線條奇妙,但無論出於何種原因,它真的與中間線相混淆。我掌握了3D背後的大部分數學知識,但我真的不知道該怎麼做......這幾乎就像圖像被壓縮一樣,因爲它的視角很銳利,但我並不知道我怎麼能解決這個問題,而不是簡單地把它視爲自上而下的觀點? :S
反正...任何想法或指導是受歡迎的。對不起,這是一個漫長而令人費解的帖子 - 當我真的不知道問題出在哪裏時,它會變得很難。
另外 - 值得注意的是,我對OpenGL或3D圖形幾乎沒有經驗,而且對深入瞭解它們的興趣甚少。我需要一個創可貼的解決方案!