我们正在尝试使用 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(...)。
- 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();
结果?就像我们不会做这两个 gl.Translate(...) 而是直接做一样:
gl.Translate(-3.5f, 1.5f, -7f);
gl.Rotate(this.triangleRotation, 0.0f, 1.0f, 0.0f);
总之,我们希望能够在它自己的局部轴上旋转我们的点云,但我们似乎无法设置它的“中心旋转点”。问题是,由于代码是有效的(没有发生错误),我们不知道为什么它没有按照它应该做的那样做。
我们最好用 GL_POINTS 而不是 GL_TRIANGLES 来渲染它,因为它看起来如何。