顯示具有 06160565_李佳駿 標籤的文章。 顯示所有文章
顯示具有 06160565_李佳駿 標籤的文章。 顯示所有文章

2019年6月6日 星期四

不甘心拉

1作業:Q&A
2複習:貼圖
3複習:打光
4複習:模型

複習貼圖
下載opencv2.1 freeglut
opencv要弄很多東西


#include <opencv/highgui.h> ///for cvCvtColor()
#include <opencv/cv.h>
#include <GL/glut.h> ///3D glut
#include <stdio.h>
float angle=0; ///自動轉很帥
GLUquadric * quad;
void display()
{   glEnable(GL_DEPTH_TEST); ///要啟動 Detph Test 深度值的測試,3D顯示才正確
    glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///自動轉很帥
        glRotatef(90, 1,0,0);
        glRotatef(angle, 0,0,1);///自動轉很帥
        gluQuadricTexture(quad, 1);
        gluSphere(quad, 0.5, 30, 30);///glutSolidTeapot(0.3);
    glPopMatrix();///自動轉很帥
    glFlush();
    angle+=1;///自動轉很帥
}
void myInit()
{
    quad = gluNewQuadric();
    IplImage * img = cvLoadImage("maruto.jpg"); ///OpenCV讀圖
    cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    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); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
    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);
}   ///最後一行最難/最重要, 所貼圖影像的資料都設定好
void timer(int t)
{/// 1000 msec   50fps:20msec
    glutTimerFunc(20, timer, 0);
    //printf("timer now\n");
    glutPostRedisplay();
}
int main(int argc, char**argv)
{   glutInit(&argc, argv);
    glutCreateWindow("3D");
    glutDisplayFunc(display); ///顯示
    //glutIdleFunc(display);///自動轉很帥 (閒閒沒事幹, 就重畫)
    glutTimerFunc(0, timer, 0);

    myInit(); ///我的 init 初始化 把貼圖準備好 前面OpenCV 2行, 後面 OpenGL 9行
    glutMainLoop();
}
------------------------------------------------------------------------------------------------------
這是改過的 放了三張圖片 一個茶壺 一個旋轉 一個背景
#include <GL/glut.h>
#include <opencv/highgui.h> ///OpenCV High GUI讀圖 ///貼圖需要它
#include <opencv/cv.h> ///OpenCV cvCvtColor() to convert color///貼圖需要它
///程式碼是對的, 但是沒有設定好include, lib, bin
GLuint id1, id2, id3;///NOW2 ///貼圖需要它
float a=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBindTexture(GL_TEXTURE_2D, id1);///id1 for background ///貼圖需要它
    glBegin(GL_POLYGON); ///貼圖需要它
        glTexCoord2f(0, 0); glVertex3f(-1, +1, 0); ///貼圖需要它
        glTexCoord2f(0, 1); glVertex3f(-1, -1, 0); ///貼圖需要它
        glTexCoord2f(1, 1); glVertex3f(+1, -1, 0); ///貼圖需要它
        glTexCoord2f(1, 0); glVertex3f(+1, +1, 0); ///貼圖需要它
    glEnd();///貼圖需要它

    glBindTexture(GL_TEXTURE_2D, id3);///id3 for rotating square
    glPushMatrix();
        glTranslatef(0.5, 0.5, 0);
        glRotatef(a++, 0, 0, 1);
        glScalef(0.3, 0.3, 0.3);
        glBegin(GL_POLYGON);
            glTexCoord2f(0, 0); glVertex3f(-1, +1, 0);
            glTexCoord2f(0, 1); glVertex3f(-1, -1, 0);
            glTexCoord2f(1, 1); glVertex3f(+1, -1, 0);
            glTexCoord2f(1, 0); glVertex3f(+1, +1, 0);
        glEnd();
    glPopMatrix();

    glBindTexture(GL_TEXTURE_2D, id2);///id2 for teapot
    glutSolidTeapot( 0.3 );
    glutSwapBuffers();
}
///void myInit()
GLuint myTexture(char * filename) ///貼圖需要它
{
    IplImage * img = cvLoadImage(filename); ///NOW OpenCV ///貼圖需要它
    cvCvtColor(img, img, CV_BGR2RGB);///convert color ///NOW OpenCV ///貼圖需要它

    GLuint id; ///貼圖需要它
    glEnable(GL_TEXTURE_2D); ///貼圖需要它
    glGenTextures(1, &id ); ///貼圖需要它
    glBindTexture(GL_TEXTURE_2D, id); ///貼圖需要它
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); ///貼圖需要它
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_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); ///貼圖需要它
    return id;///貼圖需要它
}
int main(int argc, char **argv)
{
    ///IplImage * img = cvLoadImage("marvel.jpg");
    ///cvShowImage("opencv", img);
    ///cvWaitKey(0);///等你按按鍵
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE |GLUT_DEPTH);
    glutCreateWindow("GLUT");///之後
    ///建好GLUT視窗,可以開始準備 3D 貼圖 (要在create...MainLoop才能建貼圖)
    id1 = myTexture("naruto.jpg"); ///myInit();///我們的貼圖在這裡 ///貼圖需要它
    id2 = myTexture("maruto.jpg");
    id3 = myTexture("nn.jpg");

    glutDisplayFunc(display);
    glutIdleFunc(display);

    glutMainLoop();///之前
}


