2022年6月26日 星期日

VERY BEAUTIFUL, VERY POWERFUL

一.

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

把week09_opencv的程式碼看能不能把剛彈的圖跑出來


能順利跑出來後,把剛彈的圖貼到茶壺上

///

#include <opencv/highgui.h>

#include <opencv/cv.h>

#include <GL/glut.h>

int myTexture(char * filename)

{

    IplImage * img = cvLoadImage(filename); 

    cvCvtColor(img,img, CV_BGR2RGB);

    glEnable(GL_TEXTURE_2D); 

    GLuint id; 

    glGenTextures(1, &id);

    glBindTexture(GL_TEXTURE_2D, id);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);

    return id;

}

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glutSolidTeapot( 0.3 );

    glutSwapBuffers();

}

int main(int argc, char**argv)

{

    glutInit( &argc, argv );

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week11 Gundam");


    glutDisplayFunc(display);

    myTexture("data/Diffuse.jpg");


    glutMainLoop();

}

///

二.

    接下來把模型給讀進來

  1. Computer Graphics (jsyeh.org)下載 [source](會用到glm.h、glm.c、transformation.c)
  2. 並將這三個檔案放進week11_gundam並將glm.c改成glm.cpp
  3. 將glm.cpp加入CodeBlocks的week11_gundam中
///
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <GL/glut.h>
#include "glm.h"///在專業目錄找
GLMmodel * pmodel = NULL ;///指標,指到模型,是空指標
int myTexture(char * filename)
{
    IplImage * img = cvLoadImage(filename);
    cvCvtColor(img,img, CV_BGR2RGB);
    glEnable(GL_TEXTURE_2D);
    GLuint id;
    glGenTextures(1, &id);
    glBindTexture(GL_TEXTURE_2D, id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    if( pmodel == NULL){
        pmodel=glmReadOBJ("data/Gundam.obj") ; ///讀模型
        glmUnitize(pmodel) ; ///換成Unit單位大小
        glmFacetNormals(pmodel) ; ///重新計算法向量
        glmVertexNormals(pmodel,90) ; ///重新計算模型頂點的法向量
    }
    glmDraw(pmodel,GLM_TEXTURE) ; ///模型畫貼圖
    glutSwapBuffers () ;
}

int main(int argc,char** argv)
{

    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week11 gundam");

    glutDisplayFunc(display);
    myTexture("data/Diffuse.jpg");

    glutMainLoop();
}
///
寫完執行時發現貼圖上下顛倒,用小畫家把Diffuse.jpg垂直翻轉
幫剛彈加上3D跟旋轉
///
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <GL/glut.h>
#include "glm.h"///在專業目錄找
GLMmodel * pmodel = NULL ;///指標,指到模型,是空指標
int myTexture(char * filename)
{
    IplImage * img = cvLoadImage(filename);
    cvCvtColor(img,img, CV_BGR2RGB);
    glEnable(GL_TEXTURE_2D);
    GLuint id;
    glGenTextures(1, &id);
    glBindTexture(GL_TEXTURE_2D, id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
}
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    if( pmodel == NULL){
        pmodel=glmReadOBJ("data/Gundam.obj");///讀模型
        glmUnitize(pmodel);///換成Unit單位大小
        glmFacetNormals(pmodel);///重新計算模型面的法向量
        glmVertexNormals(pmodel,90);///重新計算模型頂點的法向量
    }
    glPushMatrix();
        glRotatef(angle,0,1,0);
        glmDraw(pmodel,GLM_TEXTURE);///模型畫貼圖
    glPopMatrix();

    glutSwapBuffers();
    angle+=0.8;
}

int main(int argc,char** argv)
{

    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week11 gundam");

    glutIdleFunc(display);
    glutDisplayFunc(display);
    myTexture("data/Diffuse.jpg");
    glEnable(GL_DEPTH_TEST);
    glutMainLoop();
}
///
三.
    開啟一個新的glut專案,用茶壺模擬手臂的轉動
///
#include <GL/glut.h>
void hand(){
    glColor3f(0,1,0);
    glutSolidTeapot(0.2);
}
void body(){
    glColor3f(1,1,0);
    glutSolidTeapot(0.3);
}
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    body();
    glPushMatrix();
        glTranslated(0.5,0.2,0);
        glRotatef(angle,0,0,1);
        glTranslated(0.3,0,0);
        hand();
    glPopMatrix();
    glutSwapBuffers();
    angle+=0.3;
}
int main(int argc,char** argv)
{

    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week11 TRT");

    glutIdleFunc(display);
    glutDisplayFunc(display);
    glutMainLoop();
}
///

