顯示具有 05160204_馬明均 標籤的文章。 顯示所有文章
顯示具有 05160204_馬明均 標籤的文章。 顯示所有文章

2018年6月4日 星期一

Week15_馬明

2018-06-04
Week15
(1)下週期末作品展示
(2)主題:學期內容回顧
(3)問題Q&A

TODO:

Week1:
1.WebGL
2.跑OpenGL

Week2:
1.GLUT專案

Week3:

移動旋轉縮放
跑Transformation.exe
glutSolidTeapot(半徑)
glutSolidSpagere(半徑,切,切)
gltuSolidCone(半徑,切,切)

Week4:Rotate,矩陣
Week5:T-R-T,特定軸
Week6:glm 3D模型
#include "glm.h"
GLM *pmodel = NULL
畫圖:
(
if(pmodel==NULL)
///讀入模型
{
glmReadOBJ("...");
縮放,glmUnitize(),法向量.
}
glmDran()
小心舊的 Strdup()會不相容

Week7:
小心 CodeBlocks專案 & Setting-Compiler
要設對glm.cpp 才行compile

Working_dir要設成"."

libfreeglut.dll  COPE>>專案目錄

Week8:打光.陣列
Week10:
貼圖
OpenCV
設目錄link
秀圖
Week11:
keyboard配PlaySound()變成鍵盤鋼琴
mouse配PlaySound()變成射擊遊戲

CMP3_MCI.h可撥MP3

2018年5月28日 星期一

Week14_馬明

2018-05-28
Week14
(1)作業四Q&A(擺Pose檔)
(2)主題:攝影機,投影矩陣
(3)實作:gulLookAt(),glutReshapeFunc()
(4)期末作品

TODO:至jsyeh.org/3dcg10/下載
1.win32
2.glut32.dll
3.data


glOrtho視景窗(可以看到哪)
gluLookAt(看哪裡)

TODO:應該可以看懂整個範例檔了
File-New-Project,GULT
看glutReshapeFunc(resize);
視窗若有大小,要改變投影的設定值,投影才不會變形







TODO:期末作品講解,動起來

S鍵儲存座標,R可以讀取座標
幫關節編號(按下1切換到1號關節,按下2切換2號關節..)


重畫畫面

計時器
動畫部分:

按下P播放

比較完整的程式碼:




太重要了所以傳上來的上課錄影(關於動畫):




2018年5月21日 星期一

Week13_馬明

2018-05-21
Week13
(1)主題:寫檔案、讀檔
(2)主題:控制關節
(3)主題:動作內插

TODO:寫檔讀檔
(1)File-New-Enpty File (Ctrl-Shift-N)
另存新檔(File-SaveAs) file.cpp

(2)
#include<stdio.h>
int main()
{
  FILE*fout = fopen("output.txt","w+");
  ///FILE * 檔案指標fout
  ///   檔案file
  ///   open開啟
  ///    "要開啟的檔名,"w+"表示要寫的/+檔案
  ///printf("Hello World"); 大一上程式設計第一周
  ///fprintf(fout,"Hello World");///大一下交過.大二下正式用
   fprintf(fout,"%.3f %.3f %.3f\n",angle,angle2,angle3);
}///要寫出許多關節角度,就用許多 %.3f 對應後面的變數
///前面有幾個%%% 後面就有幾個變數,%.3f表示是float且小數點後3位


TODO:控制關節
(1)File-New-Project,GLUT專案
下載week13_main.cpp
取代專案中程式
(2)最上面加
#include<GL/glut.h>
#include <stdio.h>
float angle =0;
int oldx=0;
FILE * fout = NULL;
void mouse (int button,int state,int x,int y)
{
oldx=x;
}
void motion(int x,int y)
{
angle +=(x-oldx);
oldx=x;
if(fout==NULL)
{
fout=fopen("output.txt","w+");
}//檔案會在freeglut的bin
printf("%.3f\n",angle);
fprintf(fout,"%.3f\n",angle);
glutPostRedisplay();
}



(3)
int main()中的
 glutCreateWindow("GLUT Shapes");
下面加上兩行
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
來控制茶壺



TODO:動作內插

#include <GL/glut.h>
#include <stdio.h>
FILE * fout=NULL;///TODO:檔案一開始是空的 NULL
FILE * fin=NULL;///Now3: in檔案一開始是空的 NULL
//float angle=0, angle2, angle3, angle4, angle5, angle6;
float angle[20]={0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0};///Now4: 用陣列
int oldX=0, now=0;///angle[now]
void keyboard(unsigned char key, int x, int y)///Now3: 要記得main()註冊
{///Now3: 用keyboard來讀入動畫資料
    if(key=='1') now=1;///按1就會改變1號關節
    if(key=='2') now=2;///按2就會改變3號關節
    if(key=='3') now=3;
    if(key=='4') now=4;
    if(key=='5') now=5;
    if(key=='6') now=6;
    if(key=='7') now=7;
    if(key=='8') now=8;
    if(key=='9') now=9;
    if(key=='r' || key=='R'){///Now4: 按'r'才會讀入關節的角度,一次讀20個
        if(fin==NULL){///Now3: TODO:一開始是空指標,所以會進來if(..)
            fin=fopen("output.txt", "r");///Now4: r表示讀入read
        }
        for(int i=0;i<20;i++) fscanf(fin, "%f", &angle[i]);///Now4: 用陣列從檔案fin讀進來
    }
    if(key=='w' || key=='W' || key=='s' || key=='S'){///Now4: 按's'才會寫關節的角度,一次20個
        if(fout==NULL){///TODO:一開始是空指標,所以會進來if(..)
            fout = fopen("output.txt", "w+");///第一節教的開檔
        }///TODO:之後就不再是空指標了
        for(int i=0;i<20;i++) fprintf(fout, "%.3f\n", angle[i]);///TODO:把角度印到檔案裡
    }
//    fscanf(fin, "%f %f %f %f %f %f %f %f %f %f  %f %f %f %f %f %f %f %f %f %f",
//           &angle[0], &angle[1], &angle[2], &angle[3], &angle[4], &angle[5],
//           &angle[6], &angle[7], &angle[8], &angle[9], &angle[10], &angle[11],
//           &angle[12], &angle[13], &angle[14], &angle[15], &angle[16], &angle[17],
//           &angle[18], &angle[19]  );
    glutPostRedisplay();///Now3: 讀入資料,馬上重畫
}
void mouse(int button, int state, int x, int y)
{///TODO
    oldX=x;
}///TODO
void motion(int x, int y)///TODO: 用mouse motion來改關節angle
{///TODO:
    angle[now] += x-oldX; ///角度稍微增減, 以前教過把大象放到冰箱去的程式碼
    oldX=x;///把舊的更新成新的
    glutPostRedisplay();///TODO:重畫畫面
}
void display()///以下是老師提供的
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glutSolidTeapot(0.3);///正中間,當成身體的茶壼
        glPushMatrix();
            glTranslatef(0.4, 0,0);///掛上去
            glRotatef(angle[0], 0,0,1);///
            glTranslatef(0.4, 0,0);///把柄放中間
            glutSolidTeapot(0.3);///右邊,當成手臂的茶壼
            glPushMatrix();
                glTranslatef(0.4, 0,0);///掛上去
                glRotatef(angle[1], 0,0,1);///
                glTranslatef(0.4, 0,0);///把柄放中間
                glutSolidTeapot(0.3);///右邊,當成手臂的茶壼
            glPopMatrix();

        glPopMatrix();
        glPushMatrix();
            glTranslatef(-0.4, 0,0);///掛上去
            glRotatef(angle[2], 0,0,1);///
            glTranslatef(-0.4, 0,0);///把柄放中間
            glutSolidTeapot(0.3);///右邊,當成手臂的茶壼
            glPushMatrix();
                glTranslatef(-0.4, 0,0);///掛上去
                glRotatef(angle[3], 0,0,1);///
                glTranslatef(-0.4, 0,0);///把柄放中間
                glutSolidTeapot(0.3);///右邊,當成手臂的茶壼
            glPopMatrix();

        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
///上面是我們增加的程式碼
///打光的部分留著 (陣列,main() ) 其他都刪掉
const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

/* Program entry point */

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

    ///我們準備3個函式註冊好
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);
    ///我們準備3個函式註冊好

    ///glutReshapeFunc(resize);
    glutDisplayFunc(display);
    ///glutKeyboardFunc(key);
    ///glutIdleFunc(idle);

    glClearColor(1,1,1,1);
    ///glEnable(GL_CULL_FACE);
    ///glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();

    return EXIT_SUCCESS;
}


