顯示具有 06160424_張簡業釗 標籤的文章。 顯示所有文章
顯示具有 06160424_張簡業釗 標籤的文章。 顯示所有文章

2019年6月9日 星期日

學渣的奮鬥史-最終回

附上睡過頭沒上到課的我
醒來後
朋友傳給我的第一句話


還好老師有錄影片

從影片中可以知道今天的重點是關於運鏡的使用方法及掌握


第一部分(投影矩陣)


照慣例的要從老師給的網址

[http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/]

下載3個東西

[win32][glut32.dll][data]

在其中打開projection

在轉移矩陣跟備份矩陣後面所寫的函式內容會跟以前有所不同

分別換成了GL_PROJECTION以及GL_MODELVIEW

在下載回來的WINDOWS程式中

打開projection後能發現能發現有幾個數值能夠調整

分別是[fovy][aspect][][]

fovy是調整視野

aspect是調整寬、高比例

在垂直投影法gluPerspective(視野角度,寬跟高的比例,zNear,zFar)


第二部分(用codeblock做出projection的效果)

顯示3D模型的方法

用之前上課的函式將3D模型帶入

程式碼如下

void drawmodel(void)///輸入模型檔案
{
  if (!pmodel) {
pmodel = glmReadOBJ("data/al.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
     }
  glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}
void display(void)顯示出模型檔案
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    drawmodel();
    glutSwapBuffers();
}

注意!!!模型需打光,沒有打光模型就會變白色

要有打光效果需注意是否有以下兩行程式碼

glEnable(GL_DEPTH_TEST);///讓模型變立體
glEnable(GL_LIGHT0);///打光後讓立體的模型有顏色
GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };
glEnable(GL_LIGHTING);///打光後讓立體的模型有顏色
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);///打光的位置

第三部分(攝影機運鏡)

利用gluLookAt函式調整參數達到運鏡的效果

利用三角函數調整運行的軌跡

讓鏡頭可以成圓形的運行軌跡


下課

沒上到課好後悔阿QQ



Perspective 素描

2019年5月24日 星期五

學渣的奮鬥史-12



禮拜五的早上,好不想上課(累

每天早上都挺趕時間

-----------------------------------第一節課--------------------------------------------------

今天第一節課教計時器

利用毫秒間隔讓計時器運作

主要程式碼如下

#include <GL/glut.h>
#include <mmsystem.h>
#include <stdio.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle, 0, 0, 1);
        glutSolidTeapot( 0.3 );
    glPopMatrix();
    glutSwapBuffers();
}
void timer(int t)
{
    glutTimerFunc(1000, timer, t+1);
    printf("現在的 timer(t)的t是: %d\n", t);
    ///PlaySoundA("duck.wav", NULL, SND_ASYNC);///呼叫聲音的程式碼   
    angle = t;
    glutPostRedisplay();///重複播放display函式
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500,500);
    glutCreateWindow("week14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(1000, timer, 0);///計時器基本程式碼(1000毫秒,計時,次數)

    glutMainLoop();
}

-----------------------------------第二節課--------------------------------------------------

第二節課教的是內插公式

是...是數學(抖


公式為[alpha*newx+(1-alpha)*oldx]

利用excel去做出內插公式的運算

之後在利用程式碼在其中做出動畫

程式碼如下

#include <GL/glut.h>
#include <mmsystem.h>
#include <stdio.h>
float angle=0;
float nowX=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        ///glRotatef(angle, 0, 0, 1);
        glTranslatef(nowX, 0, 0);
        glutSolidTeapot( 0.3 );
    glPopMatrix();
    glutSwapBuffers();
}
void timer(int t)
{/// 1000 ms = 1秒,   33ms = 0.033秒 => 33*30=1000,  30fps
    glutTimerFunc(33, timer, t+1);
    printf("現在的 timer(t)的t是: %d\n", t);
    float alpha = (t%30) / 30.0;///變成 alpha: 0.0 ~ 1.0(內插公式)
    nowX = alpha*1.0 + (1-alpha)* -1.0;

    glutPostRedisplay();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500,500);
    glutCreateWindow("week14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(1000, timer, 0);

    glutMainLoop();
}

-----------------------------------第三節課--------------------------------------------------
這節課一開始先教我們

如果想在不同地方使用自己的程式碼

會遇到程式不能運行的問題以及如何修正

首先要從.cbp檔開始

找到有<work.dir>的那行進行修改為<Option working_dir="." />

接著加入上禮拜的內容做出

可以寫入檔案的程式碼

在宣告時加入上次的程式碼

然後接著參考上次的寫入

今天新增了讀取

主要程式碼是

FILE * fin =NULL;

fscanf(fin, "%f", &angle[i]);