VERY BEAUTIFUL, VERY POWERFUL

一.
    安裝freeglut並設定好,在打開Codeblocks建個新的glut專案project:week10_texturere
,在把上禮拜的程式複製進來,在main函式內新增myTexture("earth.jpg"); 這行程式碼
///
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
int myTexture(char * week09_opencv)
{

    IplImage * img = cvLoadImage(week09_opencv); ///OpenCV讀圖
    cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
    glGenTextures(1, &id); /// 產生Generate 貼圖ID
    glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
}
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glutSolidTeapot(0.3);
    glutSwapBuffers();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week09 texture");

    glutDisplayFunc(display);
    myTexture("earth.jpg"); ///地球的地圖,等下才會進來
    glutMainLoop();
}
///
    然後按照上禮拜的設定設定OpenCV
    下載一張地球的圖並放到freeglut->lib的資料夾內



二.
    把期中考考的glBegin(GL_POLYGON) 、glEnd()、glTexCoord2f(tx,ty)、glVertex3f(x,y,z)都加main函式就可以執行出地圖了
///
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
int myTexture(char * week09_opencv)
{

    IplImage * img = cvLoadImage(week09_opencv); ///OpenCV讀圖
    cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
    glGenTextures(1, &id); /// 產生Generate 貼圖ID
    glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
}
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    Begin(GL_POLYGON);
            glTexCoord2f(0,1);glVertex2f(-1,-1);
            glTexCoord2f(1,1);glVertex2f(+1,-1);
            glTexCoord2f(1,0);glVertex2f(+1,+1);
            glTexCoord2f(0,0);glVertex2f(-1,+1);
    glEnd();

    glutSwapBuffers();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week09 texture");

    glutDisplayFunc(display);
    myTexture("earth.jpg"); ///地球的地圖,等下才會進來
    glutMainLoop();
}
///
三.
    直接新增一個新glut專案,命名為week10_texture_earth並把剛剛的程式貼上來
///
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
int myTexture(char * week09_opencv)
{

    IplImage * img = cvLoadImage(week09_opencv); ///OpenCV讀圖
    cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
    glGenTextures(1, &id); /// 產生Generate 貼圖ID
    glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
}
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    gluQuadricTexture(sphere, 1);///=設好貼圖
    gluSphere(sphere, 1, 30, 30);///圓球
    /*Begin(GL_POLYGON);
            glTexCoord2f(0,1);glVertex2f(-1,-1);
            glTexCoord2f(1,1);glVertex2f(+1,-1);
            glTexCoord2f(1,0);glVertex2f(+1,+1);
            glTexCoord2f(0,0);glVertex2f(-1,+1);
    glEnd();*/
    glutSwapBuffers();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week09 texture");

    glutDisplayFunc(display);
    myTexture("earth.jpg"); ///地球的地圖,等下才會進來
    sphere = gluNewQuadric();///準備好二次曲面
    glutMainLoop();
}
///


為了讓地球能夠旋轉
新增一個flaot angle=0;
在display() 加入Rotatef(angle,0,0,1)函數(讓地球旋轉)
///
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
int myTexture(char * week09_opencv)
{

    IplImage * img = cvLoadImage(week09_opencv); ///OpenCV讀圖
    cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
    glGenTextures(1, &id); /// 產生Generate 貼圖ID
    glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
}
float angle = 0;///旋轉角度
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    gluQuadricTexture(sphere, 1);///=設好貼圖
    gluSphere(sphere, 1, 30, 30);///圓球
    /*Begin(GL_POLYGON);
            glTexCoord2f(0,1);glVertex2f(-1,-1);
            glTexCoord2f(1,1);glVertex2f(+1,-1);
            glTexCoord2f(1,0);glVertex2f(+1,+1);
            glTexCoord2f(0,0);glVertex2f(-1,+1);
    glEnd();*/
    glutSwapBuffers();
    angle+=0.1;///每次執行display()增加一度
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week09 texture");

    glutDisplayFunc(display);
    myTexture("earth.jpg"); ///地球的地圖,等下才會進來
    sphere = gluNewQuadric();///準備好二次曲面
    glutMainLoop();
}
///
四.
    為了讓地球轉正(1),然後不要破圖(2)
    (1)在display()中新增 glRotatef(90,1,0,0);
    (2)在main函式中 新增 glEnable(GL_DEPTH_TEST); 開啟3D功能
