顯示具有 40447012S_羅浩倫 標籤的文章。 顯示所有文章
顯示具有 40447012S_羅浩倫 標籤的文章。 顯示所有文章

2018年1月11日 星期四

羅浩倫的Week18 期末專題展示


30秒demonstrate連結: https://youtu.be/4tXBVO0E7Hc




完整版影片連結: https://youtu.be/3tnIYPoFXlE




按p鍵可以暫停或播放畫面及音樂

按q鍵可以輸入時間,直接跳轉到想要觀看的時間點

方向鍵可以倒退(快進)5秒
(上和左鍵是倒退5秒;下和右鍵則是快進5秒)

按s鍵可以開關音樂的回音效果

畫面還是可以旋轉的
但是因為背景是用一顆球體貼上貼圖來達成的
選轉視角的話畫面會變得很奇怪,就沒有在影片中示範了

最後在影片下方可以找到整首音樂的影片連結喔


30秒demonstrate連結: https://youtu.be/4tXBVO0E7Hc
完整版影片連結: https://youtu.be/3tnIYPoFXlE

備註:
若沒有聲音,麻煩請試試資料夾裡的
"sakura.mp3.old"和"sakura2.mp3.old"

不小心拖移畫面調整不回去時可以按r鍵或數字1回復初始視角

model資料夾裡面的"*.pmd"檔案其實都可以使用
代表圖中使用的模型是這兩個:
"model/巡音ルカ.pmd" & "model/咲音メイコ.pmd"

只要簡單的改檔名就可以了
程式讀取的檔案是這兩個:


"model/mikuV2.pmd" & "model/rin.pmd"

羅浩倫的學習筆記 Week17

本週沒有上課


專題進度
上週決定在一顆球體上直接貼一張背景圖後,這週開始撰寫程式碼。

基本的概念是是利用老師在week8的時候教的"如何在球體上貼圖(地球)",不過其實是我找不到方法可以讀取舞台的模型,最終成果就是讓MMD模型可以直接在球體中間跳舞,因為如果只是在背景貼一張圖的話,旋轉視角之後就會顯得很突兀,結果圖:



最後的小小心得:有了前幾週花了非常多時間研究如何使用現成的library的經驗,最後在連結opencv的時候就輕鬆了不少,我覺得我這學期最大的收穫應該就是了解了靜態還有動態library的差別吧XD

不過當然在圖學的部分,最近在很多的手遊或是CG、動畫畫面上都有越來越高的比例使用3D模型了,一方面是GPU的進步,另一方面則是人們因應科技進步,眼睛也越來越"貪心"了,在10年以前根本無法想像當今如此複雜多彩的畫面吧,現在還能以人類眼睛都無法跟上的速度變換畫面,這背後極大量的計算量,如果沒有GPU的支援也是很難達成的吧。

最後感謝葉正聖老師這學期的教導,謝謝老師,老師辛苦了~~~~

羅浩倫的學習筆記 Week16

本週沒有上課


專題進度
上週請教過老師之後決定使用opencv來做背景的貼圖,程式碼:


#ifndef BACKGROUND_H_INCLUDED
#define BACKGROUND_H_INCLUDED

#include "freeglut.h"

int myTexture(char *filename);
void displayBackground(GLUquadric *quad, GLuint &BGid);


#endif // BACKGROUND_H_INCLUDED

大致上是利用老師在week8的時候教的"如何在球體上貼圖(地球)"所寫的程式碼改編而成的,不過在跟我自己的程式碼組合在一起的時候還是花了不少時間,不過還好我(自認)寫程式的習慣還不錯,把不同的功能的程式碼組合起來並不需要太多步驟,整體來說算是順利的完成背景了。

目前我有想到可以在一顆球體上直接貼一張背景圖,讓MMD模型直接在球體中間跳舞,因為如果只是在背景貼一張圖的話,旋轉視角之後就會顯得很突兀,下週就是最後一週了,希望可以順利完成我的期末作品。

2017年12月21日 星期四