然後照這前兩節教的計時器跟內插公式

可以讓模型有動畫的效果

今天最後的程式碼如下

#include <stdio.h>///NOW1 for fprintf()
FILE * fout=NULL;///NOW1 for fopen() + fprintf()
FILE * fin =NULL;///NOW2 for fopen() + fscanf()
#include <GL/glut.h>
#include "glm.h"
GLMmodel* pmodel = NULL;
GLMmodel* pmodel2 = NULL;
GLMmodel* pmodel21 = NULL;
GLMmodel* pmodel3 = NULL;
GLMmodel* pmodel31 = NULL;
GLMmodel* pmodel4 = NULL;
GLMmodel* pmodel41 = NULL;
GLMmodel* pmodel5 = NULL;
GLMmodel* pmodel51 = NULL;

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 };

float angle[20];///NOW1
float oldAngle[20];///NOW4
float newAngle[20];///NOW4
int angleID=1;

void display(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ///身體
    glPushMatrix();
        glTranslatef(0, 0.3,0 );
        glScalef(0.5,0.5,0.5);

            if (!pmodel) {
                pmodel = glmReadOBJ("data/06160451.obj");
            if (!pmodel) exit(0);
                glmUnitize(pmodel);
                glmFacetNormals(pmodel);
                glmVertexNormals(pmodel, 90.0);
            }
        glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
        ///右上臂
        glPushMatrix();
            glTranslatef(0.45,0.3,0 );
            glScalef(0.5,0.5,0.5);
            glRotatef(angle[1], 0,0,1);
            glTranslatef(0,-0.7, 0);
            if (!pmodel2) {
                pmodel2 = glmReadOBJ("data/123.obj");
            if (!pmodel2) exit(0);
                glmUnitize(pmodel2);
                glmFacetNormals(pmodel2);
                glmVertexNormals(pmodel2, 90.0);
            }
            glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);

            glPushMatrix();
            glTranslatef(0,-1.1,0 );
            glScalef(1,1,1);
            glRotatef(angle[2], 0,0,1);
            glTranslatef(0,-0.7, 0);
            if (!pmodel2) {
                pmodel2 = glmReadOBJ("data/123.obj");
            if (!pmodel2) exit(0);
                glmUnitize(pmodel2);
                glmFacetNormals(pmodel2);
                glmVertexNormals(pmodel2, 90.0);
            }
            glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();
        glPopMatrix();
        glPushMatrix();
            glTranslatef(-0.45,0.3,0 );
            glScalef(0.5,0.5,0.5);
            glRotatef(angle[3], 0,0,1);
            glTranslatef(0,-0.7, 0);
            if (!pmodel2) {
                pmodel2 = glmReadOBJ("data/123.obj");
            if (!pmodel2) exit(0);
                glmUnitize(pmodel2);
                glmFacetNormals(pmodel2);
                glmVertexNormals(pmodel2, 90.0);
            }
            glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);

            glPushMatrix();
            glTranslatef(0,-1.1,0 );
            glScalef(1,1,1);
            glRotatef(angle[4], 0,0,1);
            glTranslatef(0,-0.7, 0);
            if (!pmodel2) {
                pmodel2 = glmReadOBJ("data/123.obj");
            if (!pmodel2) exit(0);
                glmUnitize(pmodel2);
                glmFacetNormals(pmodel2);
                glmVertexNormals(pmodel2, 90.0);
            }
            glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();
        glPopMatrix();

        glPushMatrix();
            glTranslatef(0.2,-1.05,0 );
            glScalef(0.5,0.5,0.5);
            glRotatef(angle[5], 0,0,1);
            glTranslatef(0,-0.7, 0);
            if (!pmodel2) {
                pmodel2 = glmReadOBJ("data/123.obj");
            if (!pmodel2) exit(0);
                glmUnitize(pmodel2);
                glmFacetNormals(pmodel2);
                glmVertexNormals(pmodel2, 90.0);
            }
            glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);


            glPushMatrix();
                glTranslatef(0,-1.2,0 );
                glScalef(1,1,1);
                glRotatef(angle[6], 0,0,1);
                glTranslatef(0,-0.7, 0);
                if (!pmodel2) {
                    pmodel2 = glmReadOBJ("data/123.obj");
                    if (!pmodel2) exit(0);
                    glmUnitize(pmodel2);
                    glmFacetNormals(pmodel2);
                    glmVertexNormals(pmodel2, 90.0);
                }
                glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);
                glPopMatrix();
            glPopMatrix();

        glPushMatrix();
            glTranslatef(-0.2,-1.05,0 );
            glScalef(0.5,0.5,0.5);
            glRotatef(angle[7], 0,0,1);
            glTranslatef(0,-0.7, 0);
            if (!pmodel2) {
                pmodel2 = glmReadOBJ("data/123.obj");
            if (!pmodel2) exit(0);
                glmUnitize(pmodel2);
                glmFacetNormals(pmodel2);
                glmVertexNormals(pmodel2, 90.0);
            }
            glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);


            glPushMatrix();
                glTranslatef(0,-1.2,0 );
                glScalef(1,1,1);
                glRotatef(angle[8], 0,0,1);
                glTranslatef(0,-0.7, 0);
                if (!pmodel2) {
                    pmodel2 = glmReadOBJ("data/123.obj");
                    if (!pmodel2) exit(0);
                    glmUnitize(pmodel2);
                    glmFacetNormals(pmodel2);
                    glmVertexNormals(pmodel2, 90.0);
                }
                glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);
                glPopMatrix();
            glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();
}
int oldX=0;
void mouse(int button, int state, int x, int y)///NOW2
{
    oldX = x;
}
#include <stdio.h>
void motion(int x, int y)
{
    angle[angleID] += x-oldX;
    oldX = x;
    for(int i=0;i<20;i++){
    printf(" %.2f ", angle[i]);
    }
    printf("\n");
    display();
}
void timer(int t)///NOW3
{
    glutTimerFunc(33, timer, t+1);///NOW3 ///NOW4 快一點
    if(t%30==0){///NOW4 每 30frame要讀新資料
        if(fin==NULL) fin=fopen("motion.txt", "r");///NOW3
        for(int i=0; i<20; i++){///NOW3
            oldAngle[i] = newAngle[i]; ///NOW4
            fscanf(fin, "%f", &newAngle[i]);///NOW4 新資料
        }
    }
    float alpha = (t%30)/30.0;///NOW4 今天第1節有寫過它,內插
    for(int i=0;i<20;i++){///NOW4
        angle[i] = alpha*newAngle[i] + (1-alpha)*oldAngle[i];///NOW4
    }
    glutPostRedisplay();///NOW4
}

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=='5') angleID=5;
    if(key=='6') angleID=6;
    if(key=='7') angleID=7;
    if(key=='8') angleID=8;
    if(key=='w'){///NOW1
        if(fout==NULL) fout=fopen("motion.txt", "w+");///NOW1
        for(int i=0; i<20; i++){///NOW1
            fprintf(fout, "%.1f ", angle[i]);///NOW1
        }///NOW1
        fprintf(fout, "\n");///NOW1
    }
    if(key=='r'){///NOW2
        if(fin==NULL) fin=fopen("motion.txt", "r");///NOW2
        for(int i=0; i<20; i++){///NOW2
            fscanf(fin, "%f", &angle[i]);///NOW2
        }
    }
    if(key=='t' || key=='p'){///NOW3 ///啟動timer 或是 play
        glutTimerFunc(33, timer, 0);///NOW3 ///NOW4 變快了
        if(fin==NULL) fin=fopen("motion.txt", "r");///NOW3
        for(int i=0; i<20; i++){///NOW3
            fscanf(fin, "%f", &newAngle[i]);///NOW3 ///NOW4 新角度
        }
    }
    glutPostRedisplay();///NOW2 請讀到angle[i]之後, 重畫畫面
}