///
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
int myTexture(char * week09_opencv)
{

    IplImage * img = cvLoadImage(week09_opencv); ///OpenCV讀圖
    cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
    glGenTextures(1, &id); /// 產生Generate 貼圖ID
    glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
}
float angle = 0;///旋轉角度
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
        glRotatef(90, 1, 0, 0);
        glRotatef(angle, 0, 0, 1);
        gluQuadricTexture(sphere, 1);///=設好貼圖
        gluSphere(sphere, 1, 30, 30);///圓球
    glPopMatrix();
    /*Begin(GL_POLYGON);
            glTexCoord2f(0,1);glVertex2f(-1,-1);
            glTexCoord2f(1,1);glVertex2f(+1,-1);
            glTexCoord2f(1,0);glVertex2f(+1,+1);
            glTexCoord2f(0,0);glVertex2f(-1,+1);
    glEnd();*/
    glutSwapBuffers();
    angle+=0.1;///每次執行display()增加一度
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week09 texture");

    glEnable(GL_DEPTH_TEST);///開啟3D的功能,看起來比較立體
    glutDisplayFunc(display);
    myTexture("earth.jpg"); ///地球的地圖,等下才會進來
    sphere = gluNewQuadric();///準備好二次曲面
    glutMainLoop();
}
///


VERY BEAUTIFUL, VERY POWERFUL

一.
    打開codeblocks,開啟一個新glut專案week12_TRT,把之前的十行程式碼丟上去,再加上今天剛剛交的T-R-T放上去,然後讓它自動旋轉
///
#include <GL/glut.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle,0,0,1);
        glutSolidTeapot( 0.3 );
    glPopMatrix();
    glutSwapBuffers();
    angle++;
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week12 TRT");

    glutIdleFunc(display);
    glutDisplayFunc(display);
    glutMainLoop();
}
///
二.
    做出一個茶壺人,
///
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,1); ///白色
    glutSolidTeapot(0.3);///茶壺身體
    glPushMatrix();
        glTranslatef(0.2,0,0);///3.將茶壺手臂往右邊移動
        glRotatef(angle,0,0,1); ///2.旋轉
        glTranslatef(0.2,0,0);/// 1.把茶壺手臂旋轉中心放到世界中心
        glColor3f(1,0,0);///紅色
        glutSolidTeapot(0.2);///茶壺手臂
    glPopMatrix();
    glutSwapBuffers();
    angle+=0.5;
///


三.
    把紅色茶壺改成手臂,新增GLUT專案 week12_TRT_TRT,讓它有3D模型
///
#include <GL/glut.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,1); ///白色
    glutSolidTeapot(0.3);///茶壺身體
    glPushMatrix();
        glTranslatef(0.2,0,0);///3.將茶壺手臂往右邊移動
        glRotatef(angle,0,0,1); ///2.旋轉
        glTranslatef(0.2,0,0);/// 1.把茶壺旋轉中心放到世界中心
        glColor3f(1,0,0);///紅色
        glutSolidTeapot(0.2);///茶壺手臂
        glPushMatrix();
            glTranslatef(0.2,0,0);///3.將茶壺手臂往右邊移動
            glRotatef(angle,0,0,1); ///2.旋轉
            glTranslatef(0.2,0,0);/// 1.把茶壺旋轉中心放到世界中心
            glColor3f(1,0,0);///紅色
            glutSolidTeapot(0.2);///茶壺手臂
        glPopMatrix();
    glPopMatrix();

    glPushMatrix();
        glTranslatef(-0.2,0,0);///3.將茶壺手臂往右邊移動
        glRotatef(-angle,0,0,1); ///2.旋轉
        glTranslatef(-0.2,0,0);/// 1.把茶壺旋轉中心放到世界中心
        glColor3f(1,0,0);///紅色
        glutSolidTeapot(0.2);///茶壺手臂
        glPushMatrix();
            glTranslatef(-0.2,0,0);///3.將茶壺手臂往右邊移動
            glRotatef(-angle,0,0,1); ///2.旋轉
            glTranslatef(-0.2,0,0);/// 1.把茶壺旋轉中心放到世界中心
            glColor3f(1,0,0);///紅色
            glutSolidTeapot(0.2);///茶壺手臂
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
    angle+=0.05;
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week12 TRT");

    glutIdleFunc(display);
    glutDisplayFunc(display);
    glutMainLoop();
}
///


讓它變成上述這樣的形狀

VERY BEAUTIFUL, VERY POWERFUL

一.
    到 jsyeh.org/3dcg10 下載 win32、data、source
解壓縮win32跟data資料夾,再把win裡面的Texture.exe打開並理解貼圖座標及頂點的函式
二.
    到moodle的上課用軟體下載OpenCV2.1,安裝時請點選第二項[Add OpenCV to the systemPAYH for all user ]

    安裝路徑不用更改,給自己之後方便設定

