2022年3月29日 星期二

電腦圖學筆記

 

  1. 至https://jsyeh.org/3dcg10 下載data , win32
  2. windows.zip解壓縮 >> windows / transformation.exe
  3. data.zip解壓縮 >> windows / data / 模型obj
  4. 把data檔案放進windows >> 執行transformation.exe
        主角 Light Material.exe

=======================================================================
moodle下載freeglut.zip >> 解壓縮至桌面 >> freeglut資料夾 >> lib >> 將libfreeglut.a複製貼上 >> 重新命名libglut32.a (此步驟才能讓codeblocks跑) 

codeblocks 17.12 >> file >> new >> project >>選GLUT >> 存桌面 >> next >> 設定GULT目錄 >> 跑程式
  1. Ctrl+F搜尋light
  2. 有陣列宣告、函式呼叫
#include <GL/glut.h>
const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
void display()
{
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glColor3f(1,1,0);
        glutSolidTeapot(0.3);
        glutSwapBuffers();

}
/* Program entry point */

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week06 light");


    glutDisplayFunc(display);
///偷來的程式要放glutCreateWindow之後才會有效
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
///放在glutMainLoop之前
    glutMainLoop();

}
茶壺光源
#include <GL/glut.h>
#include <stdio.h>
float x=150,y=150,z=0,scale=1.0;
int oldX=0,oldY=0;

void display()
{
        glClearColor(0.5,0.5,0.5,1);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glPushMatrix();
        glTranslatef( (x-150)/150.0 , -(y-150)/150.0,z);
        glScalef(scale,scale,scale);
        glColor3f(1,1,0);
        glutSolidTeapot(0.3);
        glPopMatrix();
        glutSwapBuffers();

}
void keyboard( unsigned char key,int mouseX,int mouseY)
{

}
void mouse(int button,int state,int mouseX,int mouseY)
{
     oldX = mouseX; oldY = mouseY;
}
/* Program entry point */
void motion(int mouseX,int mouseY)
{
    if(mouseX-oldX >0 )scale *= 1.01;

    if(mouseX-oldX <0 )scale *=0.99;
    oldX = mouseX; oldY = mouseY;
    display();
}

int main(int argc,char** argv){
    glutInit( &argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("第5週的程式");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}

隨著滑鼠放大縮小
#include <GL/glut.h>
#include <stdio.h>
float x=150,y=150,z=0,scale=1.0,angle=0.0;
int oldX=0,oldY=0;

void display()
{
        glClearColor(0.5,0.5,0.5,1);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glPushMatrix();
        glTranslatef( (x-150)/150.0 , -(y-150)/150.0,z);
        glRotatef(angle,0,1,0);
        glScalef(scale,scale,scale);
        glColor3f(1,1,0);
        glutSolidTeapot(0.3);
        glPopMatrix();
        glutSwapBuffers();

}
void keyboard( unsigned char key,int mouseX,int mouseY)
{

}
void mouse(int button,int state,int mouseX,int mouseY)
{
     oldX = mouseX; oldY = mouseY;
}
/* Program entry point */
void motion(int mouseX,int mouseY)
{
   /// if(mouseX-oldX >0 )scale *= 1.01;

   /// if(mouseX-oldX <0 )scale *=0.99;
   angle+=(mouseX-oldX);
    oldX = mouseX; oldY = mouseY;
    display();
}

int main(int argc,char** argv){
    glutInit( &argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("第5週的程式");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}
可旋轉

#include <GL/glut.h>
#include <stdio.h>
float x=150,y=150,z=0,scale=1.0,angle=0.0;
int oldX=0,oldY=0,now=1;

void display()
{
        glClearColor(0.5,0.5,0.5,1);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glPushMatrix();
        glTranslatef( (x-150)/150.0 , -(y-150)/150.0,z);
        glRotatef(angle,0,1,0);
        glScalef(scale,scale,scale);
        glColor3f(1,1,0);
        glutSolidTeapot(0.3);
        glPopMatrix();
        glutSwapBuffers();

}
void keyboard( unsigned char key,int mouseX,int mouseY)
{
    if(key=='1'||key=='w'||key=='W')now=1;
    if(key=='2'||key=='e'||key=='E')now=2;
    if(key=='3'||key=='r'||key=='R')now=3;
}
void mouse(int button,int state,int mouseX,int mouseY)
{
     oldX = mouseX; oldY = mouseY;
}
/* Program entry point */
void motion(int mouseX,int mouseY)
{
   /// if(mouseX-oldX >0 )scale *= 1.01;

   /// if(mouseX-oldX <0 )scale *=0.99;
   ///angle+=(mouseX-oldX);
   if(now==1){
    x += (mouseX-oldX); y+= (mouseY-oldY);
   }else if(now==2){
    angle += (mouseX-oldX);
   }else if(now==3){
    if(mouseX-oldX >0) scale *=1.01;
    if(mouseY-oldY <0) scale *=0.99;
   }
    oldX = mouseX; oldY = mouseY;
    display();
}










沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

一.     一樣先安裝且設定好freeglut,OpecCV, 開啟CodeBlocks建立新專案 week11_gundam,                 把 MyGundam.zip下載解壓縮後的data資料夾放到freeglut/bin裡面 把week09_openc...