2015 電腦圖學 Computer Graphics 授課教師: 葉正聖 銘傳大學資訊傳播工程系 每週主題: 程式環境、點線面顏色、移動/旋轉/縮放與矩陣(Matrix)、階層性關節轉動(T-R-T)、做出機器人、打光、貼圖、glu/glut函式、鍵盤、滑鼠、計時器(timer)、讀入3D模型、粒子系統、聲音、特效、投影矩陣、攝影機與運鏡、機器人2.0、期末作品
2015年6月18日 星期四
2015年6月11日 星期四
02163042_王冠閔_week15
(1)移動、旋轉、縮放
(2)T-R-T及關節結構
(3)存檔、讀檔、播放
存檔
if(key=='s'){
if(fout==NULL) fout=fopen("a.txt", "w+");
for(int i=0;i<10;i++)
{
printf("%.1f ", angle[i]);
fprintf(fout, "%.1f ", angle[i]);
}
printf("\n"); fprintf(fout, "\n");
}
glutPostRedisplay();
-----------------------------------------------------------------------------------------------------------------------
讀檔
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 timer(int t)
{
glutTimerFunc(20, timer, t+1);
float a=(t%50==0)/50.0;
if(t%50==0) readNew();
for(int i=0;i<10;i++)
{
angle[i]=(1-a)*angleOld[i]+(a)*angleNew[i];
}
glutPostRedisplay();
}
(4)內插動作Interpolate
內插公式
glutTimerFunc(20, timer, t+1);
float a=(t%50==0)/50.0;
if(t%50==0) readNew();
for(int i=0;i<10;i++)
{
angle[i]=(1-a)*angleOld[i]+(a)*angleNew[i];
}
(5)期末作品
2015年5月28日 星期四
2015年5月21日 星期四
02163042_王冠閔_week13
(1)MP3播放
#include "CMP3_MCI"
#include<iostream>
#include "CMP3_MCI.h"
#include<GL/glut.h>
CMP3_MCI myMP3;
using namespace std;
int main()
{
myMP3.Load("RickyMartin.mp3");
myMP3.Play();
cout<<"hello !!!"<<endl;
int a;
cin>>a;
return 0;
}
(2)作業需求
2015年5月14日 星期四
02163042_王冠閔_week12
(1)作業回顧
開啟transformation檔案執行範例
(2)作業需求
GLMmodel* pmodel = NULL;
pmodel = glmReadOBJ("porsche.obj");
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
(3)3D Model模型
glutInit(&argc, argv);
glutCreateWindow("GLUT");
glutDisplayFunc(display);
GLfloat pos[] = {0.0, 0.0, -1.0, 0.0};
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
2015年5月7日 星期四
02163042_王冠閔_week11
(1)Timer計時器
void timer(int t)
{
glutTimerFunc(10, timer, 0);
angle+=1;
glutPostRedisplay();
}
(2)上禮拜回顧和多個貼圖
作業:互動小遊戲
2015年4月30日 星期四
02163042_王冠閔_week10
(1)openCV 2.1 設定 讀圖
int main()
{
IplImage * img = cvLoadImage("image.jpg");
cvShowImage("2D", img);
cvWaitKey(0);
}
(2)openGL 設定
#include <GL/glut.h>
#include <opencv/highgui.h>
float angle = 0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(angle, 0,1,0);
glutSolidTeapot(0.3);
glPopMatrix();
glFlush();
angle+=0.1;
}
int main(int argc, char**argv)
{
IplImage * img = cvLoadImage("image (7).jpg");
cvShowImage("2D", img);
//cvWaitKey(0);
glutInit(&argc, argv);
glutCreateWindow("3D");
glutDisplayFunc(display);
glutIdleFunc(display);
glutMainLoop();
}
(3)貼圖設定:地圖
void init()
{ IplImage * img = cvLoadImage("image (7).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的圖, 全部設成貼圖的內容
(4)有能力做小遊戲
2015年4月16日 星期四
02163042_王冠閔_week8
(1)用範例學習 打光 法向量 貼圖 座標
小遊戲
點擊滑鼠出現聲音
void mouse(int button, int state, int x, int y)
{
if(state==GLUT_DOWN){
PlaySound("Shot.wav",NULL, SND_ASYNC);
printf("Shot!\n");
}
}
讓茶壺移動
glPushMatrix();
glTranslatef(potX, potY, 0);
glutSolidTeapot(0.05);
glPopMatrix();
讓茶壺重新出發
if(potX>1.1) potX=-1.1;
若擊中茶壺則發出另外的聲音
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("kiss.wav",NULL, SND_ASYNC);
printf("you got it!!!\n");
}
2015年4月9日 星期四
02163042_王冠閔_week07
(1) Keyboard ,Mouse ,UI,音效 音樂
keyboard:
void keyboard(unsigned char key, int x, int y)
{
if(key=='a') printf("aaaa\n");
if(key=='b') printf("bbbb\n");
}
keyboard music:
void keyboard(unsigned char key, int x, int y)
{
if(key=='a')
{
PlaySound("madmoo.wav", NULL, SND_ASYNC);
printf("喔喔喔\n");
}
}
(5)模擬考
2015年3月26日 星期四
02163042_王冠閔_week05
(1).自製3D模型
長方形雛形:glBegin(GL_LINE_LOOP);//畫線
glVertex3f(0.2, 0.2, 0.8);
glVertex3f(0.2, -0.2, 0.8);
glVertex3f(-0.2,-0.2, 0.8);
glVertex3f(-0.2, 0.2, 0.8);
glEnd();
glBegin(GL_LINE_LOOP);//畫線
glVertex3f(0.2, 0.2, -0.8);
glVertex3f(0.2, -0.2, -0.8);
glVertex3f(-0.2, -0.2, -0.8);
glVertex3f(-0.2, 0.2, -0.8);
glEnd();
glBegin(GL_QUAD_STRIP);//畫方形
glVertex3f(0.2, 0.2, 0.8);
glVertex3f(0.2, 0.2, -0.8);
glVertex3f(0.2, -0.2, 0.8);
glVertex3f(0.2, -0.2, -0.8);
glVertex3f(-0.2, -0.2, 0.8);
glVertex3f(-0.2, -0.2, -0.8);
glVertex3f(-0.2, 0.2, 0.8);
glVertex3f(-0.2, 0.2, -0.8);
glEnd();
長方型透視圖:
glBegin(GL_LINE_LOOP);
glBegin(GL_LINE_LOOP);
glBegin(GL_LINES);
長方形填滿圖+黑色線:
glBegin(GL_POLYGON);
glBegin(GL_POLYGON);
glBegin(GL_QUAD_STRIP);
(2).利用滑鼠旋轉
簡單的滑鼠移動:加一個void
void motion(int x,int y)
{
printf("%d %d\n", x, y);
angle = x;
angle2 = y;
}
在int main 底下加一行:
glutMotionFunc(motion);///滑鼠移動
(例外):開啟3D深度測試
開啟一個3D的深度測試:
glEnable(GL_DEPTH_TEST);///開啟3D深度測試
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
在 int main底下加一行
glutInitDisplayMode(GLUT_DEPTH);///讓顯示具有3D深度的功能
2015年3月19日 星期四
02163042_王冠閔_week04
(1).移動.旋轉.放大 縮小 範例檔案
glutSolidTeapot(0.3);//畫茶壺
(3).讓空心甜甜圈旋轉
(4).旋轉 清除 移動 備份 還原 空心甜甜圈
(2).移動 旋轉 放大縮小 code blocks 將茶壺移至右上角
glTranslatef(1,1,0);//移動glutSolidTeapot(0.3);//畫茶壺
(3).讓空心甜甜圈旋轉
glClear(GL_COLOR_BUFFER_BIT);//清畫面
glRotatef(angle, 1,1,0);//旋轉
glutWireTorus(0.3,0.5, 30,30);//畫空心甜甜圈
glFlush();
angle+=2;
(4).旋轉 清除 移動 備份 還原 空心甜甜圈
glutIdleFunc(display);///隨時呼叫display函式
glClear(GL_COLOR_BUFFER_BIT);///清畫面
glPushMatrix();///備份
//glTranslatef(angle,0,0);///移動
glRotatef(angle, 1,1,0);///旋轉
glutWireTorus(0.3,0.5, 30,30);///畫空心甜甜圈
glPopMatrix();///還原
2015年3月12日 星期四
week3_02163042_王冠閔
(1).點.線.面
(2).五行程式

(3).GLUT示範
(4).電腦圖學之父
(2).五行程式

#include<GL/glut.h>
void display()
{
glClearColor(0.7, 0, 0.6 ,1);
glClear(GL_COLOR_BUFFER_BIT); //清除BUFFER
glColor3f(1,1,1);
glutSolidTeapot(0.5);
glColor3f(2,1,0);
glutSolidTeapot(0.4);
glColor3f(0,0,1);
glutSolidTeapot(0.3);
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutCreateWindow("02163042王冠閔");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
void display()
{
glClearColor(0.7, 0, 0.6 ,1);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glColor3f(1,1,0);
glVertex2f(0,0);
glVertex2f(1,0);
glVertex2f(0,1);
glEnd();
glBegin(GL_POLYGON);
glColor3f(1,0,0);
glVertex2f(0,0);
glColor3f(0,1,0);
glVertex2f(-1,0);
glColor3f(0,0,1);
glVertex2f(0,-1);
glEnd();
glFlush();
}
(3).GLUT示範
(4).電腦圖學之父
2015年3月5日 星期四
week02_02163042_王冠閔
1.打造 圖學程式 code Blocks
2.openGL, GLUT
3.freeGLUT 解壓縮
4.打造 GLUT圖學程式
2.openGL, GLUT
3.freeGLUT 解壓縮
4.打造 GLUT圖學程式
5.寫五行程式
6.寫十行程式 (實心茶壺 左) (空心茶壺 右)
7.用VB C++ 開啟十行程式碼~~~
訂閱:
文章 (Atom)
























































