2017-06-20 134 views
0

我想知道在使用透視投影時是否有簡單的方法來翻轉y座標?關於這個問題的線索似乎集中在正交投影上。我正在將基於Canvas的遊戲轉換爲OpenGL ES 2.0,並且具有相對複雜的碰撞檢測功能。和大量的語法是基於y軸從屏幕的頂部始於0和例如2560OpenGL ES 2.0:使用透視投影翻轉y座標

@Override 
public void onSurfaceChanged(GL10 unused, int width, int height) { 

    game_width = width; 
    game_height = height; 

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

    // while the width will vary as per aspect ratio. 
    final float ratio = (float) width/height; 
    final float left = -ratio; 
    final float right = ratio; 
    final float bottom = -1.0f; 
    final float top = 1.0f; 
    final float near = 1f; 
    final float far = 40.0f; 

    Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far); 

} 

回答

1

結束於THES屏幕底部有使用正交或截矩陣,因此非常小的差別是最簡單的答案就是簡單地交換bottomtop參數,甚至將它們設置爲您需要的任何參數。

但尋找到圓臺多一點:

什麼這種方法確實是它創建了一個矩陣,將比例取決於距離near的對象。它被設計成使得near上的對象被縮放1.0。因此,舉例來說,如果你把座標leftrighttopbottomxy然後nearz和不使用其他基質,但視錐結果會完全是一個全屏幕矩形的矩形。

通常不會繪製更接近near的對象,根據所有參數,這些對象將進行線性縮放,但會根據far進行線性縮放。參數far隻影響對象的繪製位置。所以在大多數情況下,如果你把一個非常大的價值放在一個非常重要的位置,沒有什麼區別。具有較大值的效果將是深度測試的精度。因此,在使用深度緩衝區時,請確保此值儘可能小,但仍足夠大以查看所有對象。

在大多數情況下,我們將視野定義爲角度。您定義常數near,farfov,從中計算邊界參數,如right = tan(fov)*near*0.5top = tan(fov)*near*0.5*(viewHeight/viewWidth)。這些僅僅是一些例子,因爲有很多方法來定義它。

在你的情況下,沒有理由不隨意定義這些值。所以有類似left = 0.0,right = width,bottom = heighttop = 0.0。但是,你仍然需要定義近似值和遠值,這些值必須是正值。然後,如果你的物體距離爲0.0,那麼它們都將被剪切。

要避免這種情況,最好使用lookAt過程,該過程將生成另一個矩陣,該矩陣可能會在場景中定義「相機」位置。通過簡單地把它放到z=-near你應該看到使用正交投影的對象。現在的問題是,如果您想通過將相機靠近對象來「放大」,那些對象將再次不被繪製。

要實現類似的目標,您需要定義一些最大比例,例如maxZoom = 10.0。然後你會做的是將所有邊界參數(topleft ...)除以該值。您還可以將此比例應用於lookAt矩陣中的z值,以將場景視爲未縮放。

所以一般來說,翻轉座標,你可以修改邊界值,或者你可以玩看矩陣。還有其他方法,但這些都很標準。我希望這爲你清除了一些東西。

+0

感謝您的長期和不錯的答案 - 將更多地考慮這一點,並在適當的時候接受它 – java