2019電腦圖學 Computer Graphics 授課教師: 葉正聖 銘傳大學資訊傳播工程系 每週主題: 程式環境、點線面顏色、移動/旋轉/縮放與矩陣(Matrix)、階層性關節轉動(T-R-T)、做出機器人、打光、貼圖、glu/glut函式、鍵盤、滑鼠、計時器(timer)、讀入3D模型、粒子系統、聲音、特效、投影矩陣、攝影機與運鏡、機器人2.0、期末作品
2019年6月14日 星期五
2019年5月31日 星期五
week15
1.試著滑動攝影機跟運鏡 看看哪些座標值會移動到哪些位置
看看中心點的人物改變

2.接下來試著自己用codeblock寫出來
要去載 source.zip 把glm.h glm.c移進專案資料夾
記得把glm.c改成glm.cpp
在codeblock 專案add file
執行結果 就可以出現白色人的背景

程式碼
#include <GL/glut.h>
#include "glm.h" ///for glmReadOBJ(), glmDraw(), glmUnitized()....
GLMmodel * pmodel=NULL;///NOW
void drawmodel(void)
{
if (!pmodel) {
pmodel = glmReadOBJ("data/al.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawmodel();
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("week15");
glutDisplayFunc(display);
glutMainLoop();
}
3.然後 想要白色人有彩色的顏色
增加幾行程式碼加上把運鏡調成正面照
執行結果

程式碼
#include <GL/glut.h>
#include "glm.h" ///for glmReadOBJ(), glmDraw(), glmUnitized()....
GLMmodel * pmodel=NULL;///NOW
void drawmodel(void)
{
if (!pmodel) {
pmodel = glmReadOBJ("data/al.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawmodel();
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("week15");
glutDisplayFunc(display);
GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };///NOW2 打光的位置
glEnable(GL_DEPTH_TEST);///NOW2 有立體的功能
glEnable(GL_LIGHT0); ///NOW2 打光後變立體的彩色的
glEnable(GL_LIGHTING); ///NOW2 打光後變立體的彩色的
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);///NOW2 打光的位置
glutMainLoop();
}
3.利用運鏡讓他有旋轉的效果

程式碼
#include <GL/glut.h>
#include "glm.h" ///for glmReadOBJ(), glmDraw(), glmUnitized()....
GLMmodel * pmodel=NULL;///NOW
void drawmodel(void)
{
if (!pmodel) {
pmodel = glmReadOBJ("data/al.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawmodel();
glutSwapBuffers();
}
#include <math.h>
float eyeX=1, eyeY=0, eyeZ=0;
void timer(int t)///NOW3
{
glutTimerFunc(33, timer, t+1);///NOW3
float angle=t/180.0*3.1415926;///NOW3 算出一個角度
eyeX=cos(angle); eyeZ=sin(angle);///NOW3
glMatrixMode(GL_MODELVIEW);///NOW3
glLoadIdentity();///NOW3
gluLookAt(eyeX, eyeY, eyeZ, ///NOW3 LookAt的 eye
0.0, 0.8, 0.0, ///NOW3 LookAt的 center
0, 1, 0);///NOW3 LookAt的 up
glutPostRedisplay();///NOW3 Re-display
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("week15");
glutDisplayFunc(display);
glutTimerFunc(33, timer, 0);///NOW3
GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };///NOW2 打光的位置
glEnable(GL_DEPTH_TEST);///NOW2 有立體的功能
glEnable(GL_LIGHT0); ///NOW2 打光後變立體的彩色的
glEnable(GL_LIGHTING); ///NOW2 打光後變立體的彩色的
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);///NOW2 打光的位置
glutMainLoop();
}
4.前兩節課教的結合就可以讓有顏色的人物跟著運競藝起旋轉展示
先來看看 周董的 MV
看看中心點的人物改變

2.接下來試著自己用codeblock寫出來
要去載 source.zip 把glm.h glm.c移進專案資料夾
記得把glm.c改成glm.cpp
在codeblock 專案add file
執行結果 就可以出現白色人的背景

程式碼
#include <GL/glut.h>
#include "glm.h" ///for glmReadOBJ(), glmDraw(), glmUnitized()....
GLMmodel * pmodel=NULL;///NOW
void drawmodel(void)
{
if (!pmodel) {
pmodel = glmReadOBJ("data/al.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawmodel();
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("week15");
glutDisplayFunc(display);
glutMainLoop();
}
3.然後 想要白色人有彩色的顏色
增加幾行程式碼加上把運鏡調成正面照
執行結果

程式碼
#include <GL/glut.h>
#include "glm.h" ///for glmReadOBJ(), glmDraw(), glmUnitized()....
GLMmodel * pmodel=NULL;///NOW
void drawmodel(void)
{
if (!pmodel) {
pmodel = glmReadOBJ("data/al.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawmodel();
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("week15");
glutDisplayFunc(display);
GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };///NOW2 打光的位置
glEnable(GL_DEPTH_TEST);///NOW2 有立體的功能
glEnable(GL_LIGHT0); ///NOW2 打光後變立體的彩色的
glEnable(GL_LIGHTING); ///NOW2 打光後變立體的彩色的
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);///NOW2 打光的位置
glutMainLoop();
}
3.利用運鏡讓他有旋轉的效果

程式碼
#include <GL/glut.h>
#include "glm.h" ///for glmReadOBJ(), glmDraw(), glmUnitized()....
GLMmodel * pmodel=NULL;///NOW
void drawmodel(void)
{
if (!pmodel) {
pmodel = glmReadOBJ("data/al.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawmodel();
glutSwapBuffers();
}
#include <math.h>
float eyeX=1, eyeY=0, eyeZ=0;
void timer(int t)///NOW3
{
glutTimerFunc(33, timer, t+1);///NOW3
float angle=t/180.0*3.1415926;///NOW3 算出一個角度
eyeX=cos(angle); eyeZ=sin(angle);///NOW3
glMatrixMode(GL_MODELVIEW);///NOW3
glLoadIdentity();///NOW3
gluLookAt(eyeX, eyeY, eyeZ, ///NOW3 LookAt的 eye
0.0, 0.8, 0.0, ///NOW3 LookAt的 center
0, 1, 0);///NOW3 LookAt的 up
glutPostRedisplay();///NOW3 Re-display
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("week15");
glutDisplayFunc(display);
glutTimerFunc(33, timer, 0);///NOW3
GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };///NOW2 打光的位置
glEnable(GL_DEPTH_TEST);///NOW2 有立體的功能
glEnable(GL_LIGHT0); ///NOW2 打光後變立體的彩色的
glEnable(GL_LIGHTING); ///NOW2 打光後變立體的彩色的
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);///NOW2 打光的位置
glutMainLoop();
}
4.前兩節課教的結合就可以讓有顏色的人物跟著運競藝起旋轉展示
先來看看 周董的 MV
https://www.youtube.com/watch?v=me7jfhFIZvk
執行結果


程式碼
#include <GL/glut.h>
#include "glm.h" ///for glmReadOBJ(), glmDraw(), glmUnitized()....
GLMmodel * pmodel=NULL;///NOW
void drawmodel(void)
{
if (!pmodel) {
pmodel = glmReadOBJ("data/al.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawmodel();
glutSwapBuffers();
}
#include <math.h>
float eyeX=1, eyeY=0, eyeZ=0;
void timer(int t)///NOW3
{
glutTimerFunc(33, timer, t+1);///NOW3
float angle=t/180.0*3.1415926;///NOW3 算出一個角度
eyeX=cos(angle); eyeZ=sin(angle);///NOW3
glMatrixMode(GL_PROJECTION);///NOW4
glLoadIdentity();///NOW4
glOrtho(-1,+1, -1,+1, -10,+10);///NOW4 可以看到範圍比較大的投影法
glMatrixMode(GL_MODELVIEW);///NOW3
glLoadIdentity();///NOW3
gluLookAt(eyeX, 1.3, eyeZ, ///NOW3 LookAt的 eye
0.0, -0.4, 0.0, ///NOW3 LookAt的 center
0, 1, 0);///NOW3 LookAt的 up
glutPostRedisplay();///NOW3 Re-display
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("week15");
glutDisplayFunc(display);
glutTimerFunc(33, timer, 0);///NOW3
GLfloat light_pos[] = { 0.0, 0.0, 1.0, 0.0 };///NOW2 打光的位置
glEnable(GL_DEPTH_TEST);///NOW2 有立體的功能
glEnable(GL_LIGHT0); ///NOW2 打光後變立體的彩色的
glEnable(GL_LIGHTING); ///NOW2 打光後變立體的彩色的
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);///NOW2 打光的位置
glutMainLoop();
}
執行結果


程式碼
#include <GL/glut.h>
#include "glm.h" ///for glmReadOBJ(), glmDraw(), glmUnitized()....
GLMmodel * pmodel=NULL;///NOW
void drawmodel(void)
{
if (!pmodel) {
pmodel = glmReadOBJ("data/al.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawmodel();
glutSwapBuffers();
}
#include <math.h>
float eyeX=1, eyeY=0, eyeZ=0;
void timer(int t)///NOW3
{
glutTimerFunc(33, timer, t+1);///NOW3
float angle=t/180.0*3.1415926;///NOW3 算出一個角度
eyeX=cos(angle); eyeZ=sin(angle);///NOW3
glMatrixMode(GL_PROJECTION);///NOW4
glLoadIdentity();///NOW4
glOrtho(-1,+1, -1,+1, -10,+10);///NOW4 可以看到範圍比較大的投影法
glMatrixMode(GL_MODELVIEW);///NOW3
glLoadIdentity();///NOW3
gluLookAt(eyeX, 1.3, eyeZ, ///NOW3 LookAt的 eye
0.0, -0.4, 0.0, ///NOW3 LookAt的 center
0, 1, 0);///NOW3 LookAt的 up
glutPostRedisplay();///NOW3 Re-display
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("week15");
glutDisplayFunc(display);
glutTimerFunc(33, timer, 0);///NOW3
GLfloat light_pos[] = { 0.0, 0.0, 1.0, 0.0 };///NOW2 打光的位置
glEnable(GL_DEPTH_TEST);///NOW2 有立體的功能
glEnable(GL_LIGHT0); ///NOW2 打光後變立體的彩色的
glEnable(GL_LIGHTING); ///NOW2 打光後變立體的彩色的
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);///NOW2 打光的位置
glutMainLoop();
}
5.調整運鏡的遠近 看的視野就不一樣
把原本的運鏡隱藏 用gluPerspective
程式碼
#include <GL/glut.h>
#include "glm.h" ///for glmReadOBJ(), glmDraw(), glmUnitized()....
GLMmodel * pmodel=NULL;///NOW
void drawmodel(void)
{
if (!pmodel) {
pmodel = glmReadOBJ("data/al.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawmodel();
glutSwapBuffers();
}
#include <math.h>
float eyeX=1, eyeY=0, eyeZ=0;
void timer(int t)///NOW3
{
glutTimerFunc(33, timer, t+1);///NOW3
float angle=t/180.0*3.1415926;///NOW3 算出一個角度
eyeX=cos(angle); eyeZ=sin(angle);///NOW3
glMatrixMode(GL_PROJECTION);///NOW4
glLoadIdentity();///NOW4
gluPerspective(100, 1, 0.001, 1000);///NOW5
///glOrtho(-1,+1, -1,+1, -10,+10);///NOW4 可以看到範圍比較大的投影法
glMatrixMode(GL_MODELVIEW);///NOW3
glLoadIdentity();///NOW3
gluLookAt(eyeX, 1, eyeZ, ///NOW3 LookAt的 eye
0.0, -0.2, 0.0, ///NOW3 LookAt的 center
0, 1, 0);///NOW3 LookAt的 up
glutPostRedisplay();///NOW3 Re-display
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("week15");
glutDisplayFunc(display);
glutTimerFunc(33, timer, 0);///NOW3
GLfloat light_pos[] = { 0.0, 0.0, 1.0, 0.0 };///NOW2 打光的位置
glEnable(GL_DEPTH_TEST);///NOW2 有立體的功能
glEnable(GL_LIGHT0); ///NOW2 打光後變立體的彩色的
glEnable(GL_LIGHTING); ///NOW2 打光後變立體的彩色的
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);///NOW2 打光的位置
glutMainLoop();
}
執行結果
2019年5月24日 星期五
week14
1.學會用timer函式
先利用Timer讓聲音在幾秒鐘出來

去wav網站上下載聲音
要記得把聲音檔放在 in C:\Users\user\Desktop\freeglut\bin 裡


程式碼
#include <GL/glut.h>
#include <mmsystem.h>///NOW (0)發聲音
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSwapBuffers();
}
void timer(int t)///NOW (2)
{
glutTimerFunc(1000, timer, 0);///NOW2間隔一秒持續撥放
PlaySoundA("Femaleha.wav", NULL, SND_ASYNC);///NOW (2)
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);///大一點
glutCreateWindow("week14 timer");
glutDisplayFunc(display);
glutTimerFunc(1000, timer, 0);///NOW (1)
1000代表一秒鐘
glutMainLoop();
}

#include <GL/glut.h>
#include <mmsystem.h>///NOW (0)發聲音
#include <stdio.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();
}
void timer(int t)///NOW (2)
{
glutTimerFunc(30, timer, t+1);///NOW2間隔一秒持續撥放
printf("現在的 timer的T是:%d\n",t);
///PlaySoundA("Femaleha.wav", NULL, SND_ASYNC);///NOW (2)
angle=t;
glutPostRedisplay();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);///大一點
glutCreateWindow("week14 timer");
glutDisplayFunc(display);
glutTimerFunc(1000, timer, 0);///NOW (1)
///1000代表一秒鐘
glutMainLoop();
}
2.內插公式

程式碼
#include <GL/glut.h>
#include <mmsystem.h>///NOW (0)發聲音
#include <stdio.h>
float angle=0;
float nowX=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
/// glRotatef(angle,0,0,1);
glTranslated(nowX,0,0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
void timer(int t)///NOW (2)
{
glutTimerFunc(30, timer, t+1);///NOW2間隔一秒持續撥放
printf("現在的 timer的T是:%d\n",t);
///PlaySoundA("Femaleha.wav", NULL, SND_ASYNC);///NOW (2)
/// angle=t;
float alpha=(t%30)/30.0;
nowX = alpha*1.0+(1-alpha)*-1.0;
glutPostRedisplay();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);///大一點
glutCreateWindow("week14 timer");
glutDisplayFunc(display);
glutTimerFunc(1000, timer, 0);///NOW (1)
///1000代表一秒鐘
glutMainLoop();
}
先利用Timer讓聲音在幾秒鐘出來

去wav網站上下載聲音
要記得把聲音檔放在 in C:\Users\user\Desktop\freeglut\bin 裡


程式碼
#include <GL/glut.h>
#include <mmsystem.h>///NOW (0)發聲音
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSwapBuffers();
}
void timer(int t)///NOW (2)
{
glutTimerFunc(1000, timer, 0);///NOW2間隔一秒持續撥放
PlaySoundA("Femaleha.wav", NULL, SND_ASYNC);///NOW (2)
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);///大一點
glutCreateWindow("week14 timer");
glutDisplayFunc(display);
glutTimerFunc(1000, timer, 0);///NOW (1)
1000代表一秒鐘
glutMainLoop();
}

#include <GL/glut.h>
#include <mmsystem.h>///NOW (0)發聲音
#include <stdio.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();
}
void timer(int t)///NOW (2)
{
glutTimerFunc(30, timer, t+1);///NOW2間隔一秒持續撥放
printf("現在的 timer的T是:%d\n",t);
///PlaySoundA("Femaleha.wav", NULL, SND_ASYNC);///NOW (2)
angle=t;
glutPostRedisplay();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);///大一點
glutCreateWindow("week14 timer");
glutDisplayFunc(display);
glutTimerFunc(1000, timer, 0);///NOW (1)
///1000代表一秒鐘
glutMainLoop();
}
2.內插公式

