https://www.youtube.com/watch?v=S4y9HUlWSEg
2015 電腦圖學 Computer Graphics 授課教師: 葉正聖 銘傳大學資訊傳播工程系 每週主題: 程式環境、點線面顏色、移動/旋轉/縮放與矩陣(Matrix)、階層性關節轉動(T-R-T)、做出機器人、打光、貼圖、glu/glut函式、鍵盤、滑鼠、計時器(timer)、讀入3D模型、粒子系統、聲音、特效、投影矩陣、攝影機與運鏡、機器人2.0、期末作品
2015年6月19日 星期五
2015年6月18日 星期四
2015年6月11日 星期四
02160111_鄭庭峰_week16
(1)移動 選轉 縮放
(2)TRT 關節結構
(3)存檔 讀檔 撥放
(4)內插
(5)期末作品
內插程式 :
#include <GL/glut.h>
#include <stdio.h>
FILE * fout=NULL;
FILE * fin=NULL;
float oldX=0, oldY=0;
float angle[10]={0}, angleOld[10], angleNew[10];
int angleID=1;
void drawBody(){
glPushMatrix();
glScalef(1, 0.5, 0.5);
glutSolidCube(1);
glPopMatrix();
}
void drawArm(){
glPushMatrix();
glScalef(0.6, 0.3, 0.3);
glutSolidCube(1);
glPopMatrix();
}
void readNew() ///讀檔案 讀進一筆新的資料
{
if(fin==NULL) fin=fopen("a.txt", "r");
for(int i=0;i<10;i++)
{
angleOld[i]=angleNew[i];
fscanf(fin, "%f", &angleNew[i]);
printf("%f ",angleNew[i]);
}
printf("\n");
}
void display()
{
{ ///Lighting
glColor3ub(166,132,100);
GLfloat pos[]={0, 0, -1, 0};
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glEnable(GL_LIGHT0);
//glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
glPushMatrix();
glTranslatef(0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(angle[1], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm();///這是個Arm ver 1 Right Upper Arm
glPushMatrix();
glTranslatef(0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(angle[2], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm(); ///Right Lower Arm
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(-0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(-angle[3], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm();///這是個Arm ver 1 Left Upper Arm
glPushMatrix();
glTranslatef(-0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(-angle[4], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm(); ///Left Lower Arm
glPopMatrix();
glPopMatrix();
drawBody();
glFlush();
}
void motion(int x, int y)
{ angle[angleID] -= y - oldY;
oldY=y; oldX=x;
/// if(fout==NULL) fout=fopen("a.txt", "w+");
/// for(int i=0;i<10;i++)
/// {
/// printf("%f ",angle[i]);
/// fprintf(fout, "%f ",angle[i]);
/// }
/// printf("\n");
/// fprintf(fout, "\n");
}
void timerPlay(int t) ///計時器 用來做內插的
{
glutTimerFunc(20, timerPlay, t+1);
float a=(t%50)/50.0;
if(t%50==0) readNew();
for(int i=0;i<10;i++)
{
angle[i]=(1-a)*angleOld[i]+(a)*angleNew[i]; ///這是內插公式
}
glutPostRedisplay();
}
void mouse(int button, int state, int x, int y){
if(state==GLUT_DOWN) { oldX=x; oldY=y; }
}
void keyboard(unsigned char key, int x, int y)
{
if(key=='1') angleID=1;
if(key=='2') angleID=2;
if(key=='3') angleID=3;
if(key=='4') angleID=4;
if(key=='p') glutTimerFunc(20, timerPlay, 0);
if(key=='s') ///寫檔案 寫入一筆動作
{
if(fout==NULL) fout=fopen("a.txt", "w+");
for(int i=0;i<10;i++)
{
fprintf(fout, "%.1f ",angle[i]);
printf("%.1f ",angle[i]);
}
fprintf(fout, "\n");
printf("\n");
}
}
void timer(int t)
{
glutTimerFunc(20, timer, t+1);
//angle++;
glutPostRedisplay();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutCreateWindow("T-R-T test");
glutDisplayFunc(display);
glutTimerFunc(20, timer, 0);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
glutMainLoop();
}
執行時 : 先做動作-->按S存檔-->...動作-->S存檔-->....-->都做完了 關視窗 重開按P跑動作
(2)TRT 關節結構
(3)存檔 讀檔 撥放
(4)內插
(5)期末作品
內插程式 :
#include <GL/glut.h>
#include <stdio.h>
FILE * fout=NULL;
FILE * fin=NULL;
float oldX=0, oldY=0;
float angle[10]={0}, angleOld[10], angleNew[10];
int angleID=1;
void drawBody(){
glPushMatrix();
glScalef(1, 0.5, 0.5);
glutSolidCube(1);
glPopMatrix();
}
void drawArm(){
glPushMatrix();
glScalef(0.6, 0.3, 0.3);
glutSolidCube(1);
glPopMatrix();
}
void readNew() ///讀檔案 讀進一筆新的資料
{
if(fin==NULL) fin=fopen("a.txt", "r");
for(int i=0;i<10;i++)
{
angleOld[i]=angleNew[i];
fscanf(fin, "%f", &angleNew[i]);
printf("%f ",angleNew[i]);
}
printf("\n");
}
void display()
{
{ ///Lighting
glColor3ub(166,132,100);
GLfloat pos[]={0, 0, -1, 0};
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glEnable(GL_LIGHT0);
//glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
glPushMatrix();
glTranslatef(0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(angle[1], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm();///這是個Arm ver 1 Right Upper Arm
glPushMatrix();
glTranslatef(0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(angle[2], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm(); ///Right Lower Arm
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(-0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(-angle[3], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm();///這是個Arm ver 1 Left Upper Arm
glPushMatrix();
glTranslatef(-0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(-angle[4], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm(); ///Left Lower Arm
glPopMatrix();
glPopMatrix();
drawBody();
glFlush();
}
void motion(int x, int y)
{ angle[angleID] -= y - oldY;
oldY=y; oldX=x;
/// if(fout==NULL) fout=fopen("a.txt", "w+");
/// for(int i=0;i<10;i++)
/// {
/// printf("%f ",angle[i]);
/// fprintf(fout, "%f ",angle[i]);
/// }
/// printf("\n");
/// fprintf(fout, "\n");
}
void timerPlay(int t) ///計時器 用來做內插的
{
glutTimerFunc(20, timerPlay, t+1);
float a=(t%50)/50.0;
if(t%50==0) readNew();
for(int i=0;i<10;i++)
{
angle[i]=(1-a)*angleOld[i]+(a)*angleNew[i]; ///這是內插公式
}
glutPostRedisplay();
}
void mouse(int button, int state, int x, int y){
if(state==GLUT_DOWN) { oldX=x; oldY=y; }
}
void keyboard(unsigned char key, int x, int y)
{
if(key=='1') angleID=1;
if(key=='2') angleID=2;
if(key=='3') angleID=3;
if(key=='4') angleID=4;
if(key=='p') glutTimerFunc(20, timerPlay, 0);
if(key=='s') ///寫檔案 寫入一筆動作
{
if(fout==NULL) fout=fopen("a.txt", "w+");
for(int i=0;i<10;i++)
{
fprintf(fout, "%.1f ",angle[i]);
printf("%.1f ",angle[i]);
}
fprintf(fout, "\n");
printf("\n");
}
}
void timer(int t)
{
glutTimerFunc(20, timer, t+1);
//angle++;
glutPostRedisplay();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutCreateWindow("T-R-T test");
glutDisplayFunc(display);
glutTimerFunc(20, timer, 0);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
glutMainLoop();
}
執行時 : 先做動作-->按S存檔-->...動作-->S存檔-->....-->都做完了 關視窗 重開按P跑動作
小葉老師詳細的註解~
2015年6月4日 星期四
02160111_鄭庭峰_week15
(1)複習T-R-T
(2)期中作品
(3)做出全身關節
(4)鍵盤滑鼠操控動作
(5)存檔 play播放
複習TRT :
#include <GL/glut.h>
float angle=0, oldX=0, oldY=0;
void drawBody(){
glPushMatrix();
glScalef(1, 0.5, 0.5);
glutSolidCube(1);
glPopMatrix();
}
void drawArm(){
glPushMatrix();
glScalef(0.6, 0.3, 0.3);
glutSolidCube(1);
glPopMatrix();
}
void display()
{
{ ///Lighting
glColor3ub(166,132,100);
GLfloat pos[]={0, 0, -1, 0};
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glEnable(GL_LIGHT0);
//glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
glPushMatrix();
glTranslatef(0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(angle, 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm();///這是個Arm ver 1 Right Upper Arm
glPushMatrix();
glTranslatef(0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(angle, 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm(); ///Right Lower Arm
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(-0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(-angle, 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm();///這是個Arm ver 1 Left Upper Arm
glPushMatrix();
glTranslatef(-0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(-angle, 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm(); ///Left Lower Arm
glPopMatrix();
glPopMatrix();
drawBody();
glFlush();
}
void motion(int x, int y)
{ angle -= y - oldY;
oldY=y; oldX=x;
}
void mouse(int button, int state, int x, int y){
if(state==GLUT_DOWN) { oldX=x; oldY=y; }
}
void timer(int t)
{
glutTimerFunc(20, timer, t+1);
//angle++;
glutPostRedisplay();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutCreateWindow("T-R-T test");
glutDisplayFunc(display);
glutTimerFunc(20, timer, 0);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
全身關節 :
用鍵盤和滑鼠能控制關節 :
#include <GL/glut.h>
#include <stdio.h> ///寫檔案
FILE * fout=NULL;/// file output 寫檔案
float oldX=0, oldY=0;
void drawBody(){
glPushMatrix();
glScalef(1, 0.5, 0.5);
glutSolidCube(1);
glPopMatrix();
}
void drawArm(){
glPushMatrix();
glScalef(0.6, 0.3, 0.3);
glutSolidCube(1);
glPopMatrix();
}
float angle[10];
int angleID=1;
void display()
{
{ ///Lighting
glColor3ub(166,132,100);
GLfloat pos[]={0, 0, -1, 0};
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glEnable(GL_LIGHT0);
//glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
glPushMatrix();
glTranslatef(0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(angle[1], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm();///這是個Arm ver 1 Right Upper Arm
glPushMatrix();
glTranslatef(0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(angle[2], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm(); ///Right Lower Arm
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(-0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(-angle[3], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm();///這是個Arm ver 1 Left Upper Arm
glPushMatrix();
glTranslatef(-0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(-angle[4], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm(); ///Left Lower Arm
glPopMatrix();
glPopMatrix();
drawBody();
glFlush();
}
void keyboard(unsigned char key, int x, int y)
{
if(key=='1') angleID=1;
if(key=='2') angleID=2;
if(key=='3') angleID=3;
if(key=='4') angleID=4;
}
void motion(int x, int y)
{ angle[angleID] -= y - oldY;
oldY=y; oldX=x;
if(fout==GLUT_DOWN) fout=fopen("a.txt","w+");///確定fout真的沒問題 有開啟 寫檔案
printf("%f ",angle[1]); ///大一上學過
fprintf(fout,"%f\n",angle[1]); ///寫檔案
}
void mouse(int button, int state, int x, int y)
{
if(state==GLUT_DOWN) { oldX=x; oldY=y; }
}
void timer(int t)
{
glutTimerFunc(20, timer, t+1);
//angle++;
glutPostRedisplay();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutCreateWindow("T-R-T test");
glutDisplayFunc(display);
glutTimerFunc(20, timer, 0);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
glutMainLoop();
}
播放鍵
讀檔案 按撥放鍵時 會撥剛才的動作
(2)期中作品
(3)做出全身關節
(4)鍵盤滑鼠操控動作
(5)存檔 play播放
複習TRT :
#include <GL/glut.h>
float angle=0, oldX=0, oldY=0;
void drawBody(){
glPushMatrix();
glScalef(1, 0.5, 0.5);
glutSolidCube(1);
glPopMatrix();
}
void drawArm(){
glPushMatrix();
glScalef(0.6, 0.3, 0.3);
glutSolidCube(1);
glPopMatrix();
}
void display()
{
{ ///Lighting
glColor3ub(166,132,100);
GLfloat pos[]={0, 0, -1, 0};
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glEnable(GL_LIGHT0);
//glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
glPushMatrix();
glTranslatef(0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(angle, 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm();///這是個Arm ver 1 Right Upper Arm
glPushMatrix();
glTranslatef(0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(angle, 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm(); ///Right Lower Arm
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(-0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(-angle, 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm();///這是個Arm ver 1 Left Upper Arm
glPushMatrix();
glTranslatef(-0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(-angle, 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm(); ///Left Lower Arm
glPopMatrix();
glPopMatrix();
drawBody();
glFlush();
}
void motion(int x, int y)
{ angle -= y - oldY;
oldY=y; oldX=x;
}
void mouse(int button, int state, int x, int y){
if(state==GLUT_DOWN) { oldX=x; oldY=y; }
}
void timer(int t)
{
glutTimerFunc(20, timer, t+1);
//angle++;
glutPostRedisplay();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutCreateWindow("T-R-T test");
glutDisplayFunc(display);
glutTimerFunc(20, timer, 0);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
全身關節 :
用鍵盤和滑鼠能控制關節 :
#include <GL/glut.h>
#include <stdio.h> ///寫檔案
FILE * fout=NULL;/// file output 寫檔案
float oldX=0, oldY=0;
void drawBody(){
glPushMatrix();
glScalef(1, 0.5, 0.5);
glutSolidCube(1);
glPopMatrix();
}
void drawArm(){
glPushMatrix();
glScalef(0.6, 0.3, 0.3);
glutSolidCube(1);
glPopMatrix();
}
float angle[10];
int angleID=1;
void display()
{
{ ///Lighting
glColor3ub(166,132,100);
GLfloat pos[]={0, 0, -1, 0};
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glEnable(GL_LIGHT0);
//glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
glPushMatrix();
glTranslatef(0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(angle[1], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm();///這是個Arm ver 1 Right Upper Arm
glPushMatrix();
glTranslatef(0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(angle[2], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm(); ///Right Lower Arm
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(-0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(-angle[3], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm();///這是個Arm ver 1 Left Upper Arm
glPushMatrix();
glTranslatef(-0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
glRotatef(-angle[4], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
drawArm(); ///Left Lower Arm
glPopMatrix();
glPopMatrix();
drawBody();
glFlush();
}
void keyboard(unsigned char key, int x, int y)
{
if(key=='1') angleID=1;
if(key=='2') angleID=2;
if(key=='3') angleID=3;
if(key=='4') angleID=4;
}
void motion(int x, int y)
{ angle[angleID] -= y - oldY;
oldY=y; oldX=x;
if(fout==GLUT_DOWN) fout=fopen("a.txt","w+");///確定fout真的沒問題 有開啟 寫檔案
printf("%f ",angle[1]); ///大一上學過
fprintf(fout,"%f\n",angle[1]); ///寫檔案
}
void mouse(int button, int state, int x, int y)
{
if(state==GLUT_DOWN) { oldX=x; oldY=y; }
}
void timer(int t)
{
glutTimerFunc(20, timer, t+1);
//angle++;
glutPostRedisplay();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutCreateWindow("T-R-T test");
glutDisplayFunc(display);
glutTimerFunc(20, timer, 0);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
glutMainLoop();
}
播放鍵
讀檔案 按撥放鍵時 會撥剛才的動作
2015年5月28日 星期四
02160111_鄭庭峰_week14
(1)期末作品
(2)會跳舞的機器人
(3)T-R-T 對關節轉
(4)小考 : T-R-T 觀念
(5)作業問題
(6) AlwaysOnTopMaker 一個能讓視窗往上得程式
ver1: 打光茶壺
ver2 : 茶壺往右移
ver3 : 茶壺整盤自動旋轉
#include <Gl/glut.h>
float angle=0,oldX=0,oldY=0;
void display()
{
GLfloat pos[]={0, 0, -1, 0};
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle, 0, 0, 1); ///ver 3 :ratating teapot on the handle
glTranslatef(0.5, 0, 0); ///ver 2 :teapot on the right
glutSolidTeapot(0.3); ///ver 1 : A teapot
glPopMatrix();
glFlush();
}
void timer(int t)
{
glutTimerFunc(20, timer, 0);
///angle++; 自動轉才要
glutPostRedisplay();
}
void mouse(int button, int state ,int x,int y)
{
if(state==GLUT_DOWN)
{
oldX=x; oldY=y;
}
}
void motion(int x, int y)
{
angle+=(x-oldX);
oldX=x;
}
int main (int argc, char **argv)
{
glutInit(&argc, argv);
glutCreateWindow("TRT 3D");
glutDisplayFunc(display);
glutTimerFunc(20, timer, 0);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
(4)ver4: 旋轉軸心掛到想放的位置
glPushMatrix();
glTranslatef(0.45, 0.14, 0); ///ver 4 : 把樓下的整個在轉的 往右掛在某個地方 (最終終點)
glRotatef(angle, 0, 0, 1); ///ver 3 :ratating teapot on the handle (旋轉)
glTranslatef(0.45, -0.1, 0); ///ver 2 :teapot on the right (從起始點移動到中點)
glutSolidTeapot(0.3); ///ver 1 : A teapot 畫東西
glPopMatrix();
(2)會跳舞的機器人
(3)T-R-T 對關節轉
(4)小考 : T-R-T 觀念
(5)作業問題
(6) AlwaysOnTopMaker 一個能讓視窗往上得程式
ver1: 打光茶壺
#include <Gl/glut.h>
float angle=0,oldX=0,oldY=0;
void display()
{
GLfloat pos[]={0, 0, -1, 0};
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle, 0, 0, 1); ///ver 3 :ratating teapot on the handle
glTranslatef(0.5, 0, 0); ///ver 2 :teapot on the right
glutSolidTeapot(0.3); ///ver 1 : A teapot
glPopMatrix();
glFlush();
}
void timer(int t)
{
glutTimerFunc(20, timer, 0);
///angle++; 自動轉才要
glutPostRedisplay();
}
void mouse(int button, int state ,int x,int y)
{
if(state==GLUT_DOWN)
{
oldX=x; oldY=y;
}
}
void motion(int x, int y)
{
angle+=(x-oldX);
oldX=x;
}
int main (int argc, char **argv)
{
glutInit(&argc, argv);
glutCreateWindow("TRT 3D");
glutDisplayFunc(display);
glutTimerFunc(20, timer, 0);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
(4)ver4: 旋轉軸心掛到想放的位置
glPushMatrix();
glTranslatef(0.45, 0.14, 0); ///ver 4 : 把樓下的整個在轉的 往右掛在某個地方 (最終終點)
glRotatef(angle, 0, 0, 1); ///ver 3 :ratating teapot on the handle (旋轉)
glTranslatef(0.45, -0.1, 0); ///ver 2 :teapot on the right (從起始點移動到中點)
glutSolidTeapot(0.3); ///ver 1 : A teapot 畫東西
glPopMatrix();
做出一個貌似運動的人
2015年5月21日 星期四
Week 13
(1) 鄭鎧尹博士演講
(2) MP3播放
(3)作業需求
音樂檔要放入freeglut 裡的 bin 裡面
執行程式時,撥放音樂
#include <iostream>
#include <Gl/glut.h>
#include "CMP3_MCI.h"
CMP3_MCI myMP3;
using namespace std;
int main()
{
myMP3.Load("RickyMartin.mp3");
myMP3.Play();
int a;
cin>> a;
return 0;
}
(2) MP3播放
(3)作業需求
音樂檔要放入freeglut 裡的 bin 裡面
執行程式時,撥放音樂
#include <iostream>
#include <Gl/glut.h>
#include "CMP3_MCI.h"
CMP3_MCI myMP3;
using namespace std;
int main()
{
myMP3.Load("RickyMartin.mp3");
myMP3.Play();
int a;
cin>> a;
return 0;
}
2015年5月14日 星期四
Week 12
(1)作業回顧
(2)作業需求(小遊戲)
(3)3D Model模型 glm.c
(4)Maya 轉 OBJ檔
(5)介紹助教影片資源
(2)作業需求(小遊戲)
(3)3D Model模型 glm.c
(4)Maya 轉 OBJ檔
(5)介紹助教影片資源
步驟2: 複製 transformation的3個東西
#include "glm.h"
GLMmodel* pmodel = NULL;
int main()
{
pmodel = glmReadOBJ("data/porsche.obj");
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
成功後會跑出小黑框
讓車子有打光顏色
#include "glm.h"
GLMmodel* pmodel = NULL;
void display()
{
GLfloat pos[] = { 0.0, 0.0, -1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
glFlush();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutCreateWindow("GLUT");
glutDisplayFunc(display);
pmodel = glmReadOBJ("porsche.obj");
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
glutMainLoop();
}
像憤怒鳥的彈力球
#include <opencv/highgui.h> ///for cvLoadImage()
#include <opencv/cv.h> ///for cvCvtColor()
#include <GL/glut.h> ///3D glut
#include <stdio.h>
float angle=0, earthX=0, earthY=0, earthVY=0, earthVX=0; ///自動轉很帥
GLUquadric * quad;
int pikaState=0;
void timer(int t)
{ glutTimerFunc(20, timer, 0);/// 1000 msec 50fps:20msec
if(pikaState==0){
angle+=1;///自動轉很帥
earthX=0.8*cos(angle*3.14/180);
earthY=0.8*sin(angle*3.14/180);
}else if(pikaState==2){
earthX+=earthVX;
earthY+=earthVY;
earthVY-=0.0098;
}
glutPostRedisplay();
}
void display()
{ glEnable(GL_DEPTH_TEST); ///要啟動 Detph Test 深度值的測試,3D顯示才正確
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///自動轉很帥
glTranslatef(earthX, earthY, 0);
glRotatef(90, 1,0,0);
glRotatef(angle, 0,0,1);///自動轉很帥
gluQuadricTexture(quad, 1);
gluSphere(quad, 0.1, 30, 30);///glutSolidTeapot(0.3);
glPopMatrix();///自動轉很帥
glFlush();
}
GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
GLuint id2; ///準備一個 unsigned int 整數, 叫 貼圖ID
void mouse(int button, int state, int x, int y)
{ if(state==GLUT_UP){
glBindTexture(GL_TEXTURE_2D, id2);
pikaState=2;
//earthVX=??
//earthVY= 0.1;
earthVY= (y-150.0)/500;
earthVX= (150.0-x)/500;
}else if(state==GLUT_DOWN){
pikaState=1;
glBindTexture(GL_TEXTURE_2D, id);
}
}
void motion(int x, int y){
earthX=(x-150.0)/150.0;
earthY=(150.0-y)/150.0;
}
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;
}
void myInit()
{ quad = gluNewQuadric();
id = myTexture("321.jpg");
id2 = myTexture("123.jpg");
} ///最後一行最難/最重要, 所貼圖影像的資料都設定好
int main(int argc, char**argv)
{ glutInit(&argc, argv);
glutCreateWindow("3D");
glutDisplayFunc(display); ///顯示
glutTimerFunc(0, timer, 0);
glutMouseFunc(mouse);
glutMotionFunc(motion);
myInit(); ///我的 init 初始化 把貼圖準備好 前面OpenCV 2行, 後面 OpenGL 9行
glutMainLoop();
}
2015年5月7日 星期四
02160111_鄭庭峰 week11
(1) Timer計時器
#include <GL/glut.h>
float angle=0;
void display()
{
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle, 0,1,0);
glutSolidTeapot(0.3);
glPopMatrix();
glFlush();
/// angle++;
}
void timer(int t)
{
glutTimerFunc(10,timer,0);
angle+=1;
glutPostRedisplay();
}
int main (int argc, char**argv)
{
glutInit(&argc, argv);
glutCreateWindow("3D");
glutDisplayFunc(display);
///glutIdleFunc(display);
glutTimerFunc(10,timer,0);
glutMainLoop();
}
茶壺會固定的旋轉
(2)多個貼圖
#include <opencv/highgui.h> ///for cvLoadImage()
#include <opencv/cv.h> ///for cvCvtColor()
#include <GL/glut.h> ///3D glut
#include <stdio.h>
float angle=0; ///自動轉很帥
GLUquadric * quad;
void timer(int t)
{
glutTimerFunc(20, timer,0); /// 1000 msec 50fps:20msec
glutPostRedisplay();
}
void display()
{ glEnable(GL_DEPTH_TEST); ///要啟動 Detph Test 深度值的測試,3D顯示才正確
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///自動轉很帥
glRotatef(90, 1,0,0);
glRotatef(angle, 0,0,1);///自動轉很帥
gluQuadricTexture(quad, 1);
gluSphere(quad, 0.5, 30, 30);///glutSolidTeapot(0.3);
glPopMatrix();///自動轉很帥
glFlush();
angle+=1;///自動轉很帥
}
GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
GLuint id2; ///準備一個 unsigned int 整數, 叫 貼圖ID
void mouse(int button, int state, int x, int y)
{
if(state==GLUT_UP)
glBindTexture(GL_TEXTURE_2D, id2);
else if(state==GLUT_DOWN)
glBindTexture(GL_TEXTURE_2D, id);
}
void myInit()
{
quad = gluNewQuadric();
IplImage * img = cvLoadImage("image.jpg"); ///OpenCV讀圖
cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
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);
IplImage * img2 = cvLoadImage("image2.jpg"); ///OpenCV讀圖
cvCvtColor(img2,img2, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
glGenTextures(1, &id2); /// 產生Generate 貼圖ID
glBindTexture(GL_TEXTURE_2D, id2); ///綁定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, img2->width, img2->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img2->imageData);
} ///最後一行最難/最重要, 所貼圖影像的資料都設定好
int main(int argc, char**argv)
{ glutInit(&argc, argv);
glutCreateWindow("3D");
glutDisplayFunc(display); ///顯示
//glutIdleFunc(display);///自動轉很帥 (閒閒沒事幹, 就重畫)
glutTimerFunc(0, timer, 0);
glutMouseFunc(mouse);
myInit(); ///我的 init 初始化 把貼圖準備好 前面OpenCV 2行, 後面 OpenGL 9行
glutMainLoop();
}
2015年4月30日 星期四
02160111_鄭庭峰 week10
1. 下載OpenCV 2.1
OpenCV 2.1 設定讀圖
2. preject-->build options :
先設定以上3個步驟
之後打程式 :
#include <opencv/highgui.h>
int main()
{
IplImage *img=cvLoadImage("image.jpg");
cvShowImage("2D",img);
cvWaitKey(0);
}
跑出圖片
顯示地圖和物品
把這4個複製到和程式的同資料夾
設定以上3個東西
最後的圖+皮旋轉 :
#include <GL/glut.h> ///我們要使用 GLUT 3D 外掛
#include <opencv/highgui.h> ///要使用 OpenCV的 高級High圖形介面GUI
#include <opencv/cv.h> ///為了 cvCvtColor()而加上 cv.h
float angle=0; ///為了自動轉的角度angle
void display()
{
glEnable(GL_DEPTH_TEST); ///有深度(depth)測試的功能, 才會有正確的景深/前後關係
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ///清畫面
glPushMatrix(); ///備份matrix
glRotatef(angle, 0,1,0); ///為了自動轉的角度angle
glutSolidTeapot(0.3); ///茶壼
glPopMatrix(); ///還原matrix
glFlush(); ///把馬桶沖出去
angle+=0.1; ///為了自動轉的角度angle
}
void init()
{ IplImage * img = cvLoadImage("image.jpg"); ///讀圖檔
cvCvtColor(img, img, CV_BGR2RGB); /// ConVerT Color 把圖 BGR 變成 RGB
glEnable(GL_TEXTURE_2D); ///開啟 2D貼圖功能
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); ///參數設定 貼圖 S軸 如果超過了, 就REPEAT
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); ///參數設定 貼圖 T軸 如果超過了, 就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);
} /// 很長的一行, 把 image的圖, 全部設成貼圖的內容
int main(int argc, char**argv) ///小心,要有 argc, argv哦
{
glutInit(&argc, argv); ///小心有個 & 哦
glutCreateWindow("3D"); ///建個3D視窗
glutDisplayFunc(display); ///畫圖函式
glutIdleFunc(display); ///閒閒沒事幹, 就重畫
init(); ///在 MainLoop前, 去做 initial 初始設定 (2D OpenCV, 3D OpenGL Texture)
glutMainLoop(); ///主要迴圈卡住, 才不會突然程式就結束了
}
GLUquadric * quad;
void display()
{
glEnable(GL_DEPTH_TEST); ///有深度(depth)測試的功能, 才會有正確的景深/前後關係
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ///清畫面
glPushMatrix(); ///備份matrix
glRotatef(-90, 1,0,0); ///為了自動轉的角度angle
glRotatef(angle, 0,0,1);//glutSolidTeapot(0.3); ///茶壼
gluQuadricTexture(quad, 1); ///二次曲線
gluSphere(quad, 0.5, 30, 30);
glPopMatrix(); ///還原matrix
glFlush(); ///把馬桶沖出去
angle+=0.1; ///為了自動轉的角度angle
}
void init()
{
quad = gluNewQuadric();
}
地球旋轉
2015年4月16日 星期四
week08,鄭庭峰
Week08_鄭庭峰
1.模擬考,期中考
2.用範例學習
3. NeHe Lesson 32 小遊戲
#include <GL/glut.h>
#include <mmsystem.h>
#include <stdio.h>
void mouse (int button, int state, int x, int y)
{
if(state==GLUT_DOWN)
{
PlaySound("Shot.wav",NULL, SND_ASYNC);
printf("Shot!\n");
}
}
void keyboard(unsigned char key, int x, int y)
{
exit(0);
}
void display()
{
glClearColor(0.5, 0.5, 1, 0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
int main (int argc, char**argv)
{
glutInit(&argc, argv);
glutCreateWindow("HI~");
glutFullScreen();
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);
glutMainLoop();
}
1.模擬考,期中考
2.用範例學習
3. NeHe Lesson 32 小遊戲
#include <GL/glut.h>
#include <mmsystem.h>
#include <stdio.h>
void mouse (int button, int state, int x, int y)
{
if(state==GLUT_DOWN)
{
PlaySound("Shot.wav",NULL, SND_ASYNC);
printf("Shot!\n");
}
}
void keyboard(unsigned char key, int x, int y)
{
exit(0);
}
void display()
{
glClearColor(0.5, 0.5, 1, 0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
int main (int argc, char**argv)
{
glutInit(&argc, argv);
glutCreateWindow("HI~");
glutFullScreen();
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);
glutMainLoop();
}
打中有另一個聲音 ( 能判斷有沒有打中) (另外加幾行程式)
#include <math.h>
float potX=-1, potY=0;
void mouse (int button, int state, int x, int y)
{
if(state==GLUT_DOWN)
{
PlaySound("Shot.wav",NULL, SND_ASYNC);
printf("Shot!\n");
float mouseX=2*x/1280.0 -1, mouseY=2*y/1024.0 -1;
if( fabs(mouseX-potX)<0.1 && fabs(mouseY-potY)<0.1)
{
PlaySound("BOTTLE.wav",NULL, SND_ASYNC);
printf("Your got it!\n");
}
}
2015年4月9日 星期四
week07_鄭庭峰
1. 製作鍵盤能打字
#include <GL/glut.h>
#include <stdio.h>
void display()
{
glutSolidTeapot(0.3);
glFlush();
}
void keyboard(unsigned char key, int x, int y)
{
if(key=='a')
printf("aaaaa\n");
if(key=='b')
printf("bbbbb\n");
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutCreateWindow("hello");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
2.能發出聲音 (WAV下載)
#include <GL/glut.h>
#include <stdio.h>
#include <mmsystem.h> ///發出聲音的重要標頭檔
void display()
{
glutSolidTeapot(0.3);
glFlush();
}
void keyboard(unsigned char key, int x, int y)
{
if(key=='a')
{
PlaySound("散彈槍.wav", NULL, SND_ASYNC); ///發出聲音
printf("aaaaa\n");
}
if(key=='b')
printf("bbbbb\n");
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutCreateWindow("hello");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
}
3.音階
以上所有聲音檔都要放在bin裡面!!
void keyboard(unsigned char key, int x, int y)
{
if(key=='a')
{
PlaySound("散彈槍.wav", NULL, SND_ASYNC); ///發出聲音
printf("aaaaa\n");
}
if(key=='1')
PlaySound("Do.wav", NULL, SND_ASYNC); ///發出聲音
if(key=='2')
PlaySound("Re.wav", NULL, SND_ASYNC); ///發出聲音
if(key=='3')
PlaySound("Mi.wav", NULL, SND_ASYNC); ///發出聲音
if(key=='4')
PlaySound("Fa.wav", NULL, SND_ASYNC); ///發出聲音
if(key=='5')
PlaySound("Sol.wav", NULL, SND_ASYNC); ///發出聲音
if(key=='6')
PlaySound("La.wav", NULL, SND_ASYNC); ///發出聲音
if(key=='7')
PlaySound("Si.wav", NULL, SND_ASYNC); ///發出聲音
}
4.滑鼠控制 (全部程式碼)
#include <GL/glut.h>
#include <stdio.h>
#include <mmsystem.h> ///發出聲音的重要標頭檔
float teaY=0, rotX=0, rotY=0, oldX=0, oldY=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glTranslatef(0, teaY, 0);
glRotatef(rotX, 1, 0, 0);
glRotatef(rotY, 0, 1, 0);
glutSolidTeapot(0.3);
glPopMatrix();
glFlush();
}
void keyboard(unsigned char key, int x, int y)
{
if(key=='a')
{
PlaySound("散彈槍.wav", NULL, SND_ASYNC); ///發出聲音
printf("aaaaa\n");
}
if(key=='1')
PlaySound("Do.wav", NULL, SND_ASYNC); ///發出聲音
if(key=='2')
PlaySound("Re.wav", NULL, SND_ASYNC); ///發出聲音
if(key=='3')
PlaySound("Mi.wav", NULL, SND_ASYNC); ///發出聲音
if(key=='4')
PlaySound("Fa.wav", NULL, SND_ASYNC); ///發出聲音
if(key=='5')
PlaySound("Sol.wav", NULL, SND_ASYNC); ///發出聲音
if(key=='6')
PlaySound("La.wav", NULL, SND_ASYNC); ///發出聲音
if(key=='7')
PlaySound("Si.wav", NULL, SND_ASYNC); ///發出聲音
}
void special (int key, int x, int y)
{
if(key==GLUT_KEY_DOWN)
{
teaY-=0.1;
printf("down\n");
}
else if(key==GLUT_KEY_UP)
{
teaY+=0.1;
printf("up\n");
}
glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)
{
oldX=x;
oldY=y;
if(GLUT_LEFT_BUTTON==button && GLUT_DOWN==state)
printf("now left down\n");
if(GLUT_RIGHT_BUTTON==button && GLUT_DOWN==state)
printf("now right down\n");
}
void motion(int x, int y)
{
rotX+=y-oldY;
rotY+=x-oldX;
oldX=x; oldY=y;
glutPostRedisplay();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutCreateWindow("hello");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutSpecialFunc(special);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
訂閱:
文章 (Atom)







































