0

現在、カメラを回転および移動するようにこの更新コードを設定しています。

float move = 0.5f;
        float look = 0.01f;


        //Rotation
        if (Keyboard[Key.Left]) {

            modelview = Matrix4.Mult (modelview, Matrix4.CreateRotationY (-look));
        }
        if (Keyboard[Key.Right]) {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateRotationY (look));

        }
        if (Keyboard[Key.Up])
        {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateRotationX (-look));
        }
        if (Keyboard[Key.Down])
        {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateRotationX (look));
        }

        //Movement
        if (Keyboard[Key.W])
        {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateTranslation (0f, 0f, move));
        }
        if (Keyboard[Key.S]) {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateTranslation (0f, 0f, -move));
        }
        if (Keyboard[Key.A])
        {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateTranslation (move, 0f, 0));
        }
        if (Keyboard[Key.D]) {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateTranslation (-move, 0f, 0));
        }

カメラを動かすと、現在の位置ではなく、世界の原点 (0,0,0) を中心に回転する効果がシミュレートされます。

私のモデルビューマトリックスは次のようにロードされます:

            GL.MatrixMode (MatrixMode.Modelview);
        GL.LoadMatrix (ref modelview);
4

1 に答える 1

2

このコードでやるべきことはたくさんあります。簡単に言えば:

あなたのコードはレンダリング ループの一部だと思いますか?

次のことを行う必要があります。

  • movex、y、z 方向の移動のために、3 つの変数に置き換えます。
  • 左右の外観と上下の外観のlook2つの変数に置き換えます。これに関する詳細な理論については、「オイラー角」をグーグルで検索してください。yawpitch
  • それらをすべてループの外に移動します - それらはフレーム間で持続する必要があります。

その後、各フレームで次のことを行う必要があります。

  • 入力に従って、これらの変数を更新します (2 フレーム間のデルタ時間を乗じた定数値で増加または減少します)。
  • モデル ビュー マトリックスを単位マトリックス (LoadIdentity()) に置き換えます。
  • モデル ビュー マトリックスに (x,y,z) による平行移動を掛け、
  • X 平面での回転に を掛けますyaw
  • Y平面による回転と を掛けpitchます。

要約すると、入力処理をマトリックス処理から分離する必要があり、各フレームは現在の位置と方向に基づいて正しいモデル ビュー マトリックスを (一連の変換として) 設定します。

于 2010-11-11T20:31:45.703 に答える