程式碼
#include <GL/glut.h>
#include <mmsystem.h>///NOW (0)發聲音
#include <stdio.h>
float angle=0;
float nowX=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
/// glRotatef(angle,0,0,1);
glTranslated(nowX,0,0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
void timer(int t)///NOW (2)
{
glutTimerFunc(30, timer, t+1);///NOW2間隔一秒持續撥放
printf("現在的 timer的T是:%d\n",t);
///PlaySoundA("Femaleha.wav", NULL, SND_ASYNC);///NOW (2)
/// angle=t;
float alpha=(t%30)/30.0;
nowX = alpha*1.0+(1-alpha)*-1.0;
glutPostRedisplay();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);///大一點
glutCreateWindow("week14 timer");
glutDisplayFunc(display);
glutTimerFunc(1000, timer, 0);///NOW (1)
///1000代表一秒鐘
glutMainLoop();
}
2019年5月17日 星期五
week13
1.今天第一節課教 如何開檔
打開codeblack專案 console application
然後再修改裡面的程式碼


2.第二節課 複習之前所教的 TRT轉動 增加茶壺來當右手臂跟左手臂
首先 先打上茶壺的10行程式碼

加上 另一個茶壺 和TRT轉動

最後加上左右手臂一樣也能轉動
程式碼:
#include <GL/glut.h>
float angle[20];///NOW
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///body
glColor3f(1,1,1);///white
glutSolidTeapot( 0.3 );///body
glPushMatrix();///right Arm
glTranslatef(0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right upper arm
glPushMatrix();///right Arm
glTranslatef(0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right upper arm
glPopMatrix();
glPopMatrix();
glPushMatrix();///left Arm
glTranslatef(-0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right upper arm
glPushMatrix();///left Arm
glTranslatef(-0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right upper arm
glPopMatrix();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int oldX;///NOW
void mouse(int button, int state, int x, int y)///NOW
{
oldX = x;///NOW
}
void motion(int x, int y)///NOW
{
angle[1] += (x-oldX);///NOW
oldX = x;///NOW
display();///NOW
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);///我們可以開很大的視窗
glutCreateWindow("week 13 motion TRT angle file");
glutMouseFunc(mouse);///NOW
glutMotionFunc(motion);///NOW
glutDisplayFunc(display);
glutMainLoop();
}
執行結果

3.最後一節課 也是最重要的 要能控制關節的轉動跟讀檔存檔
利用上一堂課教KEYBOARD 的涵式來控制
新增變數 angleID來一個一個控制關節旋轉的角度
加上keyboard 控制鍵
程式碼
#include <GL/glut.h>
float angle[20];///NOW
int angleID=1;///第幾個要轉動的關節 ///NOW3
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///body
glColor3f(1,1,1);///white
glutSolidTeapot( 0.3 );///body
glPushMatrix();///right Arm
glTranslatef(0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right upper arm
glPushMatrix();///NOW2 長出下手臂
glTranslatef(0.18, 0, 0);///(3)掛到肘上
glRotatef(angle[2], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right lower arm
glPopMatrix();
glPopMatrix();
glPushMatrix();///left Arm
glTranslatef(-0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[3], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///left upper arm
glPushMatrix();///NOW2 長出下手臂
glTranslatef(-0.18, 0, 0);///(3)掛到肘上
glRotatef(angle[4], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///left lower arm
glPopMatrix();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int oldX;///NOW
void mouse(int button, int state, int x, int y)///NOW
{
oldX = x;///NOW
}
void motion(int x, int y)///NOW
{
angle[angleID] += (x-oldX);///NOW ///NOW3
oldX = x;///NOW
display();///NOW
}
void keyboard(unsigned char key, int x, int y)///NOW3
{
if(key=='1') angleID=1;///NOW3
if(key=='2') angleID=2;///NOW3
if(key=='3') angleID=3;///NOW3
if(key=='4') angleID=4;///NOW3
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);///我們可以開很大的視窗
glutCreateWindow("week 13 motion TRT angle file");
glutKeyboardFunc(keyboard);///NOW3
glutMouseFunc(mouse);///NOW
glutMotionFunc(motion);///NOW
glutDisplayFunc(display);
glutMainLoop();
}
加上寫檔
一樣加keyboard R
執行結果

程式碼
#include <stdio.h> ///(0) ///NOW4
#include <GL/glut.h>
FILE * fout=NULL;///(1) ///NOW4
FILE * fin =NULL;///(1) ///NOW5
float angle[20];///NOW
int angleID=1;///第幾個要轉動的關節 ///NOW3
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///body
glColor3f(1,1,1);///white
glutSolidTeapot( 0.3 );///body
glPushMatrix();///right Arm
glTranslatef(0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right upper arm
glPushMatrix();///NOW2 長出下手臂
glTranslatef(0.18, 0, 0);///(3)掛到肘上
glRotatef(angle[2], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right lower arm
glPopMatrix();
glPopMatrix();
glPushMatrix();///left Arm
glTranslatef(-0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[3], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///left upper arm
glPushMatrix();///NOW2 長出下手臂
glTranslatef(-0.18, 0, 0);///(3)掛到肘上
glRotatef(angle[4], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///left lower arm
glPopMatrix();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int oldX;///NOW
void mouse(int button, int state, int x, int y)///NOW
{
oldX = x;///NOW
}
void motion(int x, int y)///NOW
{
angle[angleID] += (x-oldX);///NOW ///NOW3
oldX = x;///NOW
if(fout==NULL) fout=fopen("motion.txt", "w+");///NOW4
for(int i=0; i<20; i++){///NOW4
printf( "%.1f ", angle[i]);///NOW4
fprintf( fout, "%.1f ", angle[i]);///NOW4
}
printf("\n");///NOW4
fprintf(fout, "\n");///NOW4
display();///NOW
}
void keyboard(unsigned char key, int x, int y)///NOW3
{
if(key=='1') angleID=1;///NOW3
if(key=='2') angleID=2;///NOW3
if(key=='3') angleID=3;///NOW3
if(key=='4') angleID=4;///NOW3
if(key=='w' || key=='W'){///NOW4 小寫的 w
if(fout==NULL) fout=fopen("motion.txt", "w+");///NOW4
for(int i=0; i<20; i++){///NOW4
printf( "%.1f ", angle[i]);///NOW4
fprintf( fout, "%.1f ", angle[i]);///NOW4
}
printf("\n");///NOW4
fprintf(fout, "\n");///NOW4
}
if(key=='r'){///NOW5
if(fin==NULL) fin = fopen("motion.txt", "r");///NOW5
for(int i=0; i<20;i++){///NOW5
fscanf(fin, "%f", &angle[i]);///NOW5
}///NOW5
}
glutPostRedisplay();///和 display()很像,但更好 ///NOW5
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);///我們可以開很大的視窗
glutCreateWindow("week 13 motion TRT angle file");
glutKeyboardFunc(keyboard);///NOW3
glutMouseFunc(mouse);///NOW
glutMotionFunc(motion);///NOW
glutDisplayFunc(display);
glutMainLoop();
}
打開codeblack專案 console application
然後再修改裡面的程式碼


2.第二節課 複習之前所教的 TRT轉動 增加茶壺來當右手臂跟左手臂
首先 先打上茶壺的10行程式碼

加上 另一個茶壺 和TRT轉動

最後加上左右手臂一樣也能轉動
程式碼:
#include <GL/glut.h>
float angle[20];///NOW
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///body
glColor3f(1,1,1);///white
glutSolidTeapot( 0.3 );///body
glPushMatrix();///right Arm
glTranslatef(0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right upper arm
glPushMatrix();///right Arm
glTranslatef(0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right upper arm
glPopMatrix();
glPopMatrix();
glPushMatrix();///left Arm
glTranslatef(-0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right upper arm
glPushMatrix();///left Arm
glTranslatef(-0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right upper arm
glPopMatrix();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int oldX;///NOW
void mouse(int button, int state, int x, int y)///NOW
{
oldX = x;///NOW
}
void motion(int x, int y)///NOW
{
angle[1] += (x-oldX);///NOW
oldX = x;///NOW
display();///NOW
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);///我們可以開很大的視窗
glutCreateWindow("week 13 motion TRT angle file");
glutMouseFunc(mouse);///NOW
glutMotionFunc(motion);///NOW
glutDisplayFunc(display);
glutMainLoop();
}

3.最後一節課 也是最重要的 要能控制關節的轉動跟讀檔存檔
利用上一堂課教KEYBOARD 的涵式來控制
新增變數 angleID來一個一個控制關節旋轉的角度
加上keyboard 控制鍵
程式碼
#include <GL/glut.h>
float angle[20];///NOW
int angleID=1;///第幾個要轉動的關節 ///NOW3
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///body
glColor3f(1,1,1);///white
glutSolidTeapot( 0.3 );///body
glPushMatrix();///right Arm
glTranslatef(0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right upper arm
glPushMatrix();///NOW2 長出下手臂
glTranslatef(0.18, 0, 0);///(3)掛到肘上
glRotatef(angle[2], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right lower arm
glPopMatrix();
glPopMatrix();
glPushMatrix();///left Arm
glTranslatef(-0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[3], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///left upper arm
glPushMatrix();///NOW2 長出下手臂
glTranslatef(-0.18, 0, 0);///(3)掛到肘上
glRotatef(angle[4], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///left lower arm
glPopMatrix();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int oldX;///NOW
void mouse(int button, int state, int x, int y)///NOW
{
oldX = x;///NOW
}
void motion(int x, int y)///NOW
{
angle[angleID] += (x-oldX);///NOW ///NOW3
oldX = x;///NOW
display();///NOW
}
void keyboard(unsigned char key, int x, int y)///NOW3
{
if(key=='1') angleID=1;///NOW3
if(key=='2') angleID=2;///NOW3
if(key=='3') angleID=3;///NOW3
if(key=='4') angleID=4;///NOW3
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);///我們可以開很大的視窗
glutCreateWindow("week 13 motion TRT angle file");
glutKeyboardFunc(keyboard);///NOW3
glutMouseFunc(mouse);///NOW
glutMotionFunc(motion);///NOW
glutDisplayFunc(display);
glutMainLoop();
}
執行結果
再來加上開檔
跟第一節課一樣加上程式碼
只是另外在keyboard程式碼中家小寫W的指令
執行結果
加上寫檔
一樣加keyboard R
執行結果

程式碼
#include <stdio.h> ///(0) ///NOW4
#include <GL/glut.h>
FILE * fout=NULL;///(1) ///NOW4
FILE * fin =NULL;///(1) ///NOW5
float angle[20];///NOW
int angleID=1;///第幾個要轉動的關節 ///NOW3
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///body
glColor3f(1,1,1);///white
glutSolidTeapot( 0.3 );///body
glPushMatrix();///right Arm
glTranslatef(0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right upper arm
glPushMatrix();///NOW2 長出下手臂
glTranslatef(0.18, 0, 0);///(3)掛到肘上
glRotatef(angle[2], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right lower arm
glPopMatrix();
glPopMatrix();
glPushMatrix();///left Arm
glTranslatef(-0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[3], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///left upper arm
glPushMatrix();///NOW2 長出下手臂
glTranslatef(-0.18, 0, 0);///(3)掛到肘上
glRotatef(angle[4], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///left lower arm
glPopMatrix();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int oldX;///NOW
void mouse(int button, int state, int x, int y)///NOW
{
oldX = x;///NOW
}
void motion(int x, int y)///NOW
{
angle[angleID] += (x-oldX);///NOW ///NOW3
oldX = x;///NOW
if(fout==NULL) fout=fopen("motion.txt", "w+");///NOW4
for(int i=0; i<20; i++){///NOW4
printf( "%.1f ", angle[i]);///NOW4
fprintf( fout, "%.1f ", angle[i]);///NOW4
}
printf("\n");///NOW4
fprintf(fout, "\n");///NOW4
display();///NOW
}
void keyboard(unsigned char key, int x, int y)///NOW3
{
if(key=='1') angleID=1;///NOW3
if(key=='2') angleID=2;///NOW3
if(key=='3') angleID=3;///NOW3
if(key=='4') angleID=4;///NOW3
if(key=='w' || key=='W'){///NOW4 小寫的 w
if(fout==NULL) fout=fopen("motion.txt", "w+");///NOW4
for(int i=0; i<20; i++){///NOW4
printf( "%.1f ", angle[i]);///NOW4
fprintf( fout, "%.1f ", angle[i]);///NOW4
}
printf("\n");///NOW4
fprintf(fout, "\n");///NOW4
}
if(key=='r'){///NOW5
if(fin==NULL) fin = fopen("motion.txt", "r");///NOW5
for(int i=0; i<20;i++){///NOW5
fscanf(fin, "%f", &angle[i]);///NOW5
}///NOW5
}
glutPostRedisplay();///和 display()很像,但更好 ///NOW5
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);///我們可以開很大的視窗
glutCreateWindow("week 13 motion TRT angle file");
glutKeyboardFunc(keyboard);///NOW3
glutMouseFunc(mouse);///NOW
glutMotionFunc(motion);///NOW
glutDisplayFunc(display);
glutMainLoop();
}
2019年5月10日 星期五
week12
1. 讓聲音可以出來
打開codeblack專案 console application

修改程式碼
去網站上下載WAV聲音檔 另存新檔

在程式碼上面打上聲音檔的位置
斜線要多打一次
增加功能才能執行


執行結果

2.在我們主程式碼也可以播出音樂
在下面打光程式上增加程式碼
#include <stdio.h>
#include <mmsystem.h>
PlaySoundA("C:\\Users\\user\\Downloads\\ambul.wav", NULL, SND_ASYNC);
printf("邊播聲音.繼續可以開視窗");
本來的SYNC 會播完音樂才出現視窗
改成ASYNC 就可以同時出現
執行結果

3.讓程式碼 可以像鋼琴鍵盤一樣可以打出聲音
對Keybroad 去修改


執行後就可以利用按鍵按出 do re mi fa so
4. 最後讓程式可以用出MP3檔


一樣去下載MP3 照著程式碼 這樣執行就可以了
打開codeblack專案 console application

修改程式碼
去網站上下載WAV聲音檔 另存新檔

在程式碼上面打上聲音檔的位置
斜線要多打一次
增加功能才能執行


執行結果

2.在我們主程式碼也可以播出音樂
在下面打光程式上增加程式碼
#include <stdio.h>
#include <mmsystem.h>
PlaySoundA("C:\\Users\\user\\Downloads\\ambul.wav", NULL, SND_ASYNC);
printf("邊播聲音.繼續可以開視窗");
本來的SYNC 會播完音樂才出現視窗
改成ASYNC 就可以同時出現
執行結果

3.讓程式碼 可以像鋼琴鍵盤一樣可以打出聲音
對Keybroad 去修改


執行後就可以利用按鍵按出 do re mi fa so
4. 最後讓程式可以用出MP3檔


一樣去下載MP3 照著程式碼 這樣執行就可以了
2019年5月3日 星期五
week11
1.今天第一節考上禮拜教的T-R-T轉動
2.一樣練習TRT轉動
先寫出10行茶壺的程式碼
用老師給的程式碼 試試看

加上可以轉動的另一個茶壺

增加第二個

程式碼
#include <GL/glut.h>
float angle=0;///NOW
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///
glutSolidTeapot( 0.3 );///
glPushMatrix();//
glTranslatef(0.2, 0, 0);
glRotatef(angle, 0,0,1);
glTranslatef(0.15, 0,0);
glColor3f(1,0,0);
glutSolidTeapot( 0.15 );
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);
glRotatef(angle, 0,0,1);
glTranslatef(0.15, 0,0);
glColor3f(1,0,0);
glutSolidTeapot( 0.15 );
glPopMatrix();///NOW2
glPopMatrix();
glutSwapBuffers();
angle++;///NOW
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMainLoop();
}
再來是來練習 另一邊也要做出一樣的東西
其實只要複製上面右邊的把手程式碼
然後修改上面glTranslatf()的值 改為相反方向加個負號

不想讓他自己動 用滑鼠控制
執行結果

程式碼
#include <GL/glut.h>
float angle=0;///NOW
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///白色的
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///右邊手臂
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肩
glRotatef(angle, 0,0,1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右手臂
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2
glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///右下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glPushMatrix();///左邊手臂
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肩
glRotatef(-angle, 0,0,1);///(2) 旋轉
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///左手臂
glPushMatrix();///NOW2
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肘///NOW2
glRotatef(-angle, 0,0,1);///(2) 旋轉///NOW2
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///左下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glutSwapBuffers();
//angle++;///NOW
}
void motion(int x,int y)///滑鼠控制
{
angle=x;
display();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMotionFunc(motion);
glutMainLoop();
}
再來試試把滑鼠放開一樣可以繼續用
執行結果


程式碼
#include <GL/glut.h>
float angle=0;///NOW
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///白色的
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///右邊手臂
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肩
glRotatef(angle, 0,0,1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右手臂
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2
glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///右下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glPushMatrix();///左邊手臂
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肩
glRotatef(-angle, 0,0,1);///(2) 旋轉
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///左手臂
glPushMatrix();///NOW2
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肘///NOW2
glRotatef(-angle, 0,0,1);///(2) 旋轉///NOW2
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///左下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glutSwapBuffers();
//angle++;///NOW
}
int oldx, oldy;
void motion(int x,int y)
{
angle+=(x-oldx);
oldx=x;
display();
}
void mouse(int button, int state,int x,int y)
{
oldx=x;
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMotionFunc(motion);
glutMouseFunc(mouse);
glutMainLoop();
}
3.最後讓關節可以分開動
利用鍵盤按鍵 來控制各個關節
執行結果

程式碼
#include <GL/glut.h>
float angle1=0, angle2=0, angle3=0, angle4=0;///NOW ///NOW6 配合鍵盤
int jointID=1;///NOW6 配合鍵盤
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///白色的
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///右邊手臂
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肩
glRotatef(angle1, 0,0,1);///(2) 旋轉 ///NOW6 配合鍵盤
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右手臂
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2
glRotatef(angle2, 0,0,1);///(2) 旋轉///NOW2 ///NOW6 配合鍵盤
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///右下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glPushMatrix();///左邊手臂 ///NOW4 複製左半邊
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肩 ///NOW4 複製左半邊
glRotatef(-angle3, 0,0,1);///(2) 旋轉 ///NOW4 複製左半邊 ///NOW5 angle變負的
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸 ///NOW4 複製左半邊
glColor3f(1,0,0);///紅色的 ///NOW4 複製左半邊
glutSolidTeapot( 0.15 );///左手臂 ///NOW4 複製左半邊
glPushMatrix();///NOW2 ///NOW4 複製左半邊
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肘///NOW2 ///NOW4 複製左半邊
glRotatef(-angle4, 0,0,1);///(2) 旋轉///NOW2 ///NOW4 複製左半邊 ///NOW5 angle變負的
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2 ///NOW4 複製左半邊
glColor3f(1,0,0);///紅色的///NOW2 ///NOW4 複製左半邊
glutSolidTeapot( 0.15 );///左下手臂///NOW2 ///NOW4 複製左半邊
glPopMatrix();///NOW2
glPopMatrix();
glutSwapBuffers();
///angle++;///NOW ///NOW3
}
int oldX, oldY;///NOW5
void motion(int x, int y)///NOW3 用滑鼠mouse來控制angle
{
if(jointID==1) angle1 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==2) angle2 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==3) angle3 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==4) angle4 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
oldX=x;///NOW5
display();///NOW3 用滑鼠mouse來控制angle
}
void mouse(int button, int state, int x, int y)///NOW5 要知道mouse的按鍵狀況
{///NOW5 要知道mouse的按鍵狀況
oldX = x; oldY = y;///NOW5 要知道mouse的按鍵狀況, 按下去時,就記得 oldX
}
void keyboard(unsigned char key, int x, int y)///NOW6 配合鍵盤
{
if(key=='1') jointID=1;///NOW6 配合鍵盤
if(key=='2') jointID=2;///NOW6 配合鍵盤
if(key=='3') jointID=3;///NOW6 配合鍵盤
if(key=='4') jointID=4;///NOW6 配合鍵盤
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMotionFunc(motion);///NOW3 用滑鼠mouse來控制angle
glutMouseFunc(mouse);///NOW5 要知道mouse的按鍵狀況
glutKeyboardFunc(keyboard);///NOW6 配合鍵盤
glutMainLoop();
}
2.一樣練習TRT轉動
先寫出10行茶壺的程式碼
用老師給的程式碼 試試看

加上可以轉動的另一個茶壺

增加第二個

程式碼
#include <GL/glut.h>
float angle=0;///NOW
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///
glutSolidTeapot( 0.3 );///
glPushMatrix();//
glTranslatef(0.2, 0, 0);
glRotatef(angle, 0,0,1);
glTranslatef(0.15, 0,0);
glColor3f(1,0,0);
glutSolidTeapot( 0.15 );
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);
glRotatef(angle, 0,0,1);
glTranslatef(0.15, 0,0);
glColor3f(1,0,0);
glutSolidTeapot( 0.15 );
glPopMatrix();///NOW2
glPopMatrix();
glutSwapBuffers();
angle++;///NOW
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMainLoop();
}
再來是來練習 另一邊也要做出一樣的東西
其實只要複製上面右邊的把手程式碼
然後修改上面glTranslatf()的值 改為相反方向加個負號

不想讓他自己動 用滑鼠控制
執行結果

程式碼
#include <GL/glut.h>
float angle=0;///NOW
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///白色的
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///右邊手臂
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肩
glRotatef(angle, 0,0,1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右手臂
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2
glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///右下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glPushMatrix();///左邊手臂
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肩
glRotatef(-angle, 0,0,1);///(2) 旋轉
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///左手臂
glPushMatrix();///NOW2
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肘///NOW2
glRotatef(-angle, 0,0,1);///(2) 旋轉///NOW2
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///左下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glutSwapBuffers();
//angle++;///NOW
}
void motion(int x,int y)///滑鼠控制
{
angle=x;
display();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMotionFunc(motion);
glutMainLoop();
}
再來試試把滑鼠放開一樣可以繼續用
執行結果


程式碼
#include <GL/glut.h>
float angle=0;///NOW
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///白色的
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///右邊手臂
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肩
glRotatef(angle, 0,0,1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右手臂
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2
glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///右下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glPushMatrix();///左邊手臂
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肩
glRotatef(-angle, 0,0,1);///(2) 旋轉
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///左手臂
glPushMatrix();///NOW2
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肘///NOW2
glRotatef(-angle, 0,0,1);///(2) 旋轉///NOW2
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///左下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glutSwapBuffers();
//angle++;///NOW
}
int oldx, oldy;
void motion(int x,int y)
{
angle+=(x-oldx);
oldx=x;
display();
}
void mouse(int button, int state,int x,int y)
{
oldx=x;
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMotionFunc(motion);
glutMouseFunc(mouse);
glutMainLoop();
}
3.最後讓關節可以分開動
利用鍵盤按鍵 來控制各個關節
執行結果

程式碼
#include <GL/glut.h>
float angle1=0, angle2=0, angle3=0, angle4=0;///NOW ///NOW6 配合鍵盤
int jointID=1;///NOW6 配合鍵盤
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///白色的
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///右邊手臂
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肩
glRotatef(angle1, 0,0,1);///(2) 旋轉 ///NOW6 配合鍵盤
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右手臂
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2
glRotatef(angle2, 0,0,1);///(2) 旋轉///NOW2 ///NOW6 配合鍵盤
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///右下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glPushMatrix();///左邊手臂 ///NOW4 複製左半邊
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肩 ///NOW4 複製左半邊
glRotatef(-angle3, 0,0,1);///(2) 旋轉 ///NOW4 複製左半邊 ///NOW5 angle變負的
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸 ///NOW4 複製左半邊
glColor3f(1,0,0);///紅色的 ///NOW4 複製左半邊
glutSolidTeapot( 0.15 );///左手臂 ///NOW4 複製左半邊
glPushMatrix();///NOW2 ///NOW4 複製左半邊
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肘///NOW2 ///NOW4 複製左半邊
glRotatef(-angle4, 0,0,1);///(2) 旋轉///NOW2 ///NOW4 複製左半邊 ///NOW5 angle變負的
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2 ///NOW4 複製左半邊
glColor3f(1,0,0);///紅色的///NOW2 ///NOW4 複製左半邊
glutSolidTeapot( 0.15 );///左下手臂///NOW2 ///NOW4 複製左半邊
glPopMatrix();///NOW2
glPopMatrix();
glutSwapBuffers();
///angle++;///NOW ///NOW3
}
int oldX, oldY;///NOW5
void motion(int x, int y)///NOW3 用滑鼠mouse來控制angle
{
if(jointID==1) angle1 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==2) angle2 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==3) angle3 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==4) angle4 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
oldX=x;///NOW5
display();///NOW3 用滑鼠mouse來控制angle
}
void mouse(int button, int state, int x, int y)///NOW5 要知道mouse的按鍵狀況
{///NOW5 要知道mouse的按鍵狀況
oldX = x; oldY = y;///NOW5 要知道mouse的按鍵狀況, 按下去時,就記得 oldX
}
void keyboard(unsigned char key, int x, int y)///NOW6 配合鍵盤
{
if(key=='1') jointID=1;///NOW6 配合鍵盤
if(key=='2') jointID=2;///NOW6 配合鍵盤
if(key=='3') jointID=3;///NOW6 配合鍵盤
if(key=='4') jointID=4;///NOW6 配合鍵盤
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMotionFunc(motion);///NOW3 用滑鼠mouse來控制angle
glutMouseFunc(mouse);///NOW5 要知道mouse的按鍵狀況
glutKeyboardFunc(keyboard);///NOW6 配合鍵盤
glutMainLoop();
}
2019年4月26日 星期五
week10
今天教的重點是了解 Translate Rotate 的順序改變會產生怎樣的結果


今天最重要的是了解TRT轉動的用法
首先 先寫出茶壺程式碼 然後再加上一個圓錐

上面加上可以讓他圓錐在X軸轉動的程式碼
之後希望圓錐能在茶壺口轉動就會用到TRT
先把茶壺移成側面 在來是把茶壺能上下轉動(照著Z軸)
最後再把頂點位置對到茶壺口
執行結果

程式碼
#include <GL/glut.h>
float angle =0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0, 0.5,0);
glutWireTeapot(0.3);///茶壺圖形(茶壺大小)
glPopMatrix();
glPushMatrix();
glTranslatef(0.51,0.63,0);
glRotatef(angle,0,0,1);
glTranslatef(0.6,0,0);
glRotatef(-90,0,1,0);
glutWireCone(0.3,0.6,10,10);
glPopMatrix();
glutSwapBuffers();
}
void motion(int x,int y)
{
angle = x;
display();
}
int main(int argc, char **argv)
{
glutInit( &argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Week10 TRT");///視窗名稱
glutDisplayFunc(display);
glutMotionFunc(motion);
glutMainLoop();
}


今天最重要的是了解TRT轉動的用法
首先 先寫出茶壺程式碼 然後再加上一個圓錐

上面加上可以讓他圓錐在X軸轉動的程式碼
之後希望圓錐能在茶壺口轉動就會用到TRT
先把茶壺移成側面 在來是把茶壺能上下轉動(照著Z軸)
最後再把頂點位置對到茶壺口
執行結果

程式碼
#include <GL/glut.h>
float angle =0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0, 0.5,0);
glutWireTeapot(0.3);///茶壺圖形(茶壺大小)
glPopMatrix();
glPushMatrix();
glTranslatef(0.51,0.63,0);
glRotatef(angle,0,0,1);
glTranslatef(0.6,0,0);
glRotatef(-90,0,1,0);
glutWireCone(0.3,0.6,10,10);
glPopMatrix();
glutSwapBuffers();
}
void motion(int x,int y)
{
angle = x;
display();
}
int main(int argc, char **argv)
{
glutInit( &argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Week10 TRT");///視窗名稱
glutDisplayFunc(display);
glutMotionFunc(motion);
glutMainLoop();
}
2019年4月12日 星期五
week08
1.老師先教下下禮拜期中考要考的內容
glpushMatrix();
glTranslatef(x,y,z);
glRotatef(angle,x,y,z);
glScalef();
glBegin(GL_POLYGON);
glColor3f(r,g,b);
glTexCoord2f(tx,ty);
glVertex3f(x,y,z);
glEnd();
glPopMatrix();
10個程式碼的涵式
2. 今天的目標是要能用上貼圖
因為要載入原本的 SGI 檔的圖片很麻煩,所以我門換個方式 去載opencv2.1

選擇第二個 add path

設定在C:/opencv2.1/ 然後就完成了
但在codeblock 要關掉重開
建立新的專案 選擇 console application

選C++ 建立在桌面上

把原本程式碼刪掉 然後打上texture 貼圖的程式碼
#include <opencv/highgui.h>
int main()
{
IplImage * img=cvLoadImage("image.jpg");
cvShowImage("opencv Window",img);
cvWaitKey(0);
}
但執行時還是不能用 要在code block 新增功能




完成之後就能出現貼圖了

3.
在openGL裡面秀出貼圖
程式碼
#include <GL/glut.h>
#include <opencv/highgui.h>
void display()
{
glutSolidTeapot(0.3);///茶壺圖形(茶壺大小)
glutSwapBuffers();
}
int main(int argc, char **argv)
{
IplImage * img=cvLoadImage("cat.jpg");
cvShowImage("opencv Window",img);
cvWaitKey(0);
glutInit( &argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Week03");///視窗名稱
glutDisplayFunc(display);
glutMainLoop();
}
glpushMatrix();
glTranslatef(x,y,z);
glRotatef(angle,x,y,z);
glScalef();
glBegin(GL_POLYGON);
glColor3f(r,g,b);
glTexCoord2f(tx,ty);
glVertex3f(x,y,z);
glEnd();
glPopMatrix();
10個程式碼的涵式
2. 今天的目標是要能用上貼圖
因為要載入原本的 SGI 檔的圖片很麻煩,所以我門換個方式 去載opencv2.1

選擇第二個 add path

設定在C:/opencv2.1/ 然後就完成了
但在codeblock 要關掉重開
建立新的專案 選擇 console application

選C++ 建立在桌面上

把原本程式碼刪掉 然後打上texture 貼圖的程式碼
#include <opencv/highgui.h>
int main()
{
IplImage * img=cvLoadImage("image.jpg");
cvShowImage("opencv Window",img);
cvWaitKey(0);
}




完成之後就能出現貼圖了

3.
在openGL裡面秀出貼圖
程式碼
#include <GL/glut.h>
#include <opencv/highgui.h>
void display()
{
glutSolidTeapot(0.3);///茶壺圖形(茶壺大小)
glutSwapBuffers();
}
int main(int argc, char **argv)
{
IplImage * img=cvLoadImage("cat.jpg");
cvShowImage("opencv Window",img);
cvWaitKey(0);
glutInit( &argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Week03");///視窗名稱
glutDisplayFunc(display);
glutMainLoop();
}
一樣坐上面第二步驟 把圖丟進 freeglut/bin 資料夾
訂閱:
文章 (Atom)



