我们正在尝试使用SharpGL(OpenGL的C#包装器)将Kinect为我们提供的深度数据转换为点 Cloud . 我们的目标是根据Kinect为我们提供的数据创建3D模型 . 到目前为止我们已经完成:
-
捕获深度数据(了解Kinect给出的内容)
-
获得给定的每个深度数据的x,y坐标,从而生成我们的x,y,z点
-
使用GL_Points渲染所述点(我们也可以使用GL_Triangles渲染它,其中一个
三角形表示单点) -
捕获键盘事件以放大和缩小点 Cloud 视图
我们用什么:
-
Visual Studio 2010
-
C#编程
-
Microsoft Kinect SDK 1.6
-
SharpGL(OpenGL的C#包装器)
问题:
我们设法将我们的(x,y,z)点渲染到opengGLControl上,我们可以放大和缩小并欣赏绘制的点 . 由于3D模型交互需要,我们已经开始尝试旋转(在y轴上)我们的点 Cloud . 这是我们的麻烦开始的地方 .
我们的点 Cloud 会旋转,而不是我们想要的本地坐标 . 当它开始旋转时,它似乎沿着世界y轴,但不是对象的局部y轴 . 看看SharpGL不允许设置“中心旋转点”(因为每个对象都有世界坐标系和局部坐标系),我们尝试按照不同的教程解释gl.Translate( . ..)和gl.Rotate(...) .
-
gl.Translate(..)//为您的对象移动到"center rotation point"所需的中心点
-
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();
结果?就好像我们不会做那两个gl.Translate(...)并且会直接完成:
gl.Translate(-3.5f, 1.5f, -7f);
gl.Rotate(this.triangleRotation, 0.0f, 1.0f, 0.0f);
总之,我们希望能够将点 Cloud 旋转到它自己的局部轴上,但我们似乎无法设置它的“中心旋转点” . 事情是,因为代码是有效的(没有错误发生),我们不知道为什么它没有像它应该做的那样做 .
我们最好用GL_POINTS而不是GL_TRIANGLES渲染它,因为它看起来如何 .