本週主題:
(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();
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();
}
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(){
#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();
}
}
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
沒有留言:
張貼留言