int main(int argc,char**argv){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("Week06");

    glutDisplayFunc(display);
    glutIdleFunc(display);
    glClearColor(1,1,1,1);
    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);
    glutKeyboardFunc(keyboard);///NOW3
    glutMouseFunc(mouse);///NOW2
    glutMotionFunc(motion);///NOW2
    glutDisplayFunc(display);

    glutMainLoop();
}

2019年5月17日 星期五

學渣的奮鬥史-11

今天凌晨開始下雨還打雷,怕



今天第一節課教的內容是關於使用FILE去開啟檔案

開檔案有分三種模式,分別是"w","r","a"

今天主要教的內容是"w+"

"w",write(寫入)

有"w+","w"兩種

加了+號是代表不僅寫入,還加了update(上傳)

讓程式碼不僅能夠寫入檔案還能在檔案內更新內容

-

主要參考來源是[這個網站]

如果有同學有興趣歡迎去看看

-

接下來來說說看程式碼

原始碼如下

#include <stdio.h>

FILE * fout=NULL; <---宣告FILE的變數

int main()

{

    fout=fopen("filname.txt","w+");<---"檔案名稱","寫入檔案、更新檔案"

    for(int i=0;i<20;i++){

        fprintf(fout,"Hello World\n");<---"更新的內容"

    }

}

-------------------------------------分隔線-------------------------------------------
第二節課(開始倦了)


好想睡

