5.5 使用 wxGLCanvas 绘制三维图形
感谢 OpenGL 和 wxGLCanvas,让 wxWidgets 拥有了绘制三维图形的能力。如果你的平台不支持 OpenGL,你仍然可以使用它的一个开放源码的实现 Mesa。
要让 wxWidgets 在 windows 平台上支持 wxGLCanvas,你需要编辑 include/wx/msw/setup.h,设置 wxUSE_GLCANVAS 为 1,然后编译的时候在命令行使用 USE_OPENGL=1,在连接的时候你也可能需要增加 opengl32.lib。而在 Unix 或者 Mac OS X 上,你只需要在配置 wxWidgets 的时候增加--with-opengl 参数来打开 OpenGL 或者 Mesa 的支持。
如果你已经是一个 OpenGL 的程序员,那么使用 wxGLCanvas 是非常简单的。你只需要在一个 frame 窗口或者其他任何容器窗口内创建一个 wxGLCanvas 对象,然后调用 wxGLCanvas::SetCurrent 函数将 OpenGL 的命令指向这个窗口,执行 OpenGL 命令,然后调用 wxGLCanvas::SwapBuffers 函数将当前的 OpenGL 缓冲区的内容绘制到窗口上。
下面的重绘事件处理函数演示了渲染一个三维立方体的一些基本代码书写原则。完整的例子可以在 wxWidgets 发行版本中的 samples/opengl/cube 目录中找到。
void TestGLCanvas::OnPaint(wxPaintEvent& event)
{
wxPaintDC dc(this);
SetCurrent();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-0.5f, 0.5f, -0.5f, 0.5f, 1.0f, 3.0f);
glMatrixMode(GL_MODELVIEW);
/* 清除颜色和深度缓冲 */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* 绘制一个立方体的六个面 */
glBegin(GL_QUADS);
glNormal3f( 0.0f, 0.0f, 1.0f);
glVertex3f( 0.5f, 0.5f, 0.5f); glVertex3f(-0.5f, 0.5f, 0.5f);
glVertex3f(-0.5f,-0.5f, 0.5f); glVertex3f( 0.5f,-0.5f, 0.5f);
glNormal3f( 0.0f, 0.0f,-1.0f);
glVertex3f(-0.5f,-0.5f,-0.5f); glVertex3f(-0.5f, 0.5f,-0.5f);
glVertex3f( 0.5f, 0.5f,-0.5f); glVertex3f( 0.5f,-0.5f,-0.5f);
glNormal3f( 0.0f, 1.0f, 0.0f);
glVertex3f( 0.5f, 0.5f, 0.5f); glVertex3f( 0.5f, 0.5f,-0.5f);
glVertex3f(-0.5f, 0.5f,-0.5f); glVertex3f(-0.5f, 0.5f, 0.5f);
glNormal3f( 0.0f,-1.0f, 0.0f);
glVertex3f(-0.5f,-0.5f,-0.5f); glVertex3f( 0.5f,-0.5f,-0.5f);
glVertex3f( 0.5f,-0.5f, 0.5f); glVertex3f(-0.5f,-0.5f, 0.5f);
glNormal3f( 1.0f, 0.0f, 0.0f);
glVertex3f( 0.5f, 0.5f, 0.5f); glVertex3f( 0.5f,-0.5f, 0.5f);
glVertex3f( 0.5f,-0.5f,-0.5f); glVertex3f( 0.5f, 0.5f,-0.5f);
glNormal3f(-1.0f, 0.0f, 0.0f);
glVertex3f(-0.5f,-0.5f,-0.5f); glVertex3f(-0.5f,-0.5f, 0.5f);
glVertex3f(-0.5f, 0.5f, 0.5f); glVertex3f(-0.5f, 0.5f,-0.5f);
glEnd();
glFlush();
SwapBuffers();
}
下图演示了另外的一个 OpenGL 的例子,一个可爱的(当然,有点棱角的)企鹅,在例子程序中,你可以用鼠标来旋转它。完整的例子可以在光盘的 samples/opengl/penguin 目录中找到。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论