2017年9月28日 星期四

周欣融 week03

畫小小兵


#include <GL/glut.h>
#include <stdio.h>

//Drawing funciton
void draw(void)
{
  FILE *f;
  float w, h, c;
  float r, g, b;
  float i, j, x, y;

  //Background color,GL_DEPTH_BUFFER_BIT 為必須
  glClearColor(0,0,0,1);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  //Read pixel file,minion.txt是圖片的pixel檔
  //不要把讀檔function寫在draw()裡面,會造成效能下降
  f = fopen("minion.txt", "r");

  //Read width, height, channel

  fscanf(f, "%f %f %f", &w, &h, &c);

  //Set point size,每一個點放成10倍大,避免縮放window的時候造成破圖
  glPointSize(10.0f);

  //Begin drawing,這邊一個點就畫一個pixel,所以使用GL_POINTS
  glBegin(GL_POINTS);
  for(i=0; i<w; i++){
    for(j=0; j<h; j++){
      //Read r, g, b,效能下降主因
      fscanf(f, "%f %f %f", &r, &g, &b);

      //Geometric transformation
      x = -(i-(w/2.0))/(w/2.0);
      y = (j-(h/2.0))/(h/2.0);

      //Draw(in python, read as bgr)
      glColor3f(b/255.0, g/255.0, r/255.0);
      glVertex3f(y, x, 0);
    }
  }

  //End drawing
  glEnd();
  fclose(f);

  //Draw order
  glutSwapBuffers();
}

//Main program
int main(int argc, char **argv)
{
  glutInit(&argc, argv);
  //Simple buffer
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE| GLUT_DEPTH);
  glutInitWindowPosition(50,25);
  glutInitWindowSize(300, 300);
  glutCreateWindow("minion");
  //Call to the drawing function
  glutDisplayFunc(draw);
  glutMainLoop();
  return 0;
}

結果:
















-------------------------------------------------------------------------------------------------------------------


畫足球

  1. 下載並安裝3D exploration軟體 -> link
  2. 下載模型檔(05/04 -> examples -> data) -> link
  3. 將足球模型檔匯入3D exploration (直接拖曳即可,.obj和.mtl都要)
  4. 點 File -> Save
  5. 存成.cpp檔
  6. 選擇Sample App,點ok,就會產生一個可以畫出足球模型的cpp程式碼
  7. 新增一個GLUT project,把步驟(6)的程式碼複製貼上到main.cpp
  8. 將會產生錯誤的部分先註解掉,從 SetDCPixelFormat()函式下宣告 lpPalette 開始,到最後一個 if 結束
  9. 編譯並執行


結果:


沒有留言:

張貼留言