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(...).
- gl.Translate(..) // オブジェクトの「中心回転ポイント」として必要な中心点に // 移動します
- gl.Rotate(..) // 指定された回転角度で必要な軸に沿って回転します
- 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 を使用してレンダリングすることをお勧めします。