2019年5月30日 星期四

一哭二鬧三上悠亞




電腦圖學2019-05-30 week15
1.主題:攝影機 運鏡
2.主題:投影 矩陣
3.複習:位置移動VS轉動
4.複習:背景貼圖
5.期末作品

下載WINDOWS GLUT32DLL DATA
透過main cpp把檔案弄到codeblocks打開 很酷

這個用到的都是之前交過的 但是還沒打光 所以看不到人長怎樣

glEnable(GL_DEPTH_TEST);<<深度偵測 很重要****
glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);開燈光
 GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };
    glLightfv(GL_LIGHT0, GL_POSITION, light_pos);燈光亮度
#include <math.h> 因為用cos sin所以math函式
float eyeX=0.5, eyeY=0, eyeZ=0; 設定初始角度
void timer(int t) 時間軸
{
    float angle = (t/180.0)*3.1415926; 角度公式
    eyeX=0.5*cos(angle);  這我也不太懂
    eyeZ=0.5*sin(angle); 

    glutTimerFunc(33, timer, t+1); 之前交的時間軸函式
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity();
    gluLookAt( eyeX, eyeY, eyeZ,///eye ///NOW3
           0, 0, 0,///center ///NOW3
               0, 1, 0);///up    ///NOW3
lookat>>觀看

glMatrixMode(GL_PROJECTION); 開啟ortho才不會破圖
    glLoadIdentity(); ///NOW4
glOrtho(-1, +1,  -1,+1, -10,+10);
--------------------------------------------------------------------
#include <GL/glut.h>///GLUT 外掛
#include "glm.h"///glm.cpp for 3D model glmReadOBJ(), glmDraw(), glmUnitized()
GLMmodel * pmodel=NULL;///指標
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();
}
#include <math.h>///for sin() cos() ///NOW3
float eyeX=4, eyeY=0, eyeZ=0; ///NOW3
float upX=0,upY=1,upZ=0;
void timer(int t)///NOW3
{
    glutTimerFunc(33, timer, t+1);///NOW3

    float angle = (t/180.0)*3.1415926; ///NOW3
    eyeX=4*cos(angle); ///NOW3
    eyeZ=4*sin(angle); ///NOW3
    glMatrixMode(GL_PROJECTION); ///NOW4
    glLoadIdentity(); ///NOW4
gluPerspective(60.0, 1, 1.0, 256.0);///glOrtho(-1, +1,  -1,+1, -10,+10);

    glMatrixMode(GL_MODELVIEW);///NOW3
    glLoadIdentity();///NOW3
    gluLookAt( eyeX, eyeY, eyeZ,///eye ///NOW3
           0, 0, 0,///center ///NOW3
               upX, upY, upZ);///up    ///NOW3

    glutPostRedisplay();///NOW3
}
void world_reshape(int width, int height){
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, 1, 1.0, 256.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt( eyeX, eyeY, eyeZ,///eye ///NOW3
           0, 0, 0,///center ///NOW3
               upX, upY, upZ);///up    ///NOW3


    glutPostRedisplay();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE);
    glutInitWindowSize(512,512);
    glutInitWindowPosition(50, 50);
    glutCreateWindow("week15-06160565");
    glutReshapeFunc(world_reshape);
    glutDisplayFunc(display);
    glutTimerFunc(33, timer, 0);///NOW3

    GLfloat light_pos[] = { 0.0, 0.0, 1.0, 0.0 };
    glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_POSITION, light_pos);

    glutMainLoop();

    return 0;
}
--------------------------------------------
world_reshape函式 當移動視窗大小 人物會維持比例 不會忽胖忽瘦
void world_reshape(int width, int height){
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, 1, 1.0, 256.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt( eyeX, eyeY, eyeZ,///eye ///NOW3
           0, 0, 0,///center ///NOW3
               upX, upY, upZ);///up    ///NOW3


    glutPostRedisplay();
}
-----------------------------------------------
gluPerspective(60.0, 1, 1.0, 256.0);透視
glOrtho(-1, +1,  -1,+1, -10,+10);直視

