那些年我们一起编...吧 关注:9贴子:106
  • 3回复贴,共1

【0422:Opengl小程序(2)】

只看楼主收藏回复



1楼2014-04-22 23:42回复
    1.绘制直线:(程序大体框架不便,每次修改一个glBegin();glEnd();之间的即可)
    #include<gl/glut.h>
    #include<math.h>
    #define GL_PI 3.1415f
    void RenderScene(void)
    {
    GLfloat x,y,z,angle;//存储坐标和角度
    glClear(GL_COLOR_BUFFER_BIT);//用当前颜色清除窗口
    //保持矩阵状态并进行旋转
    glPushMatrix();
    //glRotatef(60.0f,1.0f,0.0f,0.0f);
    //glRotatef(60.0f,0.0f,1.0f,0.0f);
    //对所有剩余的点只调用一次
    glBegin(GL_LINES);
    z = 0.0f;
    for(angle = 0.0f;angle<=GL_PI;angle+=(GL_PI/20.0f))
    {
    x = 50.0f*sin(angle);
    y = 50.0f*cos(angle);
    //指定点并稍稍变化z值
    glVertex3f(x,y,z);
    x = 50.0f*sin(angle+GL_PI);
    y = 50.0f*cos(angle+GL_PI);
    glVertex3f(x,y,z);
    }
    glEnd();
    //恢复变换
    glPopMatrix();
    //刷新绘图命令
    glutSwapBuffers();
    }
    //设置渲染状态
    void SetupRC(void)
    {
    //黑色背景
    glClearColor(0.0f,0.0f,0.0f,1.0f);
    //把绘图颜色置为绿色
    glColor3f(0.0f,1.0f,0.0f);
    }
    void ChangeSzie(GLsizei w,GLsizei h)
    {
    GLfloat nRange = 100.0f;
    //防止被0所除
    if(h==0)
    h=1;
    //把视口设置为窗口的大小
    glViewport(0,0,w,h);
    //重置投影矩阵堆栈
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //建立剪裁区域(左,右,底,顶,近,远)
    if(w<=h)
    glOrtho (-nRange,nRange,-nRange*h/w,nRange*h/w,-nRange,nRange);
    else
    glOrtho (-nRange*w/h,nRange*w/h,-nRange,nRange,-nRange,nRange);
    //重置模型视图矩阵堆栈
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }
    int main(int argc,char * argv[])
    {
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    glutInitWindowSize(300,400);
    glutCreateWindow("LINES");
    glutDisplayFunc(RenderScene);
    glutReshapeFunc(ChangeSzie);
    SetupRC();
    glutMainLoop();
    return 0;
    }


    2楼2014-04-23 00:15
    回复
      2.三角扇形:(TAT出了点错误,不管了。)
      #include<gl/glut.h>
      #include<math.h>
      #define GL_PI 3.1415f
      void RenderScene(void)
      {
      GLfloat x,y,angle;//存储坐标和角度
      int ipivot=1;
      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//用当前颜色清除窗口
      //if(BOutLine)
      //glPolygonMode(GL_BACK,GL_LINE);
      //else
      glPolygonMode(GL_BACK,GL_FILL);
      //保持矩阵状态并进行旋转
      glPushMatrix();
      glRotatef(60.0f,1.0f,0.0f,0.0f);
      glRotatef(60.0f,0.0f,1.0f,0.0f);
      //对所有剩余的点只调用一次
      glBegin(GL_TRIANGLE_FAN);
      glVertex3f(0.0f,0.0f,75.0f);
      for(angle = 0.0f;angle<=(2.0f*GL_PI)*3.0f;angle+=0.1f)
      {
      x = 50.0f*sin(angle);
      y = 50.0f*cos(angle);
      //指定点并稍稍变化z值
      if((ipivot %2)==0)
      glColor3f(0.0f,1.0f,0.0f);
      else
      glColor3f(1.0f,0.0f,0.0f);
      ipivot++;
      glVertex2f(x,y);
      }
      glEnd();
      glBegin(GL_TRIANGLE_FAN);
      glVertex2f(0.0f,0.0f);
      for(angle=0.0f;angle < (2.0f*GL_PI);angle+=(GL_PI/8.0f))
      {
      x = 50.0f*sin(angle);
      y = 50.0f*cos(angle);
      if((ipivot %2)==0)
      glColor3f(0.0f,1.0f,0.0f);
      else
      glColor3f(1.0f,0.0f,0.0f);
      ipivot++;
      glVertex2f(x,y);
      //恢复变换
      glPopMatrix();
      //刷新绘图命令
      glutSwapBuffers();
      }
      }
      //设置渲染状态
      void SetupRC(void)
      {
      //黑色背景
      glClearColor(0.0f,0.0f,0.0f,1.0f);
      //把绘图颜色置为绿色
      glColor3f(0.0f,1.0f,0.0f);
      glShadeModel(GL_FLAT);
      glFrontFace(GL_CW);
      }
      void ChangeSzie(GLsizei w,GLsizei h)
      {
      GLfloat nRange = 100.0f;
      //防止被0所除
      if(h==0)
      h=1;
      //把视口设置为窗口的大小
      glViewport(0,0,w,h);
      //重置投影矩阵堆栈
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      //建立剪裁区域(左,右,底,顶,近,远)
      if(w<=h)
      glOrtho (-nRange,nRange,-nRange*h/w,nRange*h/w,-nRange,nRange);
      else
      glOrtho (-nRange*w/h,nRange*w/h,-nRange,nRange,-nRange,nRange);
      //重置模型视图矩阵堆栈
      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
      }
      int main(int argc,char * argv[])
      {
      glutInit(&argc,argv);
      glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
      glutInitWindowSize(300,400);
      glutCreateWindow("POINT");
      glutDisplayFunc(RenderScene);
      glutReshapeFunc(ChangeSzie);
      SetupRC();
      glutMainLoop();
      return 0;
      }

      //glPolygonMode函数用于控制多边形的显示方式。
      face这个参数确定显示模式将适用于物体的哪些部分,控制多边形的正面和背面的绘图模式
      GL_FRONT表示显示模式将适用于物体的前向面(也就是物体能看到的面)
      GL_BACK表示显示模式将适用于物体的后向面(也就是物体上不能看到的面)
      GL_FRONT_AND_BACK表示显示模式将适用于物体的所有面
      mode这个参数确定选中的物体的面以何种方式显示(显示模式):
      GL_POINT表示只显示顶点,多边形用点显示
      GL_LINE表示显示线段,多边形用轮廓显示
      GL_FILL表示显示面,多边形采用填充形式


      3楼2014-04-23 00:41
      回复
        MFC下使用:http://blog.csdn.net/bbppbb/article/details/24314099
        Opengl模拟水波:http://johnhany.net/2014/02/water-rendering-with-gerstner-wave/(TAT感觉好帅)


        4楼2014-04-23 00:44
        回复