第二節課講的主要是關於如何在glut中讀寫檔案

那既然要做GLUT那就要下載[這個檔案]

程式碼如下

#include <GL/glut.h>

float angle[20];///NOW

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();///body
        glColor3f(1,1,1);///white
        glutSolidTeapot( 0.3 );///body

        glPushMatrix();///right Arm
            glTranslatef(0.18, 0, 0);///(3)掛到肩上
            glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
            glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心

            glColor3f(1,0,0);///red
            glutSolidTeapot( 0.2 );///right upper arm
        glPopMatrix();
    glPopMatrix();

    glutSwapBuffers();
}
int oldX;///NOW
void mouse(int button, int state, int x, int y)///NOW
{
    oldX = x;///NOW
}
void motion(int x, int y)///NOW
{
    angle[1] += (x-oldX);///NOW

    oldX = x;///NOW

    display();///NOW
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutInitWindowSize(600,600);///我們可以開很大的視窗

    glutCreateWindow("week 13 motion TRT angle file");

    glutMouseFunc(mouse);///使用刮號內的函式

    glutMotionFunc(motion);///使用刮號內的函式

    glutDisplayFunc(display);

    glutMainLoop();
}

-------------------------------------分隔線-------------------------------------------
第三節課(餓)



第三節課使用了第11週的內容

再加上這次上課新的東西

程式碼如下

#include <stdio.h> ///(0)  ///NOW4
#include <GL/glut.h>
FILE * fout=NULL;///(1) ///NOW4
FILE * fin =NULL;///(1) ///NOW5
float angle[20];///NOW
int angleID=1;///第幾個要轉動的關節 ///NOW3
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();///body
        glColor3f(1,1,1);///white
        glutSolidTeapot( 0.3 );///body

        glPushMatrix();///right Arm
            glTranslatef(0.18, 0.15, 0);///(3)掛到肩上
            glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
            glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心

            glColor3f(1,0,0);///red
            glutSolidTeapot( 0.2 );///right upper arm

            glPushMatrix();///NOW2 長出下手臂
                glTranslatef(0.18, 0, 0);///(3)掛到肘上
                glRotatef(angle[2], 0,0,1);///(2)轉動 ///NOW
                glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心

                glColor3f(1,0,0);///red
                glutSolidTeapot( 0.15 );///right lower arm

            glPopMatrix();
        glPopMatrix();

        glPushMatrix();///left Arm
            glTranslatef(-0.18, 0.15, 0);///(3)掛到肩上
            glRotatef(angle[3], 0,0,1);///(2)轉動 ///NOW
            glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心

            glColor3f(1,0,0);///red
            glutSolidTeapot( 0.2 );///left upper arm

            glPushMatrix();///NOW2 長出下手臂
                glTranslatef(-0.18, 0, 0);///(3)掛到肘上
                glRotatef(angle[4], 0,0,1);///(2)轉動 ///NOW
                glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心

                glColor3f(1,0,0);///red
                glutSolidTeapot( 0.15 );///left lower arm

            glPopMatrix();
        glPopMatrix();
    glPopMatrix();



    glPushMatrix( ); ///左邊大腿
            glTranslatef(-0.3, -0.23, 0); ///(3) 掛在身體的左下大腿
            glRotatef(angle[5], 0,0,-1); ///(2) 旋轉
            glTranslatef(-0.15, 0,0); ///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
            glColor3f(1,0,0); ///紅色的
            glutSolidTeapot( 0.2 ); ///左大腿
        glPushMatrix(); ///NOW2
            glTranslatef(-0.2, 0, 0); ///(3) 掛在身體的左肘///NOW2
            glRotatef(angle[6], 0,0,-1); ///(2) 旋轉///NOW2
            glTranslatef(-0.15, 0,0); ///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW
            glColor3f(1,0,0); ///紅色的///NOW2
            glutSolidTeapot( 0.15 ); ///左下手臂///NOW2
        glPopMatrix( );
    glPopMatrix( );


    glPushMatrix( ); ///右邊大腿
        glTranslatef(0.3, -0.23, 0); ///(3) 掛在身體的右肩
        glRotatef(angle[7], 0,0,1); ///(2) 旋轉
        glTranslatef(0.15, 0,0); ///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸

        glColor3f(1,0,0); ///紅色的
        glutSolidTeapot( 0.2 ); ///右大腿

        glPushMatrix( ); ///NOW2
            glTranslatef(0.2, 0, 0); ///(3) 掛在身體的右肘///NOW2
            glRotatef(angle[8], 0,0,1); ///(2) 旋轉///NOW2
            glTranslatef(0.15, 0,0); ///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2

            glColor3f(1,0,0); ///紅色的 ///NOW2
            glutSolidTeapot( 0.15 ); ///右下小腿///NOW2
        glPopMatrix( ); ///NOW2
    glPopMatrix( );
    glutSwapBuffers( );
     ///angle++; ///NOW
}
int oldX, oldY;///NOW5
void motion(int x, int y)///NOW3 用滑鼠mouse來控制angle
{
    angle[angleID] += (x-oldX);///NOW ///NOW3
    oldX = x;///NOW
    if(fout==NULL) fout=fopen("motion.txt", "w+");///NOW4
    for(int i=0; i<20; i++){///NOW4
        printf( "%.1f ", angle[i]);///NOW4
        fprintf( fout, "%.1f ", angle[i]);///NOW4
    }
    printf("\n");///NOW4
    fprintf(fout, "\n");///NOW4
    display();///NOW
}
void mouse(int button, int state, int x, int y)
{
   oldX = x;///NOW
}
void keyboard(unsigned char key, int x, int y)///NOW6 配合鍵盤
{
    if(key=='1')angleID=1;
    if(key=='2')angleID=2;
    if(key=='3')angleID=3;
    if(key=='4')angleID=4;
    if(key=='5')angleID=5;
    if(key=='6')angleID=6;
    if(key=='7')angleID=7;
    if(key=='8')angleID=8;
    if(key=='w' || key=='W'){///NOW4 小寫的 w
        if(fout==NULL) fout=fopen("motion.txt", "w+");///NOW4
        for(int i=0; i<20; i++){///NOW4
            printf( "%.1f ", angle[i]);///NOW4
            fprintf( fout, "%.1f ", angle[i]);///NOW4
        }
        printf("\n");///NOW4
        fprintf(fout, "\n");///NOW4
    }
    if(key=='r'){///NOW5
        if(fin==NULL) fin = fopen("motion.txt", "r");///NOW5
        for(int i=0; i<20;i++){///NOW5
            fscanf(fin, "%f", &angle[i]);///NOW5
        }///NOW5
    }
    glutPostRedisplay();///和 display()很像,但更好 ///NOW5

}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
    glutInitWindowSize(600,600);
    glutCreateWindow("week13 TRT");
    glutIdleFunc(display);///NOW
    glutDisplayFunc(display);
    glutMotionFunc(motion);
    glutMouseFunc(mouse);
    glutKeyboardFunc(keyboard);
    glutMainLoop( );
}