2018年5月14日 星期一

Week12_馬明

2018-05-14
Week12
(1)小考:T-R-T觀念
(2)上周:PlaySound,MP3播放
(3)主題:計時器Timer
(4)主題:內插,線性內插,動畫


TODO:複習上週
(1)開啟GLUT專案
(2)把CodeBlocks Project.cbp檔用Notepad++開啟,其中working-dir="C://..."改成"."

(3)把freeglut32.dll複製到專案目錄
(4)加程式碼
*/
#include <mmsystem.h>
 PlaySound("Shot.wav",NULL,SND_ASYNC);
/*
TODO:在Moodle下載 CMP3_MCI.h
(1)放在專案用一目錄中(MP3檔也是)
#include "CMP3_MCI.h"
CMP3_MCI my.MP3;
int main(...)
{
myMP3.load("123.mp3");
myMP3.Play();
}


TODO:每天早上起床的儀式(計時器)
鬧鐘響一起床一撥鬧鐘繼續睡
*/
void timer(int t)
{
    glutTimerFunc(2000,timer,0);
    PlaySound("Shot.wav",NULL,SND_ASYNC);
}

int main(...)
{
.
.
.
glutCreateWindow("...");
glutTimerFunc(7000,timer,0);//一定要加在glutCreateWindow之後

}
/*




TODO:內插、線性內插
新*d+舊*(1-d)=內插


















TODO:動畫(下周待續)



2018年5月7日 星期一

Week11_馬明

2018-05-07
Week11
(1)主題:聲音/音效.音樂
(2)實作:PlaySound,CMP3_MCI.j
(3)鍵盤鋼琴,射擊遊戲
(4)複習貼+TRT,下週小考

TODO:測試
#include <stdio.h>//(a)多媒體系統
int main(...)
{
PlaySound("聲音.WAV",NULL,SNA,ASYNC);
}
TODO:
1.把聲音檔,先放Freeglut\bin
2.+Code

---------------
TODO:File-New-Project貝殼專案
音檔要放進專案資料夾
ASYNC是會等不會直接往下跑
SYNC是不等直接往下跑

#include<windows.h>
#include<mmsystem.h>///以上順序很重要
#include<stdio.h>
int main()
{
  PlaySound("聲音.WAV",NULL,SND_ASYNC);
  printf("Hello Please Input:");
int n;
scanf("%d",&n);
}


右鍵專案找到Build option>>Project build options>>Linker setting>>Add輸入winmm


-----
TODO:鍵盤鋼琴



使用GLUT,音檔一樣放入freeglut


#include<mmsystem.h>
static void key(unsigned char key, int x, int y)
{
    switch (key)
    {
        case 1: PlaySound("Do.wav",NULL,SND_ASYNC);

            break;
        case 2: PlaySound("Re.wav",NULL,SND_ASYNC);

            break;
        case 3: PlaySound("Mi.wav",NULL,SND_ASYNC);

            break;
        case 4: PlaySound("Fa.wav",NULL,SND_ASYNC);

            break;
        case 5: PlaySound("Sol.wav",NULL,SND_ASYNC);

            break;
        case 6: PlaySound("La.wav",NULL,SND_ASYNC);

            break;
        case 7: PlaySound("Si.wav",NULL,SND_ASYNC);

            break;




-----
TODO:下週的小考練習


glPushMatrix();/// (0)10分
  glTranslatef(-0.5,0.35,0);///(4)20分,畫上去,最簡單,要3個參數
  glRotatef(-angle,0,0,1);///(3)glRotatef(angle,0,0,-1);20分
  glTranslatef(-0.3,0,0);///(2)先20分,倒過來,讓圓圈圈放到中心去
  drawArm();///(1)程式從下往上寫20分
glPopMatrix();///(0)10分

2018年4月30日 星期一

Week10_馬明

2018-04-30
Week10
(1)貼圖
(2)實作:OpenCV讀圖秀圖
(3)實作:OpenGL貼圖
(4)期中考試
(5)回家作業HW3截止

TODO:最簡單的讀圖方法
載moodle/上課用軟體/Open CV(要選第二個點點)

-

Codeblock
加上
1.#include <copencv/highgui.h> ///呼叫OpenCU外掛

2.build Option>>Search directones>>Compiler>>Add 放OpenCV2.1\include


3.build Option>>Search directones>>Linker>>Add  C:\OpenCV2.1\lib

4.build Option>>Linker settings>>放cv210,cxore210,highgui210


5.+Code


-----------------------------------------------------------------------------------
TODO:Moodle下載myEarth.zip解壓縮
(此檔有問題)
(1)缺freeglut.dll
(2)缺image.jpg


1.先用Notepad++編輯myEarth.cbp

 2.複製freeglut.dll進myEarth資料夾
3.上網找地圖改名image.jpg放入
開啟exe檔
地球轉起來







2018年4月16日 星期一

Week08_馬明

2018-04-16
(1)主題:打光
(2)期中模擬考
(3)T-R-T小考
(4)回家作業:3DModel會動(最少1個關節)
(5)Recap




(1)打光的範例Light Materual.exe
(2)CodeBlock . File-New-Project, GLUT

(3)把上周3D Model.放進去
C:\users\user\desktop\freeglut\bin\data\porscge.obj
 #include <glm.h>
GLMmodel *pmodel=NULL;
畫模型


關切面


*/
 glEnable(GL_LIGHT0);//打開Light 0 打光
    glEnable(GL_NORMALIZE);//打開法向量Normal Vector Normalize 長度變成1 才好打光
    glEnable(GL_COLOR_MATERIAL);//打開下面的glLight & glMaterial
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);//留下剛剛GLUT範例的打光函式,8行
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);//GLUT範例的打光函式
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);//GLUT範例的打光函式
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);//GLUT範例的打光函式

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);//GLUT範例的打光函式
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);//GLUT範例的打光函式
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);//GLUT範例的打光函式
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);//GLUT範例的打光函式
/*

前面glEnable(GL_CULL_FACE);和glCullFace(GL_BACK);//註解掉關切面

做機器人





2018年4月9日 星期一

Week07_馬明

2018-04-09
Week07
(1)主題:3D模型
(2)轉檔,OBJ格式(v,vt,vnf)
(3)期中考題(10行OpenGL Code)
(4)小考T-R-T
(5)回家作業:骨架階層矩陣

TODO:Moodle下載3D Exploration探索/檔案總管

(1)安裝、執行
----------------------------------
TODO:下載jsyeh.org/3dcg10>>data.zip

(2)data.zip→桌面/data/一堆3D模型
=> 用 3D Exploration 開 3D模型(看)

------------------------------------
TODO:想自己讀入3D模型(EX.jsyeh.org/3dcg10的範例)

建GLUT專案week07_glm

下載jsyeh.org/3dcg10>>Source.zip
找出
(1)glm.h
(2)glm.c重新命名glm.cpp
(3)transformation.c重新命名transfarmation,cpp
上述3個程式放入桌面week07_glm資料夾

freeglut>>bin放入data/模型
                 lib的改libfreeglut.a複製貼上檔名改libglut32.a

-------------------------------------------
TODO:File-New-Project,GLUT
Add files放入glm.cpp,transfarmation,cpp
Setting-Compiler的勾勾清掉


main.cpp程式清空,因為另外.cpp都有main
清空後再rebuild然後build and run


--------------------------------------------------
TODO:自己打造 3D模型 程式
(1)把上節課transfarmation.cpp內容刪除
(2)main.cpp放程式
#include "glm.h"///1.外掛
GLMmodel * pmodel=NULL;//2.指標
void display()
{
   glClear(.....)///3.畫模型
   .
   .
   .
   glutSwapBuffer()///畫出來
}



-----------------------------



2018年3月26日 星期一

week05_馬明

2018-03-26
Week05
(1)複習移動旋轉(Translate,Rotate)
(2)本週主題:T-R-T特定軸轉
(3)本週主題:階層性旋轉
(4)本週主題:矩陣(整合)
(5)回家作業


(1)複習
看Transformation.exe(改順序)
jsyeh/3dcg10下載
windows.zip
Data.zip
glut32.dll
如week04打開Transformation.exe
口訣:左耳貼左肩,程式由下而上由內而外


先Rotate再Translate會公轉、反之則會自轉


(2)T-R-T
試著讓茶壺繞著中心點轉



(3)階層性旋轉
舉重



2018年3月19日 星期一

week04_馬明

2018-03-19
Week04
主題:移動、旋轉、縮放
範例:Transformation

下載所需檔案
jsyeh.org/3dcg10下載windows.zip、data.zip、glut32.dll

解壓縮windows.zip至資料夾,data解壓縮後和glut32.dll丟進windows
使Windows的Transformation.exe可以開啟並且不會閃退



**說明(考試重點)
g1PushMatrix();備份矩陣
glTranslatef(x,y,z);移動
glRotatef(角度,X,Y,Z);轉動(右手安培)
glScalef(x,y,z);縮放
glBegin(GL_POLYON);開始畫
   glColor3f(r,g,b);顏色
   glVertex3f(x,y,z);頂點
End();結束畫
glBegin();對應
glPopMatrix();還原矩陣







CodeBlocks開始專案GLUT
實作讓茶壺自己轉動



用滑鼠控制茶壺轉動



MAYA式操控


2018年3月12日 星期一

Week03_馬明

1.色彩、點線面複習
#include <GL/glut.h>
void display()
{
    glClearColor(1,1,0, 1);///背景
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///兩種模式
    glutSolidTeapot(0.3);

    glutSwapBuffers();///教畫畫面BUFFER便會顯示
}

int main(int argc,char ** argv)///進階的main()參數(個數,字串)
{
    glutInit(&argc,argv);///近接參數初始GLUT
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);///開啟兩種模式
    glutCreateWindow("week03 Mouse操作");///盡量不要用中文
    glutDisplayFunc(display);///等一下樓上要準備void display()
    ///glutMouseFunc(mouse);///等一下會準備好MOUSE()功能,按鈕
    ///glutMotionFunc(motion);///等一下會準備好MOTION(),移動
    glutMainLoop();///主要迴圈


-----------------------------------------------------------
2.加入mouse功能
加入printf("%d %d %d %d\n",button,state,x,y);
















3.加MOTION

放大象
#include <GL/glut.h>
float teapotX=0,teapotY=0;
void display()
{
    glClearColor(1,1,0, 1);///背景
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef(teapotX,teapotY,0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
#include<stdio.h>
void mouse (int button,int state,int x,int y)
{
    if(state==GLUT_DOWN) printf("glVertex2f(%f,%f);\n",(x-150)/150.0,-(y-150)/150.0);
}///開冰箱門、把大象放到冰箱、關冰箱門

void motion(int x,int y)
{
    teapotX=(x-150)/150.0;
    teapotY=-(y-150)/150.0;
    printf("%d %d\n",x,y);
    glutPostRedisplay();
}
int main(int argc,char ** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week03 Mouse操作");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}


2018年3月5日 星期一

Week02_馬明

jsyeh/3dcg10下載data,win32,glut32.dll



把win32解壓縮至資料夾,把glut32.dll丟進資料夾後開啟資料夾中的Shapes
在Shapes中可以右鍵選形狀,拖拉右邊綠色數字調整數值

Vertex 頂點、頂點有(x軸,y軸)
glColor(R,G,B);色彩

glVertex 2f
               ↑float浮點數

開啟OpenGL
擷取檔案中的

glBegin(GL_TRIANGLES);
                glColor3f(1.0f, 0.0f, 0.0f);   glVertex2f(0.0f,   1.0f);
                glColor3f(0.0f, 1.0f, 0.0f);   glVertex2f(0.87f,  -0.5f);
                glColor3f(0.0f, 0.0f, 1.0f);   glVertex2f(-0.87f, -0.5f);
glEnd();


和上禮拜一樣載MOODLE的檔案
解壓縮後將lib的libfreeglut複製貼上,新檔案改為libglut32.a後開啟GLUT
將在OpenGL擷取的程式碼加入精簡化的GLUT















編譯執行得到

若將剛剛從OpenGL擷取貼上的程式碼改為glutSolidTeapot(0.3);
圖形會變成茶壺