羅浩倫的學習筆記 Week15

本週學習重點

1.主題:Antialias
2.期末作品Q&A

上課紀錄

因為電腦是以像素格(pixel)來顯示畫面的,就算看起來在精細的圖畫,只要放大有限的N倍一定可以看到一格一格粗糙的樣子,就類似離散訊號系統的奈奎斯特頻率一樣,取樣的頻率必須要高於取樣目標的頻率的兩倍才可以,否則就會造成"失真"。(奈奎斯特頻率Wikipedia)

另外提到的一個技術就是Antialias,大致上來說是為了解決像素格顯示的粗糙問題,在原本應該被取樣成黑色和被取樣成白色交界處的點可以有灰階的像素,這樣看起來就會平滑許多了。

專題進度
上週的目標是sound.h(prototype)的撰寫,除了上禮拜決定要有的功能以外,我還新增了isValid()來判斷一個音樂物件是不是可用的(有載入音樂檔案), 還有可以從指定時間開始播放音樂檔案的play(int from),另外,關於在main()裡面的應用,我利用同時開啟兩個一樣的音檔,然後用極小的時間差同時播放來製造類似演唱會場的回音效果,不過也有可能有人不喜歡這個效果,所以我也有寫可以關閉回音效果的功能。

目前大致上的雛形已經差不多了,比較大的問題點是背景的部分,網路上看了很多資料都還沒有找到比較適合的應用方法。


更新:
請教過老師後決定先試試看用貼圖的方式在畫面上貼一張圖,
並利用關閉深度偵測的方式讓圖片永遠在畫面最後方。

2017年12月14日 星期四

羅浩倫的學習筆記 Week14

本週學習重點

1.期末作品Q&A
2.Rasterization

上課紀錄
今天的第一節課說明Rasterization的意思是"光柵化",也就是要決定畫面上每一個pixel應該要畫成什麼顏色。
首先用P語言來大概感覺一下所謂的"Rasterization"

接下來在頂點的座標上加上"深度",也就是Z座標,讓它看起來有3D的感覺,透過調整各頂點的Z座標就可以讓圖像有前後的感覺了



專題進度
上周已經大略完成performance.cpp的程式碼也已經可以順利執行程式了,因此這禮拜想要開始加入音樂了,這禮拜的進度就是sound.h(prototype)撰寫,預計要有的功能如下:

1.定義一個類別Sound,處理音樂相關的各個函式
2.要有建構子和解構子
3.給定一個檔案位置來開啟檔案
4.可以撥放和暫停
5.可以取得音樂的長度
6.可以修改音樂的音量


2017年12月7日 星期四

羅浩倫的學習筆記 Week13

本週學習重點

1.主題: VR體驗
2.主題: 期末主題點播
3.如何畫面等速變化(timer()計時函式)

上課紀錄
老師分享前幾天google上出現的小遊戲
是一種blocky類型的coding遊戲,玩家要利用一些簡單的小方塊如前進、左轉、右轉和迴圈等等編成一支小程式棒助小兔子拿到所有的胡蘿蔔。

用P語言可以切換顏色模式成HSB模式
就可以顯示彩虹的顏色


performance.cpp的撰寫(definition)
用來整合讀取pmd模型和vmd動作的檔案,現在已經可以執行程式了(如下圖)


(這裡就不列出程式碼了)

2017年11月30日 星期四

羅浩倫的學習筆記 Week12

本週學習重點

1.主題: Scene 場景
2.主題: Mocap, skeleton, Model
3.期末作品分析&協助

上課紀錄

試著編譯老師寫的程式碼

本周期末專期進度

performance.h撰寫(prototype)
用來整合讀取pmd模型和vmd動作的檔案

程式碼:

#ifndef PERFORMANCE_H_INCLUDE
#define PERFORMANCE_H_INCLUDE

#include "libPMD/PMD.h"
#include "libPMD/VMD.h"