-------------------------------------分隔線-------------------------------------------
ㄅㄅ


2019年5月10日 星期五

學渣的奮鬥史-10

今天小遲到QQ

最近都太晚睡了

到底什麼時候才是個盡頭阿QQQQQQQQQQQQQQQQQQQQQQQQQ





今天的程式碼是為了讓小黑窗可以跑出聲音

需要下載.wav檔案

今天用的專案方式較為特殊是<console application>

有個特別的設定是需要對專案點右鍵後

找到Bulid Option後點進去在Linking setting中的Linking libraries加入winmm

讓程式能讀取到音樂檔

程式碼如下

#include <iostream>
#include <windows.h>
#include <mmsystem.h>
using namespace std;

int main()
{
    PlaySoundA("C:\\Users\\user\\Downloads\\JoJo.wav", NULL, SND_SYNC);
    return 0;
}

第二段有需要下載音樂檔案




在程式碼中,有一段函式是關於按鍵輸入的

經過修改後

程式碼如下

static void key(unsigned char key, int x, int y)
{

    if (key=='1') PlaySoundA("C:\\Users\\user\\Desktop\\music\\do.wav", NULL, SND_ASYNC);
    if (key=='2') PlaySoundA("C:\\Users\\user\\Desktop\\music\\re.wav", NULL, SND_ASYNC);
    if (key=='3') PlaySoundA("C:\\Users\\user\\Desktop\\music\\mi.wav", NULL, SND_ASYNC);
    if (key=='4') PlaySoundA("C:\\Users\\user\\Desktop\\music\\fa.wav", NULL, SND_ASYNC);
    if (key=='5') PlaySoundA("C:\\Users\\user\\Desktop\\music\\so.wav", NULL, SND_ASYNC);
    ....
}

第三段是要讓程式能夠放出mp3檔案

重點是要先將檔案放入專案的資料夾中

要放入的檔案如下

[檔案連結]


較為特別的還有需要輸入 #include "CMP3_MCI.h"

宣告用CMP3_MCI

在main函式中
加入 myMP3.Load("C:\\Users\\user\\Downloads\\love_song_cover.mp3");
         myMP3.Play();

就這樣

我們下次見 ㄅㄅ

2019年5月3日 星期五

學渣的奮鬥史-9

今天上課的內容是利用階乘性的TRT移動以及旋轉去做骨架的模擬



