mac上學用opengl(3)-畫簡單的三維圖形

前面畫的雖然都是三維的點操做,可是畫出的圖形看不出三維的效果 緩存

簡單的理解一下:三維裏的圖形比二維多的是 視點與物體的相對位置佈局,以及有投影變換 網絡

因此咱們須要理解的三維中的幾個概念: 框架

視圖變換----觀測三維模型的角度不一樣,顯示內容不一樣 函數

模型變換----三維模型的放大,縮小,移動,旋轉 oop

投影----三維模型應該近大遠小 佈局

視口的設置-----只看模型一部分,該如何顯示,選擇性視野忽略症 性能

雙緩存-----顯存裏一塊用來繪製圖形,一塊用來顯示,提升性能用 測試

垂直同步------所有繪製好了再顯示,提升性能用 spa

FPS的測試方法:FPS即每秒多少針,測試方法是屢次求平均值 orm

一個三維圖形代碼的例子框架與解釋,通常是先設置投影,再設置視圖,再畫

#include <GLUT/GLUT.h>

#include <math.h>

void display(  void )

{

  //清除顏色緩存

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  

  //先設置投影參數再設置視點佈局參數

  //投影參數解決視角,長寬比,近點,遠點4個問題

  //視點佈局解決眼睛位置,物體位置,眼睛與物體方向 3個問題

  //設置投影變換參數

  glMatrixMode(GL_PROJECTION);

  glLoadIdentity();

  gluPerspective                            // 設置透視圖

  (45,                            // 透視角設置爲 45 度,在Y方向上以角度爲單位的視野

   1.0,    // 窗口的寬與高比

   0.1f,                                // 視野透視深度:近點1.0f

   3000.0f                            // 視野透視深度:始點0.1f遠點1000.0f

   );

  

  //開始畫模型

  glMatrixMode(GL_MODELVIEW);

  glLoadIdentity();

  //眼睛位於(0,10,100)位置,物體位於(0,0,0)位置,方向是從上往下看(0,1,0)

  gluLookAt(10,10,100,0,0,0,0,1,0);


  glColor3f(0.5f0.7f1.0f);

  

  //生成三角

  glBegin(GL_LINES);

  for(int i=-1000;i<=1000;i+=10)

  {

    glVertex3f(0,0,i);

    glVertex3f(10,10,i);

    

    glVertex3f(0,0,i);

    glVertex3f(-10,10,i);

  }

  glEnd();

  

  //生成網絡

  int x=(int)(40*2);

  glBegin(GL_LINES);

  for(int i=-x;i<=x;i+=4)

  {

    glVertex3i(-x,0,i);

    glVertex3i(x,0,i);

    

    glVertex3i(i,0,x);

    glVertex3i(i,0,-x);

  }

  glEnd();

  

  

  //生成球體

  GLUquadricObj * pObj;

  pObj = gluNewQuadric();

  gluQuadricDrawStyle(pObj,GLU_LINE);

  gluQuadricNormals(pObj,GLU_SMOOTH);

  gluSphere(pObj,16,16,16);

  

  glFlush();

}


void testDisplay(void){

  glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //設置顯示屬性爲RBGA顏色,雙緩存

  glutInitWindowPosition(200, 200);//設置窗口位置

  glutInitWindowSize(WIDTH,HEIGHT);//設置窗口大小

  glutCreateWindow("OpenGL測試");//生成窗口

  glutDisplayFunc(&display);//設置顯示回調函數

}

/***************************/


int main(int argc, const char * argv[])

{

  glutInit(&argc, argv);//初始化GLUT

    testDisplay();


  glutMainLoop();//事件循環 


  return 0;}

相關文章
相關標籤/搜索