用opengl编程的基本步骤都不是很清楚。自己借了几本书看,可是却被繁琐的函数弄糊涂了。有没有谁能够教我呢?我只想做一个简单的动画。是用来描述一个电子椭圆轨道作进动的。描述轨道的函数我都写好了。可以算出每一时刻电子的三维坐标,就是不会让他动起来。由哪位能够针对这个问题教教我啊?在下感激不尽!

解决方案 »

  1.   

    一个中文教程网址
    http://cgd.pages.com.cn/cgd/develop/opengl/opengl.1.htm
      

  2.   

    http://www.b-xr.com/bbs.htm上下载《Visual C++ OpenGL DirectX三维动画编程宝典》源代码,这套原码里有很多中文注释,而且每一个原码都是在前一个的基础上的,循序渐进,推荐你看看。
    www.pdown.net上也有一些opengl的免费电子书
      

  3.   

    我觉得对于初学者来说,nehe的教程是最好的选择之一。
      

  4.   

    /*(1)****************************************************
    函 数 名: SetWindowPixelFormat
    作    者:朱少伟
    产生日期:2003/10/09
    版 本 号:1.0版
    版本说明:是直接加工而得
    函数功能:为使OPENGL与VC兼容而编写的一个设置调色板的函数。
    返 回 值:成功返回true,否则返回false
    参 数  1:窗口的画图句柄
    属于的类:属于的类具体看情况。
    成员类型:
    使用限制:
    其它说明:具体使用时要对里面的参数进行一下修改
    应用示例:
    ******************************************************/
    BOOL CMYOPENGLView::SetWindowPixelFormat(HDC hDC)
    {
    PIXELFORMATDESCRIPTOR pixelDesc; pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);//结构大小
    pixelDesc.nVersion = 1;//版本号 pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | //支持在窗口吕绘图
    PFD_SUPPORT_OPENGL | //支持OPENGL
    PFD_DOUBLEBUFFER |   //双缓存模式
    PFD_STEREO_DONTCARE;  pixelDesc.iPixelType = PFD_TYPE_RGBA;    //RGBA颜色模式
    pixelDesc.cColorBits = 32;
    pixelDesc.cRedBits = 8;
    pixelDesc.cRedShift = 16;
    pixelDesc.cGreenBits = 8;
    pixelDesc.cGreenShift = 8;
    pixelDesc.cBlueBits = 8;
    pixelDesc.cBlueShift = 0;
    pixelDesc.cAlphaBits = 0;
    pixelDesc.cAlphaShift = 0;
    pixelDesc.cAccumBits = 64;
    pixelDesc.cAccumRedBits = 16;
    pixelDesc.cAccumGreenBits = 16;
    pixelDesc.cAccumBlueBits = 16;
    pixelDesc.cAccumAlphaBits = 0;
    pixelDesc.cDepthBits = 32;
    pixelDesc.cStencilBits = 8;
    pixelDesc.cAuxBuffers = 0;
    pixelDesc.iLayerType = PFD_MAIN_PLANE;
    pixelDesc.bReserved = 0;
    pixelDesc.dwLayerMask = 0;
    pixelDesc.dwVisibleMask = 0;
    pixelDesc.dwDamageMask = 0;

    int m_GLPixelIndex=1;//这个可考虑定义在类中 m_GLPixelIndex = ChoosePixelFormat(hDC,&pixelDesc);
    if(m_GLPixelIndex==0) // Choose default
    {
    m_GLPixelIndex = 1;
    if(!DescribePixelFormat(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc))
    return FALSE;
    } if(!SetPixelFormat(hDC,m_GLPixelIndex,&pixelDesc))
    return FALSE; return TRUE;
    }/*(2)****************************************************
    函 数 名: CreateViewGLContext
    作    者:朱少伟
    产生日期:2003/10/09
    版 本 号:1.0版
    版本说明:是直接加工而得
    函数功能:为使OPENGL与VC兼容而编写的一个获得上下画柄的函数。
    返 回 值:成功返回true,否则返回false
    参 数  1:窗口的画图句柄
    参 数  2:一个画图句柄,要把它保存起来,最后要销毁的。
    属于的类:属于的类具体看情况。
    成员类型:
    使用限制:
    其它说明:直接用就可以。
    应用示例:
    ******************************************************/
    BOOL CMYOPENGLView::CreateViewGLContext(HDC hDC,HGLRC &m_hGLContext)
    {
    m_hGLContext = wglCreateContext(hDC); if(m_hGLContext==NULL)
    return FALSE; if(wglMakeCurrent(hDC,m_hGLContext)==FALSE)
    return FALSE;
    return TRUE;
    }/*
    用Visual C++ 6实现OpenGL编程 二、生成OpenGL程序的基本步骤和条件  1、首先创建工程  用AppWizard产生一个EXE文件,并在工程名字中输入"GLSample1",
        第一步、选单文档(SDI);
        第二步、Finish结束,工程创建完毕。  2、将此工程所需的OpenGL文件 和库加入到工程中  在工程菜单中,选择"Project"下的"Settings"项。单击"Link"标签,在Object/Library Modules的编辑框中输入
        "OpenGL32.lib glu32.lib glaux.lib"(注意,输入双引号中的内容,各个库用空格分开;否则会出现链接错误),
    选择"OK"结束。然后"stdafx.h",将下列语句插入到文件中(划下划线的语句为所加语句):
    #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
    #include <afxwin.h> // MFC core and standard components
    #include <afxext.h> // MFC extensions
    #include <gl\gl.h>
    #include <gl\glu.h>
    #ifndef _AFX_NO_AFXCMN_SUPPORT
    #include <afxcmn.h> // MFC support for Windows 95 Common Controls
    #endif // _AFX_NO_AFXCMN_SUPPORT或者用以下方法
    #pragma comment(lib, "OpenGL32.lib")   
    #pragma comment(lib, "glaux.lib")   
    #pragma comment(lib, "glu32.lib")   
    #include <gl\gl.h>
    #include <gl\glu.h>
    #include <gl\glaux.h>  3、改写视类的OnPreCreate函数并给视类添加成员函数和成员变量  OpenGL需要窗口加上WS_CLIPCHILDREN(创建父窗口使用的Windows风格,用于重绘时裁剪子窗口所覆盖的区域)
        和 WS_CLIPSIBLINGS(创建子窗口使用的Windows风格,用于重绘时剪裁其他子窗口所覆盖的区域)风格。
    把OnPreCreate改写成如下所示:BOOL CGLSample1View::PreCreateWindow(CREATESTRUCT& cs)
    {
    cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
    return CView::PreCreateWindow(cs);
    }    4.设置像素格式。像素格式决定窗口着所显示的图形在内存中是如何表示的。
          由像素格式控制的参数包括:颜色深度、缓冲模式和所支持的绘画接口。在下面将对这些参数进行设置。
          我们先在CGLSample1View的类中添加一个保护型的成员函数BOOL  SetWindowPixelFormat(HDC hDC)
      (用鼠标右键添加,并将上面的代码拷入)  5.现在像素格式已经设定,我们下一步工作是产生绘制环境(RC)并使之成为当前绘制环境。
        在CGLSample1View中加入一个保护型的成员函数 CreateViewGLContext (用鼠标右键添加,并将上面的代码拷入)
    并加入一个保护型的成员变量HGLRC m_hGLContext;
    用以调用CreateViewGLContext(hdc,m_hGLContext);
        6.在OnCreate函数中调用:
    int CGLSample1View::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CView::OnCreate(lpCreateStruct) == -1)
    return -1;
    HWND hWnd=GetSafeHwnd();
    HDC hDC=::GetDC(hWnd);
    if(SetWindowPixelFormat(hDC)==FALSE)
    return 0;
    if(CreateViewGLContext(hDC,m_hGLContext)==FALSE)
    return 0;
    return 0;
    }  7.编辑CGLSample1View的构造函数,使之如下所示:  CGLTutor1View::CGLTutor1View()  { 
    m_hGLContext = NULL;
          m_GLPixelIndex = 0;//我现在函数中不设置这个变量
      }
      

  5.   


      8.添加WM_DESTROY的消息处理函数Ondestroy( ),使之如下所示:void CTestopenglView::OnDestroy() 
    {
    if(wglGetCurrentContext()!=NULL)
    wglMakeCurrent(NULL, NULL) ;
    if(m_hGLContext!=NULL)
    {
    wglDeleteContext(m_hGLContext);
    m_hGLContext = NULL;
    }
    CView::OnDestroy();

    }
      至此,OpenGL工程的基本框架就建好了。但如果你现在运行此工程,则它与一般的MFC程序看起来没有什么两样。
      

  6.   


      三、实例  下面给出一个简单的二维图形的例子(这个例子都是以上述设置为基础的)。
      1.用Classwizard为CGLSample2view添加WMSIZE的消息处理函数OnSize
    void CTestopenglView::OnSize(UINT nType, int cx, int cy) 
    {
    CView::OnSize(nType, cx, cy);
    GLsizei width,height;
    GLdouble aspect;
    width=cx;
    height=cy;
    if(cy==0)
    aspect = (GLdouble)width;
    else
    aspect = (GLdouble)width/(GLdouble)height;

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, 500.0*aspect, 0.0, 500.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }
      2.用Classwizard为CGLSample2view添加WM_PAINT的消息处理函数OnPaint
    void CTestopenglView::OnPaint() 

    CPaintDC DC(this);
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON);
    glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
    glVertex2f(100.0f, 50.0f);
    glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
    glVertex2f(450.0f, 400.0f);
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
    glVertex2f(450.0f, 50.0f);
    glEnd(); glFlush();
    SwapBuffers(DC);
    }   这个程序的运行结果是黑色背景下的一个绚丽多彩的三角形这里你可以看到用OpenGL绘制图形非常容易,只需要几条简单
    的语句就能实现强大的功能。如果你缩放窗口,三角形也会跟着缩放。这是因为OnSize通过glViewport(0, 0, width, height)
    定义了视口和视口坐标。glViewport的第一、二个参数是视口左下角的像素坐标,第三、四个参数是视口的宽度和高度。    3.立体视图把OnSize和OnPaint用下面的代码替换就可以了。
    void CTestopenglView::OnSize(UINT nType, int cx, int cy) 
    {
    CView::OnSize(nType, cx, cy);

    GLsizei width,height;
    GLdouble aspect; width = cx;
    height = cy; if(cy==0)
    aspect = (GLdouble)width;
    else
    aspect = (GLdouble)width/(GLdouble)height; glViewport(0,0,width,height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45,aspect,1,10.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glDrawBuffer(GL_BACK); GLfloat ambientProperties[]  = {0.7f, 0.7f, 0.7f, 1.0f};
        GLfloat diffuseProperties[]  = {0.8f, 0.8f, 0.8f, 1.0f};
        GLfloat specularProperties[] = {1.0f, 1.0f, 1.0f, 1.0f};
    glLightfv( GL_LIGHT0, GL_AMBIENT, ambientProperties);
        glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuseProperties);
        glLightfv( GL_LIGHT0, GL_SPECULAR, specularProperties);
        glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 1.0);
    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuseProperties);
    glEnable(GL_DEPTH_TEST);
    }void CTestopenglView::OnPaint() 

    CPaintDC DC(this); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix(); // Position / translation (mouse rotation)
    glTranslated(0.0,0.0,-8.0);
    glRotated(0, 1.0, 0.0, 0.0);
    glRotated(0, 0.0, 1.0, 0.0);
    glScalef(0.2,0.5,0.5);
    CClientDC dc(this);
    glColor3f(0.0f,0.5f,0.4f);
    float x = 1.5f;
    glBegin(GL_POLYGON);
    glNormal3d(0.0,0.0,-1.0);
    glVertex3d( x,  x, x);
    glColor4f(1.0f, 0.0f, 0.0f, 1.0f);//每个点都要指定颜色,虽然这个程序不能实现彩色,但原理就是如此
    glVertex3d( x, -x, x);
    glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
    glVertex3d(-x, -x, x);
    glVertex3d(-x,  x, x);
    glEnd();
    glPopMatrix();
    SwapBuffers(DC);

      OnSize中的glMatrixMode是用来设置矩阵模式的,它有三个选项:GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE。
        GL_MODELVIEW表示从实体坐标系转到人眼坐标系。
    GL_PROJECTION表示从人眼坐标系转到剪裁坐标系。
    GL_TEXTURE表示从定义纹理的坐标系到粘贴纹理的坐标系的变换。  glLoadIdentity初始化工程矩阵(project matrix);
        gluOrtho2D把工程矩阵设置成显示一个二维直角显示区域。  那么,怎样画三角形呢?我们首先调用glColor4f(1.0f, 0.0f, 0.0f, 1.0f),把红、绿、蓝分量分别指定为1、0、0。
        然后我们用glVertex2f(100.0f, 50.0f)在(100,50)处定义一个点。依次,我们在(450,400)处定义绿点,
    在(450,50)处定义蓝点。然后我们用glEnd结束画三角形。  在glBegin和glEnd之间的有效函数有:
      glVertex,glColor,glIndex, glNormal,glTexCoord, glEvalCoord,glEvalPoint, glMaterial, glEdgeFlag
      四、OpenGL编程小结
      1、如果要响应WM_SIZE消息,则一定要设置视口和矩阵模式。
      2、尽量把你全部的画图工作在响应WM_PAINT消息时完成。
      3、产生一个绘制环境要耗费大量的CPU时间,所以最好在程序中只产生一次,直到程序结束。
      4、尽量把你的画图命令封装在文档类中,这样你就可以在不同的视类中使用相同的文档,节省你编程的工作量。
      5、glBegin和glEnd一定要成对出现,这之间是对图元的绘制语句。
      6、 解决屏幕的闪烁问题。我们知道,在窗口中拖动一个图形的时候,由于边画边显示,会出现闪烁的现象。
    在GDI中解决这个问题较为复杂,通过在内存中生成一个内存DC,绘画时让画笔在内存DC中画,画完后一次用Bitblt将内存DC
    “贴”到显示器上,就可解决闪烁的问题。在OpenGL中,我们是通过双缓存来解决这个问题的。一般来说,双缓存在图形工作
    软件中是很普遍的。双缓存是两个缓存,一个前台缓存、一个后台缓存。绘图先在后台缓存中画,画完后,交换到前台缓存,
    这样就不会有闪烁现象了。通过以下步骤可以很容易地解决这个问题:  1) 要注意,GDI命令是没有设计双缓存的。我们首先把使用InvalidateRect(null)的地方改成InvalidateRect(NULL,FALSE)。
    这样做是使GDI的重画命令失效,由OpenGL的命令进行重画;  2) 将像素格式定义成支持双缓存的(注:PFD_DOUBLEBUFFER和PFD_SUPPORT_GDI只能取一个,两者相互冲突)。
       pixelDesc.dwFlags =
       PFD_DRAW_TO_WINDOW |
       PFD_SUPPORT_OPENGL |
       PFD_DOUBLEBUFFER |
       PFD_STEREO_DONTCARE;  3) 我们得告诉OpenGL在后台缓存中画图,在视类的OnSize()的最后一行加入:glDrawBuffer(GL_BACK);
      4) 最后我们得把后台缓存的内容换到前台缓存中,在视类的OnPaint()的最后一行加入:SwapBuffers(dc.m_ ps.hdc)。  7、生成简单的三维图形。我们知道,三维和二维的坐标系统不同,三维的图形比二维的图形多一个z坐标。
    我们在生成简单的二维图形时,用的是gluOrtho2D;我们在生成三维图形时,需要两个远近裁剪平面,
    以生成透视效果。实际上,二维图形只是视线的近裁剪平面z= -1,远裁剪平面z=1;这样z坐标始终当作0,
    两者没有本质的差别。
      
    在上述基础之上,我们只做简单的变化,就可以生成三维物体。  1) 首先,在OnSize()中,把gluOrtho2D(0.0, 500.0*aspect,0.0, 500.0)换成gluPerspective(60, aspect, 1, 10.0);
    这样就实现了三维透视坐标系的设置。该语句说明了视点在原点,透视角是60度,近裁剪面在z=1处,远裁剪面在z=10.0处。  2) 在RenderScene()中生成三维图形;实际上,它是由多边形组成的。下面就是一个三维多边形的例子:
       glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, RedSurface)
       glBegin(GL_POLYGON);
       glNormal3d( 1.0, 0.0, 0.0);
       glVertex3d( 1.0, 1.0, 1.0);
       glVertex3d( 1.0, -1.0, 1.0);
       glVertex3d( 1.0, -1.0, -1.0);
       glVertex3d( 1.0, 1.0, -1.0);
       glEnd();   3) 我们使用glMaterialfv(GL_ FRONT_AND_BACK, GL_AMBIENT, RedSurface)这个函数来定义多边形的表面属性,
    为每一个平面的前后面设置环境颜色。当然,我们得定义光照模型,这只需在OnSize()的最后加上glEnable(GL_LIGHTING);
    RedSufFace是一个颜色分量数组,例如:RedSufFace[] ={1.0f,0.0f,0.0f};要定义某个平面的环境颜色,
    只需把glMaterialfv加在平面的定义前面即可  4) Z缓冲区的问题:要使三维物体显得更流畅,前后各面的空间关系正确,一定得使用Z缓冲技术;否则,
    前后各面的位置就会相互重叠,不能正确显示。Z缓冲区存储物体每一个点的值,这个值表明此点离人眼的距离。
    Z缓冲需要占用大量的内存和CPU时间。启用Z缓冲只需在OnSize()的最后加上glEnable(GL_DEPTH_TEST);
    要记住:在每次重绘之前,应使用glClear(GL_DEPTH_BUFFER_BIT)语句清空Z缓冲区。  5) 现在已经可以正确地生成三维物体了,但还需要美化,可以使物体显得更明亮一些。我们用glLightfv函数定义光源的属性值。下例就
    定义了一个光源:
      glLightfv(GL_LIGHT0, GL_AMBIENT,LightAmbient);
      glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
      glLightfv(GL_LIGHT0, GL_SPECULAR, LightSpecular);
      glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
      glEnable(GL_LIGHT0);  GL_LIGHT0是光源的标识号,标识号由GL_LIGHTi组成(i从0到GL_MAX_LIGHTS)。 GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR、GL_POSITION分
    别定义光源的周围颜色强度、光源的散射强度、光源的镜面反射强度和光源的位置。*/
      

  7.   

    我看了很多资料,包括楼上的资料。首先谢谢大家的热情和耐心。但是我的问题还是无法解决。其实我的程序很简单,很多OpenGL的功能都用不到。我现在已经写出了,计算电子每一时刻坐标的函数。我可以在任意一个时刻提供该时刻电子的三维坐标。只要在屏幕上画一个点表征电子就可以了。不断刷新,我的电子轨迹就出来了。我就是不知道怎么画一个点,还有不知道怎么让点动起来。我原本想用简单的SetPixelv()来画一个点,但是就是不知道怎么在OnDraw函数里,刷新,重画,由此反复。
        我最终要达到的效果就是看见一个点在屏幕上作椭圆轨道运动。同时这个椭圆轨道又在绕他的中心,和z轴作进动。
        大家能不能指点一下啊。我不要画得很漂亮,只要有那个效果就可以了。
      

  8.   

    [转帖]VC中OpenGL编程的步骤:
    1.  使用AppWizard创建应用程序框架,在文档和视结构中,视负责窗口中内容的显示,因此所有的OpenGL绘制工作应放在视类进行;2.  利用ClassWizard给视类添加如下成员函数:重载PreCreateWindow函数;响应WM_CREATE消息的OnCreate函数;响应WM_SIZE消息的OnSize函数;响应WM_ERASEBKGND消息的OnEraseBKgnd函数;响应WM_DESTROY消息的OnDestroy函数;重载OnInitialUpdate函数3.  在PreCreateWindow函数中加入如下语句:cs.style=cs.style|WS_CLIPSIBLINGS|WS_CLIPCHILDREN;窗口必须设置以上属性,否则像素格式就不能正确设置;4.  设置像素格式,创建绘制描述表。这一过程放在响应WM_CREATE消息的OnCreate函数中。WM_CREATE消息窗口被创建时产生。像素格式定义显示设备的三十特性,比如颜色位平面的数量和组织方式(RGB模式还是索引模式),是否采用双缓存模式等等。OpenGl和GDI(Windows的图形设置接口)的像素格式不同,而Windows应用中窗口的缺省设置是GDI像素格式,所以需要为执行OpenGL绘制任务的窗口专门指定像素格式。对每个窗口,像素格式只能设置一次。绘制描述表与设置描述表类似,但包含了更多有关OpenGL绘制信息。OpenGL依赖绘制描述表操作显示硬件,因此调用OpenGL命令前,必须创建描述表并使其成为当前的绘制描述表。设置像素格式、创建绘制描述是每个窗口进行OpenGl绘制前必不可少的步骤,所以放在OnCreate函数中最为合适。5.  响应WM_SIZE消息。当视窗的大小改变时,需发送WM_SIZE消息。在WM_SIZE的消息响应函数中可以获知改变后窗口的大小,因此在其中可以调用glViewport对场景的窗口变换进行更改以后适应窗口大小的改变,还可通过glFrustum等函数重新设置投影变换,使得当窗口的大小发生改变时,显示在窗口中的场景不会发生扭曲。6.  响应WM_ERASEBKGND消息。当需要重新设置窗口背景时,产生WM_ERASEBKGND消息。处理该消息的缺省操作是用当前背景色填充整个窗口。处理函数做适当改变:注释掉OnEraseBKgnd函数所有的语句,添加return TRUE,使该函数不执行操作,仅返回TRUE值。7.  重载OnInitUpdate函数。OnInitUpdate函数为视对象专有,在视第一次显示之前,文档和视的结构刚刚被建起之后调用,此时,从视对象中可以获得与之相连的文档对象中的信息。根据文档和视的关系,OpenGL的绘制信息一般通过文档对象存取,通过视对象,因此,在OnInitUpdate中适合做OpenGL的绘制前的初始化工作。初始化工作包括创建列表(显示列表索引作为视类对象的成员变量保存)。设置光照参数,装载纹理映射贴图,确定融合方式及参数,设置雾化参数以及其它绘制场景前需完成的工作。必要时可设置时钟,程序在以后的运行中将定时接收到WM_TIMER消息,只要在该消息的响应函数中有规律地改变场景设置,并使视图重新绘制,就可以在窗口中形成动画效果。8.  在OnDraw函数中绘制OpenGL场景。所有的绘制工作都应放在OnDraw函数中。9.  响应WM_TIMER消息。WM_TIMER消息由程序中设定的时钟产生。若未设定时钟,则不用响应WM_TIMER消息。在WM_TIMER的消息处理函数中,更新场景,然后发送WM_PAINT消息或直接调用OnDraw函数,使窗口中显示改变后的场景。如此反复,形成动画。10. 响应WM_DESTROY消息。WM_DESTROY消息在窗口销毁时产生。在WM_DESTROY的消息的处理函数中删除描述表。必要时重载基本应用框架中应用程序类的OnIdle函数。OnIdle函数在程序的消息队列为空时被调用,该函数执行的功能与gluIdleFunc函数设定的空闲回调函数的功能相似,即执行一些后台任务。
     
      

  9.   

    TO  babaoshan(我真的不会)  ,这是在《MFC开发人员指南》的附录D抄的吧,不过,归纳地不错!:P
      

  10.   

    基本框架用NEHE(http://nehe.gamedev.net/)的试试,
    glPushMatrix后,glTranslatef移动到你的轨迹上,再绘制你的电子(可以用纹理贴图),
    再glPopMatrix.
      

  11.   

    可以到debug.vimgate.com/opengl
    看一下