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目录中找到。