1

我们正在尝试使用 SharpGL(OpenGL 的 C# 包装器)将 Kinect 为我们提供的深度数据转换为点云。我们的目标是根据 Kinect 提供给我们的数据创建 3D 模型。到目前为止,我们已经完成了:

  • 捕获深度数据(了解 Kinect 提供了什么)
  • 获取给定每个深度数据的 x,y 坐标,从而生成我们的 x,y,z 点
  • 使用 GL_Points 渲染所述点(我们也可以使用 GL_Triangles 渲染它,其中一个
    三角形代表一个 SINGLE 点)
  • 捕获键盘事件以放大和缩小点云视图

我们使用什么:

  • 视觉工作室 2010
  • 用 C# 编程
  • 微软 Kinect SDK 1.6
  • SharpGL(OpenGL 的 C# 包装器)

问题:

我们设法将 (x,y,z) 点渲染到 opengGLControl 上,我们可以放大和缩小并欣赏绘制的点。由于 3d 模型交互需要,我们继续尝试旋转(在 y 轴上)我们的点云。这是我们的麻烦开始的地方。

我们的点云确实会旋转,只是不在我们想要的本地坐标上。当它开始旋转时,它似乎是沿着世界 y 轴旋转,而不是对象的本地 y 轴。看到 SharpGL 如何不允许设置“中心旋转点”(因为每个对象都有一个世界坐标系和一个局部坐标系),我们尝试遵循不同的教程来解释 gl.Translate(.Translate(.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();

结果?就像我们不会做这两个 gl.Translate(...) 而是直接做一样:

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

总之,我们希望能够在它自己的局部轴上旋转我们的点云,但我们似乎无法设置它的“中心旋转点”。问题是,由于代码是有效的(没有发生错误),我们不知道为什么它没有按照它应该做的那样做。

我们最好用 GL_POINTS 而不是 GL_TRIANGLES 来渲染它,因为它看起来如何。

4

0 回答 0