1

Kinect が提供する深度データを、SharpGL (OpenGL の C# ラッパー) を使用して点群に変換しようとしています。私たちの目標は、Kinect が管理してくれているデータから 3D モデルを作成することです。これまでのところ、次のことを達成しています。

  • 深度データをキャプチャする (Kinect が提供するものを理解する)
  • 指定された各深度データの x、y 座標を取得し、x、y、z ポイントを生成します。

  • GL_Points を使用して上記のポイントをレンダリングします (1 つの三角形が単一のポイントを表す GL_Triangles を使用してレンダリングすることもできます)
  • ポイントクラウドのビューをズームインおよびズームアウトするために、キーボードイベントをキャプチャします

使用するもの:

  • ビジュアル スタジオ 2010
  • C# でのプログラミング
  • マイクロソフト キネクト SDK 1.6
  • SharpGL (OpenGL の C# ラッパー)

問題:

(x,y,z) ポイントを opengGLControl にレンダリングすることができ、ズームインおよびズームアウトして、描画されたポイントを評価できます。3D モデルの相互作用に必要なため、ポイント クラウドを (y 軸上で) 回転させようとしました。ここから私たちの悩みが始まります。

点群は回転しますが、必要なローカル座標ではありません。回転し始めると、オブジェクトのローカル y 軸ではなく、ワールド y 軸に沿って回転しているように見えます。SharpGL が「中心回転ポイント」を設定することを許可していない方法を見て(オブジェクトごとにワールド座標系とローカル座標系があるため)、gl.Translate(. ..) と gl.Rotate(...).

  1. gl.Translate(..) // オブジェクトの「中心回転ポイント」として必要な中心点に // 移動します
  2. gl.Rotate(..) // 指定された回転角度で必要な軸に沿って回転します
  3. gl.Translate(..) // オブジェクトを描画したい元のポイントに戻ります

何をする必要があるかを確実に理解するために、単一の三角形でこれを実行しようとしました。


         private float zoom = -7.0f;
         private float xAxis = -3.5f;  //this is done so that image can be rendered in 
                                       //   the center of our view
        ************************************* 

        OpenGL gl = openGLControl.OpenGL;
        gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);

        gl.LoadIdentity();

        float xAxisReturn = this.xAxis - 3.55f; //Needed for the second gl.Translate()
        float yAxisReturn = 1.5f + 2.25f;
        float zoomReturn = this.zoom - 0.67f;

       gl.Translate(3.55f, -2.25f, 0.67f); //Center Point calculated personally for 
                                       // the SINGLE triangle drawn
       gl.Rotate(this.triangleRotation, 0.0f, 1.0f, 0.0f);
       gl.Translate(xAxisReturn, yAxisReturn, zoomReturn); //means that the object will 
                                                    //be drawn at (-3.5f, 1.5f, -7f) 

        gl.Begin(OpenGL.GL_TRIANGLES);
            gl.Color(0f, 1f, 0f);
            gl.Vertex(3.55f, -2.18f, 0f);
            gl.Vertex(3.45f, -2.28f, 1f);
            gl.Vertex(3.65f, -2.28f, 1f);
        gl.End();

結果?これら 2 つの gl.Translate(...) を実行せず、直接実行した場合と同じです。

 gl.Translate(-3.5f, 1.5f, -7f); 
 gl.Rotate(this.triangleRotation, 0.0f, 1.0f, 0.0f);

結論として、点群を独自のローカル軸で回転できるようにしたいのですが、「中心回転点」を設定できないようです。問題は、コードが有効である (エラーが発生しない) ため、想定どおりに動作しない理由がわからないということです。

GL_TRIANGLES の代わりに GL_POINTS を使用してレンダリングすることをお勧めします。

4

0 に答える 0