今天不需要寫太多的程式所以老師有給我們程式碼

下載地址在[http://120.125.89.81/]

修改老師的程式碼

讓原本只有一隻手的範例改成兩隻手


程式碼如下

#include <GL/glut.h>
float angle=0;///NOW
float angle1=0, angle2=0, angle3=0, angle4=0;///NOW ///NOW6 配合鍵盤
int jointID=1;///NOW6 配合鍵盤
void display( )
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(255,255,255); ///白色的
    glutSolidTeapot( 0.3 ); ///身體
    glPushMatrix( ); ///右邊手臂
        glTranslatef(0.3, 0, 0); ///(3) 掛在身體的右肩
        glRotatef(angle, 0,0,1); ///(2) 旋轉
        glTranslatef(0.15, 0,0); ///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸

        glColor3f(1,0,0); ///紅色的
        glutSolidTeapot( 0.15 ); ///右手臂

        glPushMatrix( ); ///NOW2
            glTranslatef(0.2, 0, 0); ///(3) 掛在身體的右肘///NOW2
            glRotatef(angle, 0,0,1); ///(2) 旋轉///NOW2
            glTranslatef(0.15, 0,0); ///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2

            glColor3f(1,0,0); ///紅色的 ///NOW2
            glutSolidTeapot( 0.15 ); ///右下手臂///NOW2
        glPopMatrix( ); ///NOW2
    glPopMatrix( );

    glPushMatrix( ); ///左邊手臂
        glTranslatef(-0.3, 0, 0); ///(3) 掛在身體的左肩
        glRotatef(angle, 0,0,-1); ///(2) 旋轉
        glTranslatef(-0.15, 0,0); ///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸

        glColor3f(1,0,0); ///紅色的
        glutSolidTeapot( 0.15 ); ///左手臂

        glPushMatrix(); ///NOW2
            glTranslatef(-0.2, 0, 0); ///(3) 掛在身體的左肘///NOW2
            glRotatef(angle, 0,0,-1); ///(2) 旋轉///NOW2
            glTranslatef(-0.15, 0,0); ///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2

            glColor3f(1,0,0); ///紅色的///NOW2
            glutSolidTeapot( 0.15 ); ///左下手臂///NOW2
        glPopMatrix( ); ///NOW2
    glPopMatrix( );
    glutSwapBuffers( );
     ///angle++; ///NOW
}
int oldX, oldY;///NOW5
void motion(int x, int y)///NOW3 用滑鼠mouse來控制angle
{
    if(jointID==1) angle1 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
    if(jointID==2) angle2 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
    if(jointID==3) angle3 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
    if(jointID==4) angle4 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
    oldX=x;///NOW5
    display();///NOW3 用滑鼠mouse來控制angle
}
void mouse(int button, int state, int x, int y)///NOW5 要知道mouse的按鍵狀況
{///NOW5 要知道mouse的按鍵狀況
    oldX = x; oldY = y;///NOW5 要知道mouse的按鍵狀況, 按下去時,就記得 oldX
}
void keyboard(unsigned char key, int x, int y)///NOW6 配合鍵盤
{
    if(key=='1') jointID=1;///NOW6 配合鍵盤
    if(key=='2') jointID=2;///NOW6 配合鍵盤
    if(key=='3') jointID=3;///NOW6 配合鍵盤
    if(key=='4') jointID=4;///NOW6 配合鍵盤
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week11 TRT");

    glutIdleFunc(display);///NOW
    glutDisplayFunc(display);
    glutMotionFunc(motion);///NOW3 用滑鼠mouse來控制angle
    glutMouseFunc(mouse);///NOW5 要知道mouse的按鍵狀況
    glutKeyboardFunc(keyboard);///NOW6 配合鍵盤

    glutMainLoop( );
}









2019年4月26日 星期五

學渣的奮鬥史-8

我今天手機螢幕摔碎了

難過的一天QAQ


今天的上課內容是在旋轉跟移動還有縮放的關聯

有分自轉及公轉的差別

以下是自轉


再來是公轉


接這用這個概念做了茶壺旋轉的延伸

程式碼如下圖
#include <GL/glut.h>
float angle=0;
void display()
{

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();//備份矩陣,保護程式
        glTranslatef(0,0.5,0);
        glutWireTeapot(0.3);
    glPopMatrix();//還原矩陣
        glPushMatrix();//備份矩陣,保護程式
        glTranslatef(0.51,0.63,0);
        glRotatef(angle,0,0,1);
        glTranslatef(0.6,0,0);
        glRotatef(-90,0,1,0);
        glutWireCone(0.1,0.6,10,10);
    glPopMatrix();//還原矩陣
    glutSwapBuffers();
}
void motion(int x,int y)//用滑鼠來設定x,y
{
    angle=x;
    display();
}