class Performance{
public:
    Performance();
    ~Performance();
    bool loadPmd(char *pmdPath);
    bool loadVmd(char *vmdPath);
    void displayPMD();
    void updateAnimationTime(double deltaTime);
    void applyMotion(char *vmdName);
    void updateMotion(char *vmdName, double deltaTime);
    PMD* getPMD();
    VMD* getVMD();
private:
    PMD* _pmd;
    VMD* _vmd;
    double _animationTime;
};

#endif //PERFORMANCE_H_INCLUDE

2017年11月23日 星期四

羅浩倫的學習筆記 Week11

本週學習重點

1.主題:聲音、音效、音樂
2.平台:Windows, Java, etc.
3.期中Proposal提案分析(期末作品)
4.Mocap

上課內容
今天上課教我們如何讀取音樂檔案(wav, mp3, etc.)
例如以下C++程式碼可以讀取mp3檔案

#include <stdio.h>

#include "CMP3_MCI.h"

CMP3_MCI sound;

int main () {
    sound.Load("file.mp3");
    sound.Play();
    int a;
    scanf("%d", &a);
    return 0;
}
其中"CMP3_MCI.h"的函式庫在FB社團裡面可以下載

羅浩倫的學習筆記 Week10

本週學習重點

1.介紹一些圖學相關的project
2.用P語言做一些簡單的小程式

我的期末專題

目前已可以讀取模型檔並貼上貼圖顯示出來


2017年11月9日 星期四

羅浩倫的學習筆記 Week09

本週學習重點


1.上週Texture 貼圖 詳解
2.多重貼圖
3.Bump Mapping



上課紀錄
到moodle上課軟體下載Processing 3 執行範例程式碼

接下來練習用Processing這個程式語言來讀圖檔
找一張自己喜歡的圖片,把它拉到Processing 3的視窗裡面新增程式的data
接下來只需要三行的程式碼
PImage img = loadImage("doraemon.png");
size(600,600);
image(img, 0,0, 600,600);
就可以成功讀出圖檔囉

接下來進階一點把程式碼包在函式裡面,然後讓電腦跟著滑鼠座標畫圖
就可以做出可以互動的程式了