三.
    下載後codeblocks重開,建立一個新檔案,命名為week09_opencv.cpp,把以下程式打上去
///

```C++

#include <opencv/highgui.h>//使用opencv外掛

int main ()

{

    IplImage * img = cvLoadImage("檔名.jpg"); //讀圖

    cvShowImage("week09",ing) //秀圖

    cvWaitKey(0); //等待任意鍵繼續

}

///

    然後打開Seetings -> Compiler ->Search directories ->  Compiler -> Add目錄: c:\OpenCV2.1\include


    Seetings -> Compiler ->Search directories -> Linker ->  Add目錄: c:\OpenCV2.1\lib



    Seetings -> Compiler ->Linker Settings -> Linker ->  Add cv210、cxcore210、highgui210

    這樣應該就可以順利讀取圖片了

四.(結合OpenCV跟GLUT)
    到moodle下載glut檔案且解壓縮到桌面,在lib裡面複製(libfreeglut.a)成libglut32.a
在新增一個glut專案,命名為week09_texrure,
圖檔記得要放在C:\Users\sean\桌面\freeglut\bin
///
#include <GL/glut.h>
#include <opencv/highgui.h>
void myTexture()
{
    IplImage * img = cvLoadImage("123.jpg"); //讀圖
    cvShowImage("week09",img); //秀圖
    ///cvWaitKey(0); 可以不用寫因為會有glutMainLoop()卡住
}
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glutSolidTeapot(0.3);
    glutSwapBuffers();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week09 texture");

    glutDisplayFunc(display);
    myTexture();
    glutMainLoop();
}
///
最後在更改一下程式,就可以把圖片貼到茶壺上
///
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
int myTexture(char * week09_opencv)
{

    IplImage * img = cvLoadImage(week09_opencv); ///OpenCV讀圖
    cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
    glGenTextures(1, &id); /// 產生Generate 貼圖ID
    glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
}
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glutSolidTeapot(0.3);
    glutSwapBuffers();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week09 texture");

    glutDisplayFunc(display);

    glutMainLoop();
}
///

VERY BEAUTIFUL, VERY POWERFUL

一.

先從jsyeh.org/3dcg10 下載  data.zip  , windows.zip

data.zip =>下載/windows/data

      windows.zip => 下載/windows

      source.zip=>下載/windows

      執行windows/LightMaterial.exe


二.

    開啟一個新專案,命名為week08_model,從week06_light複製到這周的main.cpp

1.source.zip裡面有三個程式 glm.h  glm.c. lightmaterial.cpp 

      拿裡面的程式來用 便能讀入3D模型

2. 

      glm.c 改名成glm.cpp  並加入到CodeBlock中的week08_model

3. 將data放在desktop/freeglut/bin裡面

4. 將glm.h 、 glm.cpp 放到week08_model資料夾中

///

#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 }; /// -5.0f是亮的 , 5.0是暗的


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();

}



int main(int argc, char **argv )

{

    glutInit( &argc , argv );

    glutInitDisplayMode(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 "glm.h"

GLMmodel*pmodel=NULL;

void

drawmodel(void)

{

    if (!pmodel) {

pmodel = glmReadOBJ("data/soccerball.obj");///或是 data/data/soccerball.obj

if (!pmodel) exit(0);

glmUnitize(pmodel);

glmFacetNormals(pmodel);

glmVertexNormals(pmodel, 90.0);

    }

  glmDraw(pmodel, GLM_SMOOTH);

}///用來畫3d模型的程式碼

///

將茶壺刪掉後新增程式碼,完成今天的程式碼

///

#include <GL/glut.h>

#include "glm.h"

GLMmodel *pmodel = NULL;

void

drawmodel(void)

{

    if(!pmodel) {

        pmodel=glmReadOBJ("data/data/soccerball.obj");

        if(!pmodel) exit(0);

        glmUnitize(pmodel);

        glmFacetNormals(pmodel);

        glmVertexNormals(pmodel,90.0);

    }

    glmDraw(pmodel,GLM_SMOOTH);

}

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 }; /// -5.0f是亮的 , 5.0是暗的


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);

        drawmodel();///執行上面drawmodel函式

    glutSwapBuffers();

}



int main(int argc, char **argv )

{

    glutInit( &argc , argv );

    glutInitDisplayMode(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();///否則卡在這裡,之後的程式,都不會執行到

}

VERY BEAUTIFUL, VERY POWERFUL

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