2017-06-20 5 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でスケールされるように設計されています。だから、例えばあなたがzとしてnear、その後xyとして、座標leftrighttopbottomを四角形を入れて、他のマトリックスを使用していないが、錐台が、結果は正確にフルスクリーンの長方形になります。 nearに近い

オブジェクトは、通常は描画されませんし、それらはさらに、すべてのパラメータが、farに応じて直線的にスケーリングされます。 farパラメータは、オブジェクトの描画が停止する場所だけに影響します。ほとんどの場合、非常に大きなfarの値を入れても大したことはありません。 farの値を大きくするとデプステストの精度になります。したがって、深度バッファを使用する場合、この値はできるだけ小さいが、すべてのオブジェクトを表示するのに十分な大きさであることを確認してください。

ほとんどの場合、視野が角度である錐台を定義します。 nearfarおよびfovを定義します。境界パラメータは、right = tan(fov)*near*0.5およびtop = tan(fov)*near*0.5*(viewHeight/viewWidth)のように計算されます。これらはほんのいくつかの例ですが、それを定義する方法はたくさんあります。

あなたのケースでは、あなたが望むようにこれらの値を定義しない理由はありません。したがって、left = 0.0,right = width,bottom = heightおよびtop = 0.0のようなものを持つ。しかし、それでも、正となるべき近、遠の値を定義する必要があります。あなたのオブジェクトが0.0の距離にある場合、それらはすべて切り取られます。

これを避けるには、lookAtプロシージャを使用すると、シーン内に「カメラ」位置を定義する別のマトリックスが生成される場合が最適です。ちょうどそれをz=-nearに置くだけで、オブジェクトは正投影を使うのとまったく同じように見えるはずです。問題は、カメラにオブジェクトを近づけてズームインさせたい場合、オブジェクトが再び描画されないようにすることです。

このようなものを実現するには、最大縮尺を定義する必要があります(例:maxZoom = 10.0)。次に、すべての境界パラメータ(topleft ...)をその値で割ります。 lookAtマトリックスのz値にこのスケールを適用して、シーンがズームされていないと見なします。

一般に、座標を反転するには、境界値を変更するか、マトリックスで見ることができます。他の方法もありますが、これはかなり標準的です。私はこれがあなたのためにいくつかをクリアすることを願っています。

+0

あなたの長くて素敵な答えをありがとう - これをもっと調べて、時間の経過とともにそれを受け入れるかもしれません – java

関連する問題