2016-07-12 34 views
0

ゲームはトップダウンの2D宇宙船ゲームで、「小惑星」と考える。OpenGL(OpenTK)の宇宙船の方向に2Dカメラを回転させる

Box2Dxは物理エンジンで、追加のゲームオブジェクトを描画するために、OpenTKに基づいて付属のDebugDrawを拡張しました。カメラを常に移動させて、常にプレーヤーの船の中心に置き、ズームインとズームアウトを完璧に行います。しかし、私は実際に船と一緒に回転するカメラが必要なので、常に同じ方向に向いています。つまり、船は画面の中央で凍っているように見え、ゲーム世界の残りの部分は回転するにつれてその周りを回転します。

私はコードサンプルを適合させようとしましたが、何も動作しません。私が達成することができた最高のものは、斜めにカットされたレンダリングです。

 // Clear. 
     Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); 

     // other rendering omitted (planets, ships, etc.) 

     this.OpenGlControl.Draw(); 

更新ビュー - 船とのセンターはその角度に一致するように回転させる必要があります。

は、ループをレンダリングします。今、私はちょうど概念実証、ないサイコロのための任意の角度でそれを回転させるようにしようとしているために:

public void RefreshView() 
    { 
     int width = this.OpenGlControl.Width; 
     int height = this.OpenGlControl.Height; 

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

     Gl.glMatrixMode(Gl.GL_PROJECTION); 
     Gl.glLoadIdentity(); 

     float ratio = (float)width/(float)height; 

     Vec2 extents = new Vec2(ratio * 25.0f, 25.0f); 
     extents *= viewZoom; 

     // rotate the view 
     var shipAngle = 180.0f; // just a test angle for proof of concept 
     Gl.glRotatef(shipAngle, 0, 0, 0); 

     Vec2 lower = this.viewCenter - extents; 
     Vec2 upper = this.viewCenter + extents; 

     // L/R/B/T 
     Glu.gluOrtho2D(lower.X, upper.X, lower.Y, upper.Y); 

     Gl.glMatrixMode(Gl.GL_MODELVIEW); 
    } 

今、私は明らかに、この間違ったをやっています。 0度と180度は右寄りにしたり、反転させたりしますが、他の度合では実際にズームイン/ズームアウトするか黒で表示され、何もレンダリングされません。下記の例は以下のとおりです。船の角度は0.0fがある

場合は、ゲームの世界は予想通りである:180.0fの enter image description here

度が垂直に反転させ...思わ有望: enter image description here

度45のズームアウトしてもまったく回転しません。それは奇妙です。 enter image description here

90度のすべてが黒を返します。あなたがブラックを見たことがない場合: enter image description here

助けてください!

+1

https://www.opengl。org/sdk/docs/man2/xhtml/glRotate.xmlは、glRotatefの引数2-4があなたが回り込んでいるベクトルであることを示しているようです。 '0、0、0'を入れると、私の行動は未定義であると思われます。代わりに '0、0、1'を試しましたか? (深さがz軸であると仮定) – pingul

+0

回転を投影行列スタックに適用しています。さらに、廃止された固定機能パイプラインをもう使用しないでください。それを使用する正当な理由がない場合は、Coreプロファイルに固執してください。 – BDL

答えて

0

まず、2-4引数が軸ですので、@pingulの記述どおりに正しく指定してください。

さらに重要なことに、回転が投影行列に適用されます。

// L/R/B/T 
    Glu.gluOrtho2D(lower.X, upper.X, lower.Y, upper.Y); 

この行では、直交2D投影行列に前回の回転を乗算し、投影行列に適用します。私はあなたが望むものではないと信じています。モデルビュー行列モードが選択された後

ソリューションは、あなたの回転がモデルビュー行列スタックに適用されます今

// L/R/B/T 
    Glu.gluOrtho2D(lower.X, upper.X, lower.Y, upper.Y); 

    Gl.glMatrixMode(Gl.GL_MODELVIEW); 

    // rotate the view 
    var shipAngle = 180.0f; // just a test angle for proof of concept 
    Gl.glRotatef(shipAngle, 0.0f, 0.0f, 1.0f); 

そして

以下のように、場所にあなたの回転のコールを動かすことになります。 (私はこれがあなたが望む効果だと信じています)。 glRotatef()は、回転行列を作成し、選択したスタックスタックの最上部の行列と乗算することに注意してください。

可能であれば@BDLが提案するように、固定機能パイプラインから離れることを強くお勧めします。

関連する問題