2017電腦圖學 Computer Graphics 授課教師: 葉正聖 銘傳大學資訊傳播工程系 每週主題: 程式環境、點線面顏色、移動/旋轉/縮放與矩陣(Matrix)、階層性關節轉動(T-R-T)、做出機器人、打光、貼圖、glu/glut函式、鍵盤、滑鼠、計時器(timer)、讀入3D模型、粒子系統、聲音、特效、投影矩陣、攝影機與運鏡、機器人2.0、期末作品
2017年7月1日 星期六
2017年6月30日 星期五
Week 16 語璇電圖
if(key=='s')///儲存的意思
{
fout = fopen("file.txt","a");///打開記事本
fprintf(fout,"%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f\n\n",
angle[0],angle[1],angle[2],angle[3],angle[4],angle[5],angle[6],angle[7],angle[8],angle[9]);///這行才是寫角度進去
printf("%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f\n\n",
angle[0],angle[1],angle[2],angle[3],angle[4],angle[5],angle[6],angle[7],angle[8],angle[9]);///看你有多少個模型需要動
}
if(key=='r')///讀檔的意思
{
if(fin==NULL)
{
fin = fopen("file.txt","r");///寫入所需要的角度安排
}
fscanf(fin,"%f %f %f %f %f %f %f %f %f %f\n",
&Newangle[0],&Newangle[1],&Newangle[2],&Newangle[3],&Newangle[4],&Newangle[5],&Newangle[6],&Newangle[7],&Newangle[8],&Newangle[9]);
glutPostRedisplay();
}
if(key=='m')
{
glutTimerFunc(0,timer,0);
}
2017年6月29日 星期四
Week16,圓圈圈 圈圈圓
要放背景圖,我們在display函式中修改成如下:
void display()
{ glEnable(GL_DEPTH_TEST); ///要啟動 Detph Test 深度值的測試,3D顯示才正確
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glBegin(GL_POLYGON);///多邊形 開始畫
glTexCoord2f(0,0); glVertex3f(-1,+1,0);
glTexCoord2f(1,0); glVertex3f(+1,+1,0);
glTexCoord2f(1,1); glVertex3f(+1,-1,0);
glTexCoord2f(0,1); glVertex3f(-1,-1,0);
glEnd();///結束畫
glPopMatrix();
glFlush();
}
glTexCoord2f(1,1); glVertex3f(+1,-1,0);
glTexCoord2f(0,1); glVertex3f(-1,-1,0);
2017年6月28日 星期三
2017年6月18日 星期日
2017年6月14日 星期三
Week16 閻覃的上課筆記
Week16 閻覃的上課筆記
貼圖
在老師的幫助下我實現了貼兩張不同的圖片。
貼圖的時候需要OpenCV,相關步驟在之前的部落格有提到過。
首先建立一個Image Class
Image.h
1//2// Created by Ethan on 2017/6/12.3//4#include <opencv/highgui.h> ///for cvLoadImage()5#include <opencv/cv.h> ///for cvCvtColor()67#ifdef __APPLE__8#include <GLUT/glut.h>9#else10#include <GL/glut.h>11#endif121314#ifndef INC_05052553_WEEK15_IMAGE_H15#define INC_05052553_WEEK15_IMAGE_H161718class Image {19public:20 Image(char *filename);2122 GLUquadric *quad;23 GLuint id;24 IplImage *img;25};262728#endif //INC_05052553_WEEK15_IMAGE_HImage.cpp
1//2// Created by Ethan on 2017/6/12.3//45#include "Image.h"67Image::Image(char *filename) {8 img = cvLoadImage(filename); ///OpenCV讀圖9 cvCvtColor(img, img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)10 quad = gluNewQuadric();11 glGenTextures(1, &id); /// 產生Generate 貼圖ID12 glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID13 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖14 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖15 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點16 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點17 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);1819}在程式碼中,可以新建幾個貼圖
1Image *background;2Image *platform;3background = new Image("background.jpg");4platform = new Image("platform.jpg");之後就可以結合打光,在Display中貼圖了。
打光控制
有時候,貼圖會很暗,是因為打光的原因,如果將打光禁用就可以維持圖片本來的顏色。
以下程式碼在display函式中:
1 // draw background2 glEnable(GL_TEXTURE_2D);3 glDisable(GL_LIGHTING);4 glBindTexture(GL_TEXTURE_2D, background->id);5 glPushMatrix();6 {7 glTranslatef(0, .5, 0);89 glRotatef(90, 0, 1, 0);10 glRotatef(90, 1, 0, 0);11 gluQuadricTexture(background->quad, 1);12 gluSphere(background->quad, 2, 20, 20);13 }14 glPopMatrix();15 glDisable(GL_TEXTURE_2D);16 glEnable(GL_LIGHTING);17首先啟用貼圖,關閉打光
之後畫出一個有貼圖的圓球
最後禁用貼圖,啟用打光。
切換貼圖
在剛才的程式碼中有一行
1glBindTexture(GL_TEXTURE_2D, background->id);這是說將接下來的貼圖切換到background的id上,所以就會貼background.jpg
比如我還想貼一個平台的圖片,那麼就可以繼續加程式碼:
1 // platform2 glEnable(GL_TEXTURE_2D);3 glBindTexture(GL_TEXTURE_2D, platform->id);4 glPushMatrix();5 {6 glBegin(GL_POLYGON);7 {8 const float size =1;9 const float y = -0.54f;10 glNormal3f(0,1,0);11 glTexCoord2f(0, 0);12 glVertex3f(-size, y, +size);13 glTexCoord2f(1, 0);14 glVertex3f(+size, y, +size);15 glTexCoord2f(1, 1);16 glVertex3f(+size, y, -size);17 glTexCoord2f(0, 1);18 glVertex3f(-size, y, -size);19 }20 glEnd();2122 }23 glPopMatrix();24 glDisable(GL_TEXTURE_2D);25這裡遇到了幾個難點,因為畫了一個平台,所以法向量如果不調整會出錯,光照會變得很昏暗,所以應該將法向量手動調整一下,才可以顯示出貼圖,否則就是一片漆黑。如果關閉打光也可以正常顯示,不過我這裡是要求開啟打光的,所以要設置法向量。
解決音畫不同步問題(卡拍子)
需要include以下檔案
1#include <ctime>2#include <ratio>3#include <chrono>開始播放時記錄開始播放的系統時間
startTime = std::chrono::high_resolution_clock::now();
在timer函式中算出時間差
x
1std::chrono::high_resolution_clock::time_point t2 = std::chrono::high_resolution_clock::now();2std::chrono::duration<double, std::milli> time_span = t2 - director->startTime;3float newTime = (float) (BPM * time_span.count() / 30000.0);其中BPM是歌曲的BPM,這個公式是根據我的程式產生的。
我的程式中,一拍(1beat)等於 2frame
用於計算角度等的time可以看作frame的序號
在這裡通過獲取當前系統時間,算出經過了多少時間,再通過BPM(60s中有多少beat)算出當前經過了多少beat,這時就可以換算出當前經過了多少frame,因此直接跳到當前的frame,計算角度就好。
通過這樣計算,無論電腦卡頓還是窗口拖動影響,都不會卡拍子。
2017年6月13日 星期二
#week16- tp6vü[電腦圖學上課筆記]
if(key=='s')///儲存的意思
{
fout = fopen("file.txt","a");///打開記事本
fprintf(fout,"%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f\n\n",
angle[0],angle[1],angle[2],angle[3],angle[4],angle[5],angle[6],angle[7],angle[8],angle[9]);///這行才是寫角度進去
printf("%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f\n\n",
angle[0],angle[1],angle[2],angle[3],angle[4],angle[5],angle[6],angle[7],angle[8],angle[9]);///看你有多少個模型需要動
}
if(key=='r')///讀檔的意思
{
if(fin==NULL)
{
fin = fopen("file.txt","r");///寫入所需要的角度安排
}
fscanf(fin,"%f %f %f %f %f %f %f %f %f %f\n",
&Newangle[0],&Newangle[1],&Newangle[2],&Newangle[3],&Newangle[4],&Newangle[5],&Newangle[6],&Newangle[7],&Newangle[8],&Newangle[9]);
glutPostRedisplay();
}
if(key=='m')
{
glutTimerFunc(0,timer,0);
}
2017年6月12日 星期一
Week16_大平台的上課筆記_課堂作業_01
freeglut裝桌面\freeglut\include
\lib
\bin
openCV2.1裝C:\OpenCV2.1\include
\lib
\bin
把display裡 註解掉(///) 畫地球
glPushMatrix();///自動轉很帥
glBegin(GL_POLYGON);///開始要化背景
///前面是貼圖座標,後面是3D頂點
glTexCoord2f(0,0);glVertex3f(-1,+1,0);
glTexCoord2f(1,0);glVertex3f(+1,+1,0);
glTexCoord2f(1,1);glVertex3f(+1,-1,0);
glTexCoord2f(0,1);glVertex3f(-1,-1,0);
glEnd();
2.背景貼圖示範
3.打光、貼圖示範
4.讀檔內插示範
5.總複習