int main(int argc,char ** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("第N個程式");
    glutDisplayFunc(display);
    glutMotionFunc(motion);//呼叫滑鼠函式
    glutMainLoop();
}

成果如下




就這樣 ㄅㄅ


2019年4月12日 星期五

學渣的奮鬥史-7

原來是可愛貓貓阿,我還以為是黑洞呢



分隔線
------------------------------------------------------------------------------------------------------
以下正文

今天的主題是「貼圖」

照慣例的要從老師給的網址

[http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/]

下載3個東西

[win32][glut32.dll][data]

下載OpenCV 2.1.0 的檔案

選第一個網頁中名子最長的exe檔

以下附上連結

[https://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.1/OpenCV-2.1.0-win32-vs2008.exe/download]

安裝時要注意在選擇要勾選

[add opencv to the system PATH for all user]



以上選項

以下是主要程式碼

#include <opencv/highgui.h>

int main()

{
    IplImage*img=cvLoadImage("image.jpg");

    cvShowImage("opencv Window",img);

   cvWaitKey(0);

}

要在codeblock中設定opencv的bin以及include

方法如下

在專案上點擊右鍵

選擇Build Options

進入視窗後

在Search directories中設定Compiler

加入c:\opencv2.1\include

在Search directories中設定Linker

加入c:\opencv2.1\lib

在Linker settings中加入三個要素

cv210

cxcore210

highgui210

設定完成後

再去下載圖檔

名字要設定成image.jpg才能運行程式碼

接著,開第二個專案

這次使用glut的開發環境

要去下載transmissionzero下載

[https://www.transmissionzero.co.uk/files/software/development/GLUT/freeglut-MinGW.zip]

之後在設定環境開發時也需要像上面的專案一樣進行設定

之後就能跑出一張圖片跟一個茶壺的檔案

後來因為上課時間到了的關係

小葉老師有直接給我們完成品的程式碼

以下連結

[https://ppt.cc/fnjUhx]

下課ㄌ

大家ㄅㄅ



小葉老師的英文時間

texture---貼圖

coordinate---座標






2019年3月29日 星期五

學渣的奮鬥史-6



放假、放假、放假,對了對了,還有...沒錯!放假!

今天先複習上次的打光

今天主要是要匯入自己做的模型

利用老師給的網址
[http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/]

下載
[data][windows][source][glut32.dll]

先複習一下上周的課程喔

[學渣的奮鬥史-5]

接這這周學的是如何匯入3D模型

在[soure]裡的[lightmaterial.c]使用Notepad++

找尋開頭有glm的前三個

複製到原先的cpp裡

將[source]的[glm.c]改成[glm.cpp]

在原先project 的資料夾中,加入[source]的[glm.cpp]、[glm.h]

在codeblock中,在project中加入剛剛用的[glm.cpp]

就可以依照名稱匯入OBJ檔

在程式中叫出自己的maya作品了

肥家囉~~~~~

2019年3月22日 星期五

學渣的奮鬥史-5

最近越來越忙,大概是期中近了吧

今天上的東西是利用程式碼給物件上反光材質及打光


利用老師給的資源[data][win32][glut32.dll]做出下圖結果


上圖程式中 ka、kd、ks分別代表的是三種光源

分別是

ambient light 無處不在的光

diffuse light 散射光

specular light 拋光 

今天有另外教學打光的程式碼以及其定義如何打

{定義}

const GLfloat light_ambient[]  = { 1.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 2.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 2.0f, -1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 2.0f, -2.0f, 1.0f };

const GLfloat mat_ambient[]    = { 0.17f, 0.01f, 0.01f, 0.55f };
const GLfloat mat_diffuse[]    = { 0.61f, 0.04f, 0.04f, 0.55f };
const GLfloat mat_specular[]   = { 0.73f, 0.63f, 0.63f, 0.55f };
const GLfloat high_shininess[] = { 77.0f };

{背景}

    glClearColor(1,1,1,1);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
{呼叫光源及材質應用到物件上}

    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( );

{控制選轉}

glRotatef(x,0,1,0);

{旋轉函式}

glutIdleFunc(display);


下課了...應該吧

想吃丹丹漢堡

好 好餓














小葉老師的英文教室

Material/Lighting 打光

position 位置

ambient light 無處不在的光

diffuse light 散射光

specular light 拋光

2019年3月15日 星期五

學渣的奮鬥史-4

今天一切的開始從座標開始講解
講解的方式很有趣,拿烤雞當例子,講解在空間中x,y,z的座標


所以,今天就從烤雞開始吧(好餓(。ŏ_ŏ)

接下來有介紹好用的解壓縮程式-7.z

在效率上對於winrar有明顯的差距

接著跟我們介紹另一個班做得不做的案例

其中看到幾個做得不錯的實在是讓人驚艷呢

接著

仔細的講解了上次課程中,在上次課程的最後講解了滑鼠的應用

今天再把應用拿出來,在講解一次讓我們有更深入的了解

glPushMatrix ( ) ; //備份矩陣,保護好程式


glPopMatrix ( ) ; //還原矩陣,跟上面的備份矩陣一起使用


使用方式如下


glPushMatrix();//備份矩陣,保護好程式
        glTranslated(0.2,0.2,0);//移動茶壺的程式
        glutSolidTeapot(0.3);//實心茶壺
glPopMatrix();//還原矩陣,跟上面的備份矩陣一起使用

使用後就能避免掉茶壺會重複移動的問題了

然後今天介紹了新的東西{glRotatedf(angle,x,y,z)}

glRotatedf()函數內分別是角度x座標y座標z座標

使用函式後,函式如下圖

glPushMatrix();//備份矩陣,保護好程式
        glTranslated(0.2,0.2,0);//移動茶壺的程式
       glRotatedf(angle,x,y,z)
        glutSolidTeapot(0.3);//實心茶壺
glPopMatrix();//還原矩陣,跟上面的備份矩陣一起使用

加函式進去後,程式結果如下圖


需要改變的角度可對應座標去進行修改angle


準備下課囉(好餓

吃飯去  ─=≡Σ((( つ•̀ω•́)つ





今天小葉老師的英文時間

Rotate 迴轉


2019年3月8日 星期五

學渣的奮鬥史-3

今天下大雨加上寒流

真D冷


今天上的是移動

從小葉老師提供的資源開啟一個可以透過改變座標以移動物件的東西



透過上次茶壺的程式碼

寫一行移動座標的程式碼

glTranslated( 0.2 , 0.2 , 0 );

逗點分隔開來的分別是

glTranslated( x , y , z );

程式寫好後,由滑鼠在點一下視窗會讓程式碼在執行一次

成果大約如下圖


論及為什麼會出現第二個茶壺呢

因為程式中的bug會造成執行的部分重複

加上兩行程式碼就能夠避面這個情況

分別是
glPushMatrix ( ) ; //備份矩陣,保護好程式

glPopMatrix ( ) ; //還原矩陣,跟上面的備份矩陣一起使用

使用方式如下

glPushMatrix();//備份矩陣,保護好程式
        glTranslated(0.2,0.2,0);//移動茶壺的程式
        glutSolidTeapot(0.3);//實心茶壺
glPopMatrix();//還原矩陣,跟上面的備份矩陣一起使用

使用後就能避免掉茶壺會重複移動的問題了

加上glutMotionFunc(motion);

在建立一個motion的函式讓他能運作

要記得加float以定義x,y座標值

motion函式內放

x=nowx;//更新x座標
y=nowy;//更新y座標
display( );//再次呼叫display讓他再做一次以更新畫面

加上

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

以更新buffer跟depth

接著就能在視窗內讓茶壺跟著滑鼠移動了


今天就到這裡

下課!!!!





小葉老師的英文小教室

移動 Translate

2019年2月23日 星期六

學渣的奮鬥史-2

前言

為什麼禮拜六要上課RRRRRR


正課開始

今天做的是利用老師提供的程式資源去算出位址
位址在[http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/]
下載[data.zip][windows.zip][glut32.dll]
解壓縮後把data的料夾跟glut32.dll放進
可以利用程式寫出不同的點線面
再透過旁邊的控制程式改變顏色



透過修改GLUT的程式碼
寫出一個茶壺的形狀


程式碼細節如下
#include <GL/glut.h>
void display()
{
    glutSolidTeapot(0.3);//實心茶壺
    glutSwapBuffers( );//交換buffer顯示
}
int main( int argc char ** argv )
{
    glutInit( &argc argv );
    glutInitDisplayModeGLUT_DOUBLE | GLUT_DEPTH );//double預先存好下一張圖片等待buffer交換,depth是3D的程式碼,要讓建的模有深度
    glutCreateWindow"first window" );
    glutDisplayFuncdisplay );//畫布類型的存在,要讓跑出來的東西有地方放
    glutMainLoop( );
}
程式結果如下圖

接著可以使用glBegin( );//開始畫形狀在()內寫下想要的形狀
最後結尾時須使用glEnd( );
也可使用glColor3f( 0 , 0 , 0 );更改顏色對應的顏色分別是RGB

課堂結束下課囉



小葉老師的英文時間

點>>point
頂點>>vertex>>vertices