最後練習一個的Mario的Processing 3程式
PImage imgMario, imgMarioJump, imgBrick;
double marioX=200, marioY=100;
double marioVX=0, marioVY=0;
boolean marioOnFloor = false;
int [][]map = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
               {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
               {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
               {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
               {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
               {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
               {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
               {0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0},
               {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
               {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
               {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
               {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};

void setup(){
  size(800,600);
  imgMario = loadImage("mario.jpg");
  imgMarioJump = loadImage("mariojump.png");
  imgBrick = loadImage("brick.png");
}
void draw(){
  background(255);
  if (map[(int)(marioY/50)][(int)(marioX/50)] != 0){
    marioOnFloor = true;
  }
  if (marioOnFloor == false){
    marioVY += 0.98;
  }
  else if (marioOnFloor == true){
    marioVY = 0;
  }  
  for (int x=0; x<16; x++){
    for (int y=0; y<12; y++){
      if (map[y][x] == 1)
        image(imgBrick, x*50, y*50, 50, 50);
    }
  }
  
  marioX += marioVX;
  marioY += marioVY;
  image(imgBrick, marioX, marioY, 50, 50);
  //image(imgMario, marioX, marioY, 100,100);
}

void keyPressed(){
  if (keyCode == UP)
      marioVY = -15;
  if (keyCode == LEFT)
      marioVX = -5;
  if (keyCode == RIGHT)
      marioVX = 5;
}
void keyReleased(){
  if (keyCode == LEFT || keyCode == RIGHT)
      marioVX = 0;
}

2017年11月2日 星期四

羅浩倫的學習筆記 Week08

本週學習重點


1.主軸: Texture 貼圖
2.OpenCV 安裝 讀圖
3.OpenGL 貼圖 設定
4.範例: 轉動地球


首先到老師的網站(jsyeh.org/3dcg10)下載data.zip, windows.zip, glut32.dll 還有source.zip
然後到再下載OpenCV-2.1.0-win32-vs2008.exe接著安裝
安裝時要選擇路徑 打勾第二個或第三個選項

之後他就會自己新增一條系統的執行路徑: C:\OpenCV2.1\bin
接下來在codeblocks開啟一個Console application專案

在專案的build option裡面的Linker setting


新增三樣東西
cv210
cxcore210
highgui210

在專案的build option裡面的Search directories

Compiler新增一條C:\OpenCV2.1\include

Linker新增一條C:\OpenCV2.1\bin


詳細的操作可以參考葉老師上傳youtube的影片
https://www.youtube.com/watch?v=iu6RI4ns4n8

上網找一張earth的圖片放到專案的資料夾裡
最後直接使用葉老師打好的用來開啟圖片的程式碼

#include <opencv/highgui.h> int main() { IplImage * img=cvLoadImage("a.jpg"); cvNamedWindow("hello"); cvShowImage("hello", img); cvWaitKey(0); return 0; }

然後執行程式就可以把圖片開起來了




2017年10月26日 星期四

羅浩倫的學習筆記 Week07

本週學習重點


1.作業二展示、互評
2.主題: Mouse, Model, 打光
  =>  用mouse調光源
3.主題:  Lighting打光, Shading 光影



今天在原本新建專案後自動產生的main檔案裡面加上motion()來控制光源的位置
void motion(int x, int y) {
    light_position[0] = (x-150)/150.0 * 10;
    light_position[1] = -(y-150)/150.0 * 10;

    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    idle();
}
main()裡面記得要加上glutMotionFunc(motion);來註冊motion()


光源在右上方


光源在左下方














今天因為互相評分花了快兩節課,所以程式碼的進度比較少。

2017年10月19日 星期四

羅浩倫的學習筆記 Week06

本週學習重點

1.複習上週進度
2.編譯上週Transformation程式(小心compiler設定 v.s. strdup() )
3.作業2 : Keyboard, Mouse, 轉動, 移動
4.主軸: 打光 Lighting



上課紀錄:

1.首先把Setting-Compiler設定的C++11選項取消掉 (和strdup() 衝突)

2.接著到老師網頁下來的source code的projection.c找和 light 相關的程式碼,複製貼上到上禮拜未完成的專案
 總共有以下5行
GLfloat light_pos[] = { 0.0, 0.0, 1.0, 0.0 };

glEnable(GL_DEPTH_TEST); /// 此行是為了讓光線有錢後深淺的效果,否則會糊成一團
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);


3.其中因為因為我們的程式相機的位置不一樣,要把GLfloat light_pos[] = { 0.0, 0.0, 1.0, 0.0 };改成
GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };
然後試著執行看看

4.接下來試著練習看看作業的內容(keyboard和mouse等等函式)

GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };
int oldX, oldY;
int rotateX=0, rotateY=0, rotateZ=0;
double scale = 1.0;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(rotateX, 1, 0, 0);
        glRotatef(rotateY, 0, 1, 0);
        glRotatef(rotateZ, 0, 0, 1);
        glScalef(scale, scale, scale);
        drawmodel();
    glPopMatrix();
    glutSwapBuffers();
}

void keyboard(unsigned char key, int x, int y){
    static int d = 1, direction = 1;
    if (key == 'q'){
        direction = (direction== 1?-1:1);
        printf("change direction: %d\n", direction);
    }

    if (key == '1')
        rotateX += d*direction;
    else if (key == '2')
        rotateY += d*direction;
    else if (key == '3')
        rotateZ += d*direction;

    if (key == '+' && d<10){
        d++;
    }
    else if (key == '-' && d>1){
        d--;
    }
}

void mouse(int botton, int state, int x, int y){
    if (botton == GLUT_LEFT_BUTTON){
        if (state == GLUT_DOWN){
            oldX = x;
            oldY = y;
        }
    }
    else if (botton == 3 && scale > 0){
        scale -= 0.05;
    }
    else if (botton == 4 && scale < 3){
        scale += 0.05;
    }
    printf("%d", botton);
}

void motion(int x, int y){
    rotateX += (oldY-y);
    rotateY += (oldX-x);
    oldX = x;
    oldY = y;
}

void idle(){
    glutPostRedisplay();
}

記得要在main函式裡面註冊這些函式
glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutIdleFunc(idle);


2017年10月12日 星期四

羅浩倫的學習筆記 Week05

本週學習重點

1.複習上週主題(旋轉etc.)
2.本週主題: viewing
3.範例: jsyeh.org/3dcg10
4.viewing 相關函式&介紹



上課紀錄:

1.先到 jsyeh/3dcg10下載上課用的資料 (data, win32, glut32.dll)

2.解壓縮windows.zip,然後把glut32.dll和data也放到windows資料夾裡,之後執行範例程式Transformation.exe

3.執行第二個範例程式Projection.exe
可以測試gluPerspective()

還有glOrtho() (滑鼠右鍵切換)

函式整理:
1.gluPerspective(fovy, aspect, zNear, zFar); //fovy: 視野大小, aspect: y/x比例
2.glOrtho(左, 右, 下, 上, 近, 遠);
3.gluLookAt(eyex, eyey, eyez,                      //照相機位置
                    centerx, centery, centerz,         //主角位置
                    upx, upy, upz);                          //視野的上方

4.試著編譯範例程式

一些注意的細節:
1.把glm.c, glm.h, projection.c加入到自己的專案裡
2.在freeglut的bin資料夾新增一個data資料夾放al.mtl, al.obj

2017年10月5日 星期四

羅浩倫的學習筆記 Week04

本週學習重點

1.主題: 移動、旋轉、縮放
2.實作: Translate, Rotate, Scale
3.觀念: 矩陣Matrix, Push, Pop
4.作業: 加入移動旋轉等


上課紀錄:


第一節課先用原本的178行程式碼再加上一些東西,來觀察看看旋轉是如何做的:
display()函式中上面三個glPushMatrix();glPopMatrix();之間加上glColor3d(1,1,1);&glutSolidTeapot(1);來調整顏色和畫一個茶壺。



接下來關於程式碼中的glRotated(60,1,0,0);glRotated(a,0,0,1); :
glRotated(角度,x軸,y軸,z軸),d的意思是double(雙精度浮點數)
因此第一句程式碼的意思是對x軸旋轉60度,第二句的裡面的a是隨時間變化的變數,
所以兩句程式碼組合起來就是先對x軸轉60度之後,隨著時間對z軸旋轉。



第二節課來試試看不同軸心同時旋轉 :
左上角是對x,y軸旋轉,中間上面是對y,z軸旋轉



然後是調整大小的glScaled(x, y, z)有三個變數,所以可以對三個變量做不同比例的縮放:
下面是glScaled(2, 0.2, 0.2);的縮放結果



最後一節課說明glPushMatrix();glPopMatrix();
glPushMatrix();是為了備份乾淨的狀態矩陣(紀錄旋轉、移動、縮放的狀態數值)
之後可以在中間想旋轉就旋轉,想移動就移動,想縮放就縮放
最後只要記得用glPopMatrix();把狀態矩陣恢復成原本乾淨的狀態就可以了

2017年9月28日 星期四

羅浩倫的學習筆記 Week03

今天第一節課在試著執行學姊的程式碼


關於程式碼小技巧:
1.fscanf()不要在mainloop裡面跑
2.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )後面記得要清深度
3.學姊用glPointSize(10.0f)把頂點設成10的大小,這樣在把視窗放大的時候就不會髒髒的

第二節課來試著開別人的obj,首先下載3d exploration,接下來到下載老師以前補習班上課用的data(網址: jsyeh.org/3dcg10 ),用3d exploration開啟.obj檔案,足球為例。接著另存成.cpp檔案在桌面,記得把輸出格式改成Sample App,之後就直接執行吧~


等等!編譯器說有error,那我們就把有問題的code註解掉吧(第3280行)


然後就成功了!