2019年5月23日 星期四

電腦圖學神奧聯盟冠軍

電腦圖學2019-05-23 week14
1.主題:計時器
2.主題:內差公式
3.主題:動畫
4.期末作品
--------------------------------------------------------------------------
void timer(int t){
        glutTimerFunc(3000,timer,t+1);
        printf("%d\n",t);
        PlaySoundA("nan.wav",NULL,SND_ASYNC);

}
-------------------------------------
呼叫音樂函式 每三秒鐘播放nan檔名的音樂
---------------------------------------
 glutTimerFunc(1000,timer,0);<<<一開始等三秒鐘才開使放音樂(這是放在int main涵式裡面
----------------------------------------
動畫計時器
 glutTimerFunc(30,timer,t+1);
        float alpha=(t%33)/33.0;
        nowX=alpha*1+(1-alpha)*-1;
        angle+=1;
        glutPostRedisplay();///系統重繪
-------------------------------------------
t+1<<現在秒數+1 進行下一秒要做的事情
t%33為了不讓t+1加到大於1無法變成1/33
nowX=alpha*1+(1-alpha)*-1;<<內差公式

2019年5月16日 星期四

我要成為電腦圖學大師

電腦圖學 2019-05-16 week13
1.主題:檔案
2.主題:開箱 擺動作
3.主題:複習
4.作業:機器人擺動動作
------------------------------------------------------------------
使用Console application PROJECT
使用<FILE  *> 使用讀檔寫檔並打出自己想輸出的文字內容
執行後小黑窗並不會有文字 因為文字直接存到資料夾
而打開後就看到我們剛剛輸入的文字輸出了
而在設定寫檔案fopen後面的"w"是寫檔案 並且原資料夾不需有這個檔案他可自己創見出來
老師則是寫"w+"差異在老師所寫的可以進行更新 而我寫的則不行
-----------------------------------------------------------------------
#include <stdio.h>
FILE *fout=NULL;
int main(){
    fout=fopen("fliename.txt","w");
    for(int i=0;i<=20;i++){
        fprintf(fout,"Hello Word\n");
    }
}
-------------------------------------------------------------------------
我們要換成輸出檔案
而差異跟剛剛都是一樣的模式
然後我沒有設定附檔名 所以不能直接用文字檔打開 要用 notepeed++開

------------------------------------------------------------------------
下面這張圖片是改成存在特定資料夾 就可以存在自己想要的地方了

-----------------------------------------------------------
#include <GL/glut.h>
float angle[20];///NOW2
int joinID=1;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3f(1, 1, 1);///主體顏色
        glutSolidTeapot( 0.3 );///主體
        glPushMatrix();
            glTranslatef(0.2, 0, 0);///掛在主體的位置
            glRotatef(angle[1], 0,0,1);///旋轉
            glTranslatef(0.15, 0, 0);///旋轉中心
            glColor3f(1, 0, 0);///顏色
            glutSolidTeapot( 0.2 );///right arm
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
int oldX=0;///NOW2
void mouse(int button, int state, int x, int y)///NOW2
{///NOW2
    oldX = x;///NOW2
}



void motion(int x, int y)///NOW2
{///NOW2
    angle[1] += x-oldX;///NOW2
    oldX = x;///NOW2
    display();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    ///glutInitWindowSize(600,600);///可以開大一點的window
    glutCreateWindow("06160565 week13");
    glutMouseFunc(mouse);///NOW2
    glutMotionFunc(motion);///NOW2
    glutDisplayFunc(display);

    glutMainLoop();
}
------------------------------------------------------------------
上面程式碼就是之前交的使單一關節移動
-------------------------------------------------------------------
    if(key=='r'){
        if(fin==NULL) fin = fopen("motion.txt", "r");
        for(int i=0;i<20; i++){
            fscanf(fin, "%f", &angle[i]);
            printf(" %.2f ", angle[i]);
    }
這是新+上的FILE讀檔 假使我們可以預先移動關節 並存下檔案後
我們就可以讀取檔案 他就會照著我們先前移動的關節移動
感覺就有點像動畫一樣 他會自己動
-------------------------------------------------------------------
#include <GL/glut.h>
#include <stdio.h>///NOW_FILE (0)
float angle[20];///NOW2
int angleID=1;///NOW3
FILE * fout = NULL;///NOW_FILE (1)
FILE * fin = NULL;///NOW_FILE_READ (1)
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3f(1, 1, 1);///white
        glutSolidTeapot( 0.3 );///body

        glPushMatrix();///右邊
            glTranslatef(0.2, 0, 0);///NOW2 (3)掛上去
            glRotatef(angle[1], 0,0,1);///NOW2 ///(2)旋轉
            glTranslatef(0.15, 0, 0);///NOW2 (1)旋轉中心
            glColor3f(1, 0, 0);///red
            glutSolidTeapot( 0.2 );///right arm
            glPushMatrix();
                glTranslatef(0.2, 0, 0);///NOW2 (3)掛上去
                glRotatef(angle[2], 0,0,1);///NOW2 ///(2)旋轉
                glTranslatef(0.15, 0, 0);///NOW2 (1)旋轉中心
                glColor3f(1, 0, 0);///red
                glutSolidTeapot( 0.2 );///right lower arm
            glPopMatrix();
        glPopMatrix();

        glPushMatrix();///左邊
            glTranslatef(-0.2, 0, 0);///NOW2 (3)掛上去
            glRotatef(angle[3], 0,0,1);///NOW2 ///(2)旋轉
            glTranslatef(-0.15, 0, 0);///NOW2 (1)旋轉中心
            glColor3f(1, 0, 0);///red
            glutSolidTeapot( 0.2 );///right arm
            glPushMatrix();
                glTranslatef(-0.2, 0, 0);///NOW2 (3)掛上去
                glRotatef(angle[4], 0,0,1);///NOW2 ///(2)旋轉
                glTranslatef(-0.15, 0, 0);///NOW2 (1)旋轉中心
                glColor3f(1, 0, 0);///red
                glutSolidTeapot( 0.2 );///right lower arm
            glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
int oldX=0;///NOW2
void mouse(int button, int state, int x, int y)///NOW2
{///NOW2
    oldX = x;///NOW2
}

void motion(int x, int y)///NOW2
{///NOW2
    angle[angleID] += x-oldX;///NOW3
    oldX = x;///NOW2
    if(fout == NULL) fout = fopen("motion.txt", "w+");///NOW_FILE (2)
    for(int i=0;i<20;i++){///NOW3
        printf(" %.2f ", angle[i]);///NOW3
        fprintf(fout, " %.2f ", angle[i]);///NOW_FILE
    }
    printf("\n");///NOW3
    fprintf(fout, "\n");///NOW_FILE
    display();///NOW2
}
void keyboard(unsigned char key, int x, int y)///NOW3
{///NOW3
    if(key=='1') angleID=1;///NOW3
    if(key=='2') angleID=2;///NOW3
    if(key=='3') angleID=3;///NOW3
    if(key=='4') angleID=4;///NOW3
    if(key=='w'){///NOW_FILE
        fout = fopen("motion.txt", "w+");///NOW_FILE (2)
    }
    if(key=='r'){
        if(fin==NULL) fin = fopen("motion.txt", "r");///NOW_FILE_READ (2)
        ///scanf("%d", &n);
        for(int i=0;i<20; i++){///NOW_FILE_READ
            fscanf(fin, "%f", &angle[i]);///NOW_FILE_READ
            printf(" %.2f ", angle[i]);///順便印出來看數字對不對
        }
    }
    glutPostRedisplay();///NOW_FILE_READ 和 display()很像
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    ///glutInitWindowSize(600,600);///可以開大一點的window
    glutCreateWindow("Week 13 angle motion file");
    glutKeyboardFunc(keyboard);///NOW3
    glutMouseFunc(mouse);///NOW2
    glutMotionFunc(motion);///NOW2
    glutDisplayFunc(display);

    glutMainLoop();
}
-----------------------------------------------------------------------------
完整的程式碼 記在blogger比較不會忘記^^

2019年5月9日 星期四

台北的未來 丁守中

電腦圖學2019-05-09 week12
(1)主題:鍵盤
(2)主題:聲音 音樂
(3)複習:階層 T-R-T 骨架
(4)作業:能操控的機器人
------------------------------------------------------
1.
#include <mmsystem.h>
#include <windows.h>

int main()
{
    PlaySoundA("C:\\Users\\user\\Downloads\\123.wav",NULL,SND_SYNC);}
2.改用glut project開其音樂檔
#include <mmsystem.h>
#include <windows.h>
int main()
{
    PlaySoundA("C:\\Users\\user\\Downloads\\123.wav",NULL,SND_SYNC);}
------------------------------------------------
3.
#ifdef _APPLE_
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

#include <stdlib.h>

static int slices = 16;
static int stacks = 16;

/* GLUT callback Handlers */

static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}

static void display(void)
{
    const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*90.0;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3d(1,0,0);

    glPushMatrix();
        glTranslated(-2.4,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidSphere(1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(0,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidCone(1,1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2.4,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidTorus(0.2,0.8,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(-2.4,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireSphere(1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(0,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireCone(1,1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2.4,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireTorus(0.2,0.8,slices,stacks);
    glPopMatrix();

    glutSwapBuffers();
}

#include <mmsystem.h>
static void key(unsigned char key, int x, int y)
{
    if(key=='1') PlaySoundA("C:\\Users\\user\\Downloads\\music\\do.wav",NULL,SND_ASYNC);
    if(key=='2') PlaySoundA("C:\\Users\\user\\Downloads\\music\\re.wav",NULL,SND_ASYNC);
    if(key=='3') PlaySoundA("C:\\Users\\user\\Downloads\\music\\mi.wav",NULL,SND_ASYNC);
    if(key=='4') PlaySoundA("C:\\Users\\user\\Downloads\\music\\fa.wav",NULL,SND_ASYNC);
    if(key=='5') PlaySoundA("C:\\Users\\user\\Downloads\\music\\so.wav",NULL,SND_ASYNC);

    switch (key)
    {
        case 27 :
        case 'q':
            exit(0);
            break;

        case '+':
            slices++;
            stacks++;
            break;

        case '-':
            if (slices>3 && stacks>3)
            {
                slices--;
                stacks--;
            }
            break;
    }

    glutPostRedisplay();
}

static void idle(void)
{
    glutPostRedisplay();
}

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 */
#include <mmsystem.h>
int main(int argc, char *argv[])

{

    PlaySoundA("C:\\Users\\user\\Downloads\\abc.wav",NULL,SND_SYNC);

    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

    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;
}
--------------------------------
4.
/*
 * GLUT Shapes Demo
 *
 * Written by Nigel Stewart November 2003
 *
 * This program is test harness for the sphere, cone
 * and torus shapes in GLUT.
 *
 * Spinning wireframe and smooth shaded shapes are
 * displayed until the ESC or q key is pressed.  The
 * number of geometry stacks and slices can be adjusted
 * using the + and - keys.
 */

#ifdef _APPLE_
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

#include <stdlib.h>

static int slices = 16;
static int stacks = 16;

/* GLUT callback Handlers */

static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}

static void display(void)
{
    const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*90.0;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3d(1,0,0);

    glPushMatrix();
        glTranslated(-2.4,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidSphere(1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(0,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidCone(1,1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2.4,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidTorus(0.2,0.8,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(-2.4,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireSphere(1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(0,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireCone(1,1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2.4,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireTorus(0.2,0.8,slices,stacks);
    glPopMatrix();

    glutSwapBuffers();
}

#include <mmsystem.h>
static void key(unsigned char key, int x, int y)
{
    if(key=='1') PlaySoundA("C:\\Users\\user\\Downloads\\do.wav",NULL,SND_ASYNC);
    if(key=='2') PlaySoundA("C:\\Users\\user\\Downloads\\re.wav",NULL,SND_ASYNC);
    if(key=='3') PlaySoundA("C:\\Users\\user\\Downloads\\mi.wav",NULL,SND_ASYNC);
    if(key=='4') PlaySoundA("C:\\Users\\user\\Downloads\\fa.wav",NULL,SND_ASYNC);
    if(key=='5') PlaySoundA("C:\\Users\\user\\Downloads\\so.wav",NULL,SND_ASYNC);

    switch (key)
    {
        case 27 :
        case 'q':
            exit(0);
            break;

        case '+':
            slices++;
            stacks++;
            break;

        case '-':
            if (slices>3 && stacks>3)
            {
                slices--;
                stacks--;
            }
            break;
    }

    glutPostRedisplay();
}

static void idle(void)
{
    glutPostRedisplay();
}

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 */
#include "CMP3_MCI.h"
CMP3_MCI myMP3;
#include <mmsystem.h>
int main(int argc, char *argv[])

{
    myMP3.Load("C:\\Users\\user\\Downloads\\many.wma");
    myMP3.Play();
    ///PlaySoundA("C:\\Users\\user\\Downloads\\abc.wav",NULL,SND_SYNC);

    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

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

2019年5月2日 星期四

學費進的來 學生出不去 銘傳發大財

電腦圖學
(1)小考T-R-T轉動
(2)主題:階層轉動,骨架
(3)主題:鍵盤按鍵
下載freeglut 以及老師給的程式碼在120.125.89.81


#include <GL/glut.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glColor3f(255,255,255);///白色
    glutSolidTeapot( 0.3 );///身體
    ///右邊的手臂
    glPushMatrix();
        glTranslatef(0.2, 0,0 );///(3)往右移動, 掛在身體的右肩
        glRotatef(angle, 0,0,1);///(2)旋轉
        glTranslatef(0.28, 0,0);///(1)往右推,把茶壼的柄,放到中心,變 轉動軸

        glColor3f(255,0,0);///紅色
        glutSolidTeapot( 0.2 );///手臂
    glPopMatrix();

    glutSwapBuffers();
    angle++;
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week11 TRT");
    glutIdleFunc(display);///Now!!!!
    glutDisplayFunc(display);

    glutMainLoop();
}


--------------------------------------------------------
第二個 跟手臂一樣有關節會動
#include <GL/glut.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glColor3f(255,255,255);///白色
    glutSolidTeapot( 0.3 );///身體
    ///右邊的手臂
    glPushMatrix();
    glTranslatef(0.2, 0,0 );///(3)往右移動, 掛在身體的右肩
    glRotatef(angle, 0,0,1);///(2)旋轉
    glTranslatef(0.28, 0,0);///(1)往右推,把茶壼的柄,放到中心,變 轉動軸

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂

    glPushMatrix();
    glTranslatef(0.2, 0,0 );
    glRotatef(angle, 0,0,1);
    glTranslatef(0.28, 0,0);

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂
    glPopMatrix();
    glPopMatrix();



   glPushMatrix();
    glTranslatef(-0.2, 0,0 );///(3)往右移動, 掛在身體的右肩
    glRotatef(angle, 0,0,1);///(2)旋轉
    glTranslatef(-0.28, 0,0);///(1)往右推,把茶壼的柄,放到中心,變 轉動軸

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂

    glPushMatrix();
    glTranslatef(-0.2, 0,0 );
    glRotatef(angle, 0,0,1);
    glTranslatef(-0.28, 0,0);

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂
    glPopMatrix();
    glPopMatrix();

    glutSwapBuffers();
    angle++;
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week11 06160565");
    glutIdleFunc(display);///Now!!!!
    glutDisplayFunc(display);

    glutMainLoop();
}

--------------------------------------------------------------
第三個 用滑鼠移動關節
#include <GL/glut.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glColor3f(255,255,255);///白色
    glutSolidTeapot( 0.3 );///身體
    ///右邊的手臂
    glPushMatrix();
    glTranslatef(0.2, 0,0 );///(3)往右移動, 掛在身體的右肩
    glRotatef(angle, 0,0,1);///(2)旋轉
    glTranslatef(0.28, 0,0);///(1)往右推,把茶壼的柄,放到中心,變 轉動軸

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂

    glPushMatrix();
    glTranslatef(0.2, 0,0 );
    glRotatef(angle, 0,0,1);
    glTranslatef(0.28, 0,0);

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂
    glPopMatrix();
    glPopMatrix();



   glPushMatrix();
    glTranslatef(-0.2, 0,0 );///(3)往右移動, 掛在身體的右肩
    glRotatef(angle, 0,0,1);///(2)旋轉
    glTranslatef(-0.28, 0,0);///(1)往右推,把茶壼的柄,放到中心,變 轉動軸

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂

    glPushMatrix();
    glTranslatef(-0.2, 0,0 );
    glRotatef(angle, 0,0,1);
    glTranslatef(-0.28, 0,0);

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂
    glPopMatrix();
    glPopMatrix();

    glutSwapBuffers();
    ///angle++;
}
    void motion(int x,int y)
    {
        angle=x;
        display();
    }
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week11 06160565");
    glutIdleFunc(display);///Now!!!!
    glutDisplayFunc(display);
    glutMotionFunc(motion);

    glutMainLoop();
}
-----------------------------------
第四個 透過按鍵1 2 3 4 設定動哪個關節
#include <GL/glut.h>
float angle1,angle2,angle3,angle4;
int joinID=1;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glColor3f(255,255,255);///白色
    glutSolidTeapot( 0.3 );///身體
    ///右邊的手臂
    glPushMatrix();
    glTranslatef(0.2, 0,0 );///(3)往右移動, 掛在身體的右肩
    glRotatef(angle1, 0,0,1);///(2)旋轉
    glTranslatef(0.28, 0,0);///(1)往右推,把茶壼的柄,放到中心,變 轉動軸

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂

    glPushMatrix();
    glTranslatef(0.2, 0,0 );
    glRotatef(angle2, 0,0,1);
    glTranslatef(0.28, 0,0);

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂
    glPopMatrix();
    glPopMatrix();



   glPushMatrix();
    glTranslatef(-0.2, 0,0 );///(3)往右移動, 掛在身體的右肩
    glRotatef(angle3, 0,0,1);///(2)旋轉
    glTranslatef(-0.28, 0,0);///(1)往右推,把茶壼的柄,放到中心,變 轉動軸

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂

    glPushMatrix();
    glTranslatef(-0.2, 0,0 );
    glRotatef(angle4, 0,0,1);
    glTranslatef(-0.28, 0,0);

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂
    glPopMatrix();
    glPopMatrix();

    glutSwapBuffers();
    ///angle++;
}
    void motion(int x,int y)
    {
        if(joinID==1) angle1=x;
        if(joinID==2) angle2=x;
        if(joinID==3) angle3=x;
        if(joinID==4) angle4=x;
        display();
    }
    void keyboard(unsigned char key,int x,int y)
    {
        if(key=='1') joinID=1;
        if(key=='2') joinID=2;
        if(key=='3') joinID=3;
        if(key=='4') joinID=4;
        display();
    }
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week11 06160565");
    glutIdleFunc(display);///Now!!!!
    glutDisplayFunc(display);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
}

而這次特別加上glutKeyboardFunc(keyboard);
讓程式可以偵測到我們按了數字鍵幾號
並設定出 按1 2 3 4各動哪些關節
------------------------------------------
第五個 因為如果我們有20個關節要動 打20個if實在太纍贅了 所以使用矩陣
就不需要打這麼多程式碼 看起來也更整潔乾淨了
#include <GL/glut.h>
float angle[20];
int joinID=1;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glColor3f(255,255,255);///白色
    glutSolidTeapot( 0.3 );///身體
    ///右邊的手臂
    glPushMatrix();
    glTranslatef(0.2, 0,0 );///(3)往右移動, 掛在身體的右肩
    glRotatef(angle[1], 0,0,1);///(2)旋轉
    glTranslatef(0.28, 0,0);///(1)往右推,把茶壼的柄,放到中心,變 轉動軸

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂

    glPushMatrix();
    glTranslatef(0.2, 0,0 );
    glRotatef(angle[2], 0,0,1);
    glTranslatef(0.28, 0,0);

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂
    glPopMatrix();
    glPopMatrix();



   glPushMatrix();
    glTranslatef(-0.2, 0,0 );///(3)往右移動, 掛在身體的右肩
    glRotatef(angle[3], 0,0,1);///(2)旋轉
    glTranslatef(-0.28, 0,0);///(1)往右推,把茶壼的柄,放到中心,變 轉動軸

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂

    glPushMatrix();
    glTranslatef(-0.2, 0,0 );
    glRotatef(angle[4], 0,0,1);
    glTranslatef(-0.28, 0,0);

    glColor3f(255,0,0);///紅色
    glutSolidTeapot( 0.2 );///手臂
    glPopMatrix();
    glPopMatrix();

    glutSwapBuffers();
    ///angle++;
}
    void motion(int x,int y)
    {
        angle[joinID]=x;
        ///if(joinID==1) angle1=x;
        ///if(joinID==2) angle2=x;
        ///if(joinID==3) angle3=x;
        ///if(joinID==4) angle4=x;
        display();
    }
    void keyboard(unsigned char key,int x,int y)
    {
        if(key=='1') joinID=1;
        if(key=='2') joinID=2;
        if(key=='3') joinID=3;
        if(key=='4') joinID=4;
        display();
    }
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week11 06160565");
    glutIdleFunc(display);///Now!!!!
    glutDisplayFunc(display);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
}

因此上述有些程式碼便可以刪除 就不需要那麼佔版面了