2024年5月2日 星期四

從0到0.01的電腦圖學 Week11

本週主題

(1) 主題: T-R-T 與模型

(2) Maya 切割、匯出OBJ

(3) 鍵盤切換關節、滑鼠控制角度

(4) 介紹歷屆考題(T-R-T轉動)、下週小考

1. GLUT程式1

將上週 week10-1 glutWireCube_myBody_myArm (Week10 GLUT程式1) 程式貼來做使用,將TRT的部分做修改

#include <GL/glut.h>
void myBody(){
    glPushMatrix();
        glColor3f(1,0,0); ///red
        glutWireCube(0.6);
glPopMatrix();
}
void myArm(){
    glPushMatrix();
        glColor3f(0,1,0); ///green
        glScalef(1,0.4,0.4);
        glutWireCube(0.3);
glPopMatrix();
}
float angle = 0;
void display(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    myBody();
    glPushMatrix();
        glTranslatef(0.3, 0.3, 0); ///將物件移動至對的位置
        glRotatef(angle+=0.5, 0, 0, 1); ///旋轉
        glTranslatef(0.15, 0, 0); ///將關節放在旋轉中心
        myArm();
    glPopMatrix();
    glutSwapBuffers();
}
int main(int argc, char*argv[]){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week11-1");
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop();
}

2. OpenCV+GLUT程式1

week08-3 glm_gundam_opencv_texture_lighting找出來後下載下來(於github),若無檔案,請照著week08的程式步驟做,若有檔案請依照下面步驟改檔名

a. 資料夾名稱
b. 改.cbp檔的名稱
c. 在code::blocks上開啟專案(.cbp)後,右鍵該檔案,找到Properties...修改檔案名稱

在Maya軟體中切割模型(左、右臂),匯出.obj檔,並將檔案放入data的資料夾中

將之前繪製方塊的myBody()函數加上,接著調整顏色,並注意貼圖會影響顏色的呈現,最後調整T-R-T的參數,使其放置到適合的位置上

#include <GL/glut.h>
#include "glm.h"
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
int myTexture(char * filename)
{
    IplImage * img = cvLoadImage(filename); ///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;
}
///GLMmodel* pmodel = NULL;
GLMmodel* left_hand = NULL;
GLMmodel* right_hand = NULL;
void l_hand(void){
    if (!left_hand){
        left_hand = glmReadOBJ("data/left_hand.obj");
        if (!left_hand) exit(0);
        glmUnitize(left_hand);
        glmFacetNormals(left_hand);
        glmVertexNormals(left_hand, 90.0);
    }
    glmDraw(left_hand, GLM_SMOOTH | GLM_TEXTURE);
}
void r_hand(void){
    if (!right_hand){
        right_hand = glmReadOBJ("data/right_hand.obj");
        if (!right_hand) exit(0);
        glmUnitize(right_hand);
        glmFacetNormals(right_hand);
        glmVertexNormals(right_hand, 90.0);
    }
    glmDraw(right_hand, GLM_SMOOTH | GLM_TEXTURE);
}
void myBody(){
    glPushMatrix();
        glColor3f(0.2,0.8,0.8);
        glutSolidCube(0.6);
    glPopMatrix();
}

float angle=0;
void display(){
    glPushMatrix();
        glRotatef(180,0,1,0);
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glDisable(GL_TEXTURE_2D);  ///先將貼圖功能關閉再繪製身體,以免顏色被貼圖影響
        myBody();
        glEnable(GL_TEXTURE_2D);
        glColor3f(1,1,1); ///將顏色設為白色
        glPushMatrix();
            glTranslated(0.3,0.3,-0.3);
            glRotatef(angle+=0.5,1,0,0);
            glTranslated(0,-0.3,0);
            r_hand();
        glPopMatrix();
        glPushMatrix();
            glTranslated(-0.3,0.3,-0.3);
            glRotatef(angle+=0.5,1,0,0);
            glTranslated(0,-0.3,0);
            l_hand();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
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 };
int main(int argc, char *argv[]){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week11-2");
    glutIdleFunc(display);
    glutDisplayFunc(display);
    myTexture("data/Diffuse.jpg");
    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();
}
どうして何時迄も僕は深く
為什麼不論何時我都過度地
その目の意味を飲み込んでいくのか
理解那目光的意義
何を守って荊も無い
如果只選擇沒有荊棘的道路走下去
道だけを選んで歩いているのか
還要守護些什麼

抱え込んだ
承攬著的
捨てられたはずなのに
明明應該捨棄

どうして何時からか僕は弱く
為什麼不知從何時開始我都軟弱地
君の視線から逃げていたのか?
逃避著你的視線?
何度、何度でも君のもとへ
只是無數次、無數次地向著你的方向
この手を伸ばすだけ
伸出這雙手

止まって、届いて
停止吧、 傳達吧
僕の声が
我的聲音
どこまでも響くほど鳴ったなら
倘若不論何處都能響徹
君を救ってあげられただろう
是不是就能拯救你呢
拍手を掻き消した
掌聲消失了
あの夕暮れに
在那夕陽之中
----傍観の罪科,*Luna

沒有留言:

張貼留言