我们正在尝试使用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渲染它,因为它看起来如何 .