2020年7月1日 星期三

Week17-總複習 for 期末作品

W17-01打開剛彈模型

下載OpenCV、freeglut、3DEXploration
另存新檔匯出cpp檔案

 到下載資料夾找BMP檔可以看到剛彈模型的元素


打開CodeBlocks新增" OpenGL "專案
把剛彈.cpp檔的notepad++中的程式碼複製進來

把main.c移除掉
再新增addfile一個main.cpp


W17-02幫剛彈上貼圖

新增一個glut專案
照著第7週方法把貼圖讀進來







重新開啟glut專案

複製第7週的程式碼
inmtTexture()


 設定Compiler



讀模型跟貼圖檔案



2020年6月30日 星期二

week18

藉由輸入指令可以達到讓模型移動或轉動的各種效果


可以在打開小黑窗的時候知道說目前是在操作哪一個部份以及轉動之後的位置

期末作業_會跳舞的機器人

#include <stdio.h>
FILE * fout=NULL;
FILE * fin=NULL;
#include <GL/glut.h>
#include "glm.h"
#include "CMP3_MCI.h"
#include <opencv/highgui.h>
#include <opencv/cv.h>
CMP3_MCI myMP3;
GLMmodel*model=NULL;
GLMmodel*mode2=NULL;
GLMmodel*mode3=NULL;
GLMmodel*mode4=NULL;
GLMmodel*mode5=NULL;
GLMmodel*mode6=NULL;
GLMmodel*mode7=NULL;




int angle[15]={};
int angleID=0;
int oldX, oldY;

GLUquadric * quad;
GLuint id;
void motion(int x, int y);
void mouse(int button, int state, int x, int y);
void keyboard(unsigned char key, int x, int y);
void saveAll();

const GLfloat light_ambient[]  = { 4.0f, 4.0f, 4.0f, 4.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, -10.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 };
int oldAngle[15];
int newAngle[15];

int myTexture(char *filename)

{

    IplImage * img = cvLoadImage(filename);

    cvCvtColor(img,img, CV_BGR2RGB);

    glEnable(GL_TEXTURE_2D);

    GLuint id;

    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;

}


void myInit()

{   quad = gluNewQuadric();

    id = myTexture("tree.png");

}





void timer(int  t)
{
    glutTimerFunc(60,timer,t+1);
    if(t==0){
        if(fin==NULL)fin=fopen("motion.txt","r");
        for(int i=0;i<15;i++){
            fscanf(fin,"%d",&newAngle[i]);
        }
    }
    if(t%10==0){
        for(int i=0;i<15;i++){
            oldAngle[i]=newAngle[i];
            fscanf(fin,"%d",&newAngle[i]);
        }
    }
    float Alpha=(t%10)/10.0;
    for(int i=0;i<15;i++)
    {
        angle[i]=Alpha*newAngle[i]+(1-Alpha)*oldAngle[i];
    }
    glutPostRedisplay();
}
void drawBody()
{
    if(model==NULL){
        model = glmReadOBJ("body.obj");
        glmUnitize(model);
        glmFacetNormals(model);
        glmVertexNormals(model, 90);
    }


    if(mode2==NULL){
        mode2 = glmReadOBJ("head.obj");
        glmUnitize(mode2);
        glmFacetNormals(mode2);
        glmVertexNormals(mode2, 90);
    }
    if(mode3==NULL){
        mode3 = glmReadOBJ("lf.obj");
        glmUnitize(mode3);
        glmFacetNormals(mode3);
        glmVertexNormals(mode3, 90);
    }
    if(mode4==NULL){
        mode4 = glmReadOBJ("lh.obj");
        glmUnitize(mode4);
        glmFacetNormals(mode4);
        glmVertexNormals(mode4, 90);
    }
    if(mode5==NULL){
        mode5 = glmReadOBJ("rf.obj");
        glmUnitize(mode5);
        glmFacetNormals(mode5);
        glmVertexNormals(mode5, 90);
    }
    if(mode6==NULL){
        mode6 = glmReadOBJ("rh.obj");
        glmUnitize(mode6);
        glmFacetNormals(mode6);
        glmVertexNormals(mode6, 90);
    }
       if(mode7==NULL){
        mode7 = glmReadOBJ("teal.obj");
        glmUnitize(mode7);
        glmFacetNormals(mode7);
        glmVertexNormals(mode7, 90);
    }

    glPushMatrix();///TODO:身體
        glTranslatef(0,0,0);
        glRotatef(angle[1],0,1,0);
        glRotatef(angle[2],1,0,0);
        glTranslatef(0,0,0);
        glScalef(1,1,1);
        glRotatef(-90, 0,1,0);

            glPushMatrix();///TODO:頭
                glTranslatef(0,0.0,0.5);
                glRotatef(angle[3],1,0,0);
                glRotatef(angle[4],0,0,1);
                glTranslatef(0,0.2,0.2);
                glScalef(1.2,1.2,1.2);
                glRotatef(0, 0,0,0);
                glmDraw(mode2, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();

            glPushMatrix();///TODO:左腳
                glTranslatef(0.2,-0.1,-0.2);
                glRotatef(angle[5],1,0,0);
                glRotatef(angle[6],0,0,1);
                glTranslatef(0,-0.5,-0.1);
                glScalef(0.5,0.5,0.5);
                glRotatef(0, 0,0,0);
                glmDraw(mode3, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();

            glPushMatrix();///TODO:左手
                glTranslatef(-0.12,-0.12,0.2);
                glRotatef(angle[7],1,0,0);
                glRotatef(angle[8],0,0,1);
                glTranslatef(0,-0.2,0);
                glScalef(0.7,0.7, 0.7);
                glRotatef(0, 0,0,0);
                glmDraw(mode4, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();


            glPushMatrix();///TODO:右腳
                glTranslatef(-0.2,-0.1,-0.2);
                glRotatef(angle[9],1,0,0);
                glRotatef(angle[10],0,0,1);
                glTranslatef(0,-0.5,-0.1);
                glScalef(0.5,0.5,0.5);
                glRotatef(0, 0,0,0);
                glmDraw(mode5, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();

            glPushMatrix();///TODO:右手
                glTranslatef(0.18,-0.13,0.2);
                glRotatef(angle[11],1,0,0);
                glRotatef(angle[12],0,0,1);
                glTranslatef(0,-0.2,0);
                glScalef(0.7, 0.7, 0.7);
                glRotatef(0, 0,1,0);
                glmDraw(mode6, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();

            glPushMatrix();///TODO:尾巴
                glTranslatef(0,0.1,-0.3);
                glRotatef(angle[13],1,0,0);
                glRotatef(angle[14],0,0,1);
                glTranslatef(0,0.2,-0.8);
                glScalef(1.2, 1.2, 1.2);
                glRotatef(0, 0,0,0);
                glmDraw(mode7, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();

        glmDraw(model, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix();

}
void mouse(int button, int state, int x, int y)
{
    oldX=x; oldY=y;
}
void saveAll()
{
    if(fout==NULL) fout=fopen("motion.txt", "w+");
    for(int i=0; i<15; i++){
         printf("%d ", angle[i]);
        fprintf(fout,"%d ", angle[i]);
    }
     printf("\n");
    fprintf(fout, "\n");
}

void motion(int x, int y)
{
    angle[angleID] += (x-oldX);
    oldX=x;
    glutPostRedisplay();///TODO2:重畫畫面
}
void readAll()
{
    if(fin==NULL) fin=fopen("motion.txt", "r");///TODO4 開檔
    for(int i=0; i<15; i++){
        fscanf(fin, "%d", &angle[i]);///TODO4 讀檔
    }
}

void keyboard(unsigned char key, int x, int y)

{///TODO2: 鍵盤,選angleID
    if(key=='0') angleID=0;
    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=='9') angleID=9;
    if(key=='a') angleID=10;
    if(key=='b') angleID=11;
    if(key=='c') angleID=12;
    if(key=='d') angleID=13;
    if(key=='e') angleID=14;
    if(key=='s') saveAll();///記住動作
    if(key=='r')
    {
        readAll();
        glutPostRedisplay();///TODO4 重畫
    }
     if(key=='p'){
        glutTimerFunc(0,timer,0);
    }

}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);
    glColor3f (1,1,1);
    glBegin(GL_POLYGON);
    glTexCoord2f(0,0);glVertex2f(-1,+1);
    glTexCoord2f(0,1);glVertex2f(-1,-1);
    glTexCoord2f(1,1);glVertex2f(+1,-1);
    glTexCoord2f(1,0);glVertex2f(+1,+1);
    glEnd();
    glDisable(GL_TEXTURE_2D);
    glPushMatrix();
      glTranslatef(0,-0.08,-0.5);
      glScalef(0.6,0.6,0.6);
    drawBody();
    glPopMatrix();
    glutSwapBuffers();
}


int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(650 ,650);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("07160245");
    glutDisplayFunc(display);
    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);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);
    myMP3.Load("music.mp3");
    myInit();
    myMP3.Play();
    glutMainLoop();
}

影片連結:https://youtu.be/n0ImtQqnugI

2020年6月29日 星期一

會跳舞的機器人

#include <GL/glut.h>
#include "glm.h"
#include<stdio.h>
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include<windows.h>///定義DWORD

#include<mmsystem.h>///playsound


#include "CMP3_MCI.h"

CMP3_MCI myMP3;
#include <stdlib.h>

static int slices = 16;
static int stacks = 16;
static void resize(int width, int height)///留下resize()
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60, ar, 0.01, 1000);///我們改了它!!!

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;///原本只有2行, 沒有運鏡
    ///需要運鏡時, 要加上第3行 gluLookAt()
}

GLMmodel* body = NULL;///指標body
GLMmodel* head= NULL;///指標head
GLMmodel* armleft = NULL;///指標armleft
GLMmodel* armright = NULL;///指標armright
GLMmodel* handleft = NULL;///指標handleft
GLMmodel* handright = NULL;///指標handright
GLMmodel* legright = NULL;///指標legright
GLMmodel* legleft= NULL;///指標legleft
GLMmodel* footright = NULL;///指標footright
GLMmodel* footleft= NULL;///指標footright
GLMmodel* background= NULL;///指標background
float anglelegr=0;
float anglelegl=0;
float anglearmr=0;
float anglearml=0;
float anglehandr=0;
float anglehandl=0;
float anglebody=0;
float anglehead=0;
float anglefoot=0;
int t=0;
int count=1;
int change=1;
int time=0;
int y=-0;
double x=0;
double z=0;

///打光0 : 宣告陣列,裡面是光的屬性值
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 };


void display()
{
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清背景

            if (body ==NULL) {
            body = glmReadOBJ("body.obj");///讀入3D模型
            glmUnitize(body);///調整單位大小
            glmFacetNormals(body);///正確法向量
            glmVertexNormals(body, 90.0);///算出頂點(先有面才有點)
            }
            if (head==NULL) {///head
            head = glmReadOBJ("head.obj");///讀入3D模型
            glmUnitize(head);///調整單位大小
            glmFacetNormals(head);///正確法向量
            glmVertexNormals(head, 90.0);///算出頂點(先有面才有點)
            }
            if (handleft==NULL) {///hand
            handleft = glmReadOBJ("hand.obj");///讀入3D模型
            glmUnitize(handleft);///調整單位大小
            glmFacetNormals(handleft);///正確法向量
            glmVertexNormals(handleft, 90.0);///算出頂點(先有面才有點)
            }
            if (handright==NULL) {///hand
            handright = glmReadOBJ("hand.obj");///讀入3D模型
            glmUnitize(handright);///調整單位大小
            glmFacetNormals(handright);///正確法向量
            glmVertexNormals(handright, 90.0);///算出頂點(先有面才有點)
            }
            if (armleft==NULL) {///arm
            armleft = glmReadOBJ("arm.obj");///讀入3D模型
            glmUnitize(armleft);///調整單位大小
            glmFacetNormals(armleft);///正確法向量
            glmVertexNormals(armleft, 90.0);///算出頂點(先有面才有點)
            }
            if (armright==NULL) {///arm
            armright = glmReadOBJ("arm.obj");///讀入3D模型
            glmUnitize(armright);///調整單位大小
            glmFacetNormals(armright);///正確法向量
            glmVertexNormals(armright, 90.0);///算出頂點(先有面才有點)
            }
            if (legright==NULL) {///leg
            legright = glmReadOBJ("leg.obj");///讀入3D模型
            glmUnitize(legright);///調整單位大小
            glmFacetNormals(legright);///正確法向量
            glmVertexNormals(legright, 90.0);///算出頂點(先有面才有點)
            }
            if (legleft==NULL) {///leg
            legleft = glmReadOBJ("leg.obj");///讀入3D模型
            glmUnitize(legleft);///調整單位大小
            glmFacetNormals(legleft);///正確法向量
            glmVertexNormals(legleft, 90.0);///算出頂點(先有面才有點)
            }
            if (footright==NULL) {///leg
            footright = glmReadOBJ("foot.obj");///讀入3D模型
            glmUnitize(footright);///調整單位大小
            glmFacetNormals(footright);///正確法向量
            glmVertexNormals(footright, 90.0);///算出頂點(先有面才有點)
            }
            if (footleft==NULL) {///leg
            if (background==NULL) {///head
            background = glmReadOBJ("back.obj");///讀入3D模型
            glmUnitize(background);///調整單位大小
            glmFacetNormals(background);///正確法向量
            glmVertexNormals(background, 90.0);///算出頂點(先有面才有點)
            }


            footleft = glmReadOBJ("foot.obj");///讀入3D模型
            glmUnitize(footleft);///調整單位大小
            glmFacetNormals(footleft);///正確法向量
            glmVertexNormals(footleft, 90.0);///算出頂點(先有面才有點)
            }
glPushMatrix();
{
    glTranslatef(0,0,0);
    glScalef(1,1,1);
    glmDraw(background, GLM_SMOOTH | GLM_MATERIAL);

    glPushMatrix();
    {
        glTranslatef(x,0,z);
        if(t==6)glRotatef(anglebody, 0,1,0);
    else
        glRotatef(-anglebody, 1,1,0);
    glScalef(0.05,0.1,0.05);
    glRotatef(270,0,1,0);///模型旋轉180度變成圖二
    glmDraw(body, GLM_SMOOTH | GLM_MATERIAL);///畫
    }
    glPushMatrix();///head
    {
    glTranslatef(0,1.4,0);//由下面往上做所以最後把旋轉的以下所有東西移到(0.5,0.5)的地方
    glRotatef(anglehead, 1,0,0);//以z軸旋轉
    glTranslatef(0,0,0);//由下面往上做所以會先移動把軸心以x軸移動0.25
    glScalef(0.8,0.8,0.8);
    glRotatef(270,0,1,0);///模型旋轉180度變成圖二
    glmDraw(head, GLM_SMOOTH | GLM_MATERIAL);///畫
    }
    glPopMatrix();



    glPushMatrix();///leftthand
    {
        glTranslatef(0.2,0.5,1);//由下面往上做所以最後把旋轉的以下所有東西移到(0.5,0.5)的地方
        if(t==1)glRotatef(anglearml, 0,0,1);
        if(t==3)glRotatef(anglearml, 0,0,1);
        if(t==6)glRotatef(anglearml, 0,1,0);
        glTranslatef(0,0,-0.4);//由下面往上做所以會先移動把軸心以x軸移動0.25
        glScalef(0.4,0.2,0.2);
        glRotatef(90,0,1,0);
        glRotatef(90,1,0,0);
        glmDraw(armleft, GLM_SMOOTH | GLM_MATERIAL);///畫
        glPushMatrix();///leftthand
        {
            glTranslatef(0.6,1.8,-0.7);//由下面往上做所以最後把旋轉的以下所有東西移到(0.5,0.5)的地方
            if(t==6)glRotatef(-anglehandl, 0,0,1);
            glTranslatef(0.6,0,0.5);//由下面往上做所以會先移動把軸心以x軸移動0.25
            glScalef(1.4,0.8,1.4);
            glRotatef(-90,1,0,0);
            glRotatef(90,0,0,1);
            glmDraw(handleft, GLM_SMOOTH | GLM_MATERIAL);///畫
        }
        glPopMatrix();
    }
    glPopMatrix();
    glPushMatrix();///righthand
    {
        glTranslatef(0.8,0.5,-0.05);//由下面往上做所以最後把旋轉的以下所有東西移到(0.5,0.5)的地方
        if(t==1)glRotatef(anglearmr, 0,0,1);;
        if(t==3)glRotatef(anglearmr, 0,1,0);
        if(t==6)glRotatef(anglearmr, 0,1,0);
        glTranslatef(0.6,0,-0.4);//由下面往上做所以會先移動把軸心以x軸移動0.25
        glScalef(0.4,0.2,0.2);
        //glRotatef(90,0,1,0);
        glRotatef(90,0,1,0);
        glRotatef(90,1,0,0);
        glmDraw(armright, GLM_SMOOTH | GLM_MATERIAL);///畫
        glPushMatrix();///righthand
        {
            glTranslatef(-0.6,1,0.4);//由下面往上做所以最後把旋轉的以下所有東西移到(0.5,0.5)的地方
            if(t==6)glRotatef(-anglehandr, 0,0,1);//以z軸旋轉
            glTranslatef(-1,0,-0.4);//由下面往上做所以會先移動把軸心以x軸移動0.25
            glScalef(1.4,0.8,1.4);
            //glRotatef(-90,1,0,0);
            glRotatef(-90,1,0,0);
            glRotatef(270,0,0,1);
            glmDraw(handright, GLM_SMOOTH | GLM_MATERIAL);///畫
        }
        glPopMatrix();
    }
    glPopMatrix();

    glPushMatrix();///leg
    {
    glTranslatef(0,-0.6,-0.2);//由下面往上做所以最後把旋轉的以下所有東西移到(0.5,0.5)的地方
    if(t==1)
    {
        glRotatef(anglelegr, 0,0,1);
    }//以z軸旋轉
    if(t==2 || t==3 )
    {
        glRotatef(anglelegr, 1,0,0);
    }//以z軸旋轉
     if(t==4||t==5)
        {
            glRotatef(anglelegr, 1,0,0);
    }//以z軸旋轉
    if(t==6)
    {
        glRotatef(anglelegr, 0,1,1);
    }//
    glTranslatef(0,-0.5,0);//由下面往上做所以會先移動把軸心以x軸移動0.25
    glScalef(0.5,1.2,0.5);
    glRotatef(90,0,1,0);///模型旋轉180度變成圖二
    glmDraw(legright, GLM_SMOOTH | GLM_MATERIAL);///畫

    glPushMatrix();///leg
    {
    glTranslatef(0.05,-0.5,-0.1);//由下面往上做所以最後把旋轉的以下所有東西移到(0.5,0.5)的地方
    glRotatef(anglefoot, 1,0,0);//以z軸旋轉
    glTranslatef(0,-0.5,0);//由下面往上做所以會先移動把軸心以x軸移動0.25
    glScalef(0.6,0.8,0.6);
    glRotatef(-90,0,1,0);///模型旋轉180度變成圖二
    glmDraw(footright, GLM_SMOOTH | GLM_MATERIAL);///畫
    }
    glPopMatrix();

    }
    glPopMatrix();
    glPushMatrix();///legright

    {
    glTranslatef(0,-0.6,0.2);//由下面往上做所以最後把旋轉的以下所有東西移到(0.5,0.5)的地方
    if(t==1)
        {
            glRotatef(anglelegl, 0,0,1);
        }//以z軸旋轉
    if(t==2 || t==3)
        {
            glRotatef(-anglelegl, 1,0,0);
    }//以z軸旋轉
    if(t==4||t==5)
        {
            glRotatef(anglelegl, 1,0,0);
    }//以z軸旋轉
    glTranslatef(0,-0.5,0);//由下面往上做所以會先移動把軸心以x軸移動0.25
    glScalef(0.5,1.2,0.5);
    glRotatef(90,0,1,0);///模型旋轉180度變成圖二
    glmDraw(legleft, GLM_SMOOTH | GLM_MATERIAL);///畫
    glPushMatrix();///legright

    {
    glTranslatef(0.05,-0.5,-0.1);//由下面往上做所以最後把旋轉的以下所有東西移到(0.5,0.5)的地方

    glTranslatef(0,-0.5,0);//由下面往上做所以會先移動把軸心以x軸移動0.25
    glScalef(0.6,0.8,0.6);
    glRotatef(-90,0,1,0);///模型旋轉180度變成圖二
    glmDraw(footleft, GLM_SMOOTH | GLM_MATERIAL);///畫
    }
    glPopMatrix();
    }
    glPopMatrix();
    glPopMatrix();
    }
    glPopMatrix();
if(time==1){ t=1;}//walk
if(time==2){ t=2;}//leg
if(time==3){ t=3;}//head
if(time==4){ t=1;}//walk
if(time==5){ t=2;}//leg
if(time==6){ t=3;}//head
if(time==7){ t=4;}//move
if(time==8){ t=6;}//rotate
if(time==9){ t=5;}//move
if(time==10){ t=6;}//rotate
if(t==1)
{
    if(count %2==1)
    {   z+=0.0008;
        if(change==1)
        {
            anglelegr++;
            anglearmr++;
            if(anglearmr==90)
            {
                anglearmr=90;
            }
            if(anglelegr==90)
            {
                change=2;
            }
        }
        if(change==2)
        {
            anglelegr--;
            anglearmr--;
            if(anglearmr==0)
            {
                anglearmr=0;
            }
            if(anglelegr==0)
            {
                change=1;
                count++;
            }
        }
    }
    if(count %2==0)
    {
        z-=0.001;
        if(change==1)
        {
            anglelegl++;
            anglearml++;
            if(anglearml==90)
            {
                anglearml=90;
            }
            if(anglelegl==90)
            {
                change=2;
            }
        }
        if(change==2)
        {
            anglelegl--;
            anglearml--;
            if(anglearml==0)
            {
                anglearmr=0;
            }
            if(anglelegl==0)
            {
                change=1;
                count++;
            }
        }
        }
        if (count==6)
        {
            time++;
            count=1;
        }
}
if(t==2)
{
    if(count %2==1)
    {
        if(change==1)
        {
            anglelegr++;
            if(anglelegr==40)
            {
                change=2;
            }
        }
        if(change==2)
        {
            anglelegr--;
            if(anglelegr==0)
            {
                change=1;
                count++;
            }
        }
    }
    if(count %2==0)
    {
        if(change==1)
        {
            anglelegl++;
            if(anglelegl==40)
            {
                change=2;
            }
        }
        if(change==2)
        {
            anglelegl--;
            if(anglelegl==0)
            {
                change=1;
                count++;
            }
        }
    }
    if (count==5)
    {
        time++;
        count=1;
    }


}
if(t==3)
{
    if(change==1)
    {
        anglebody++;
        if(anglebody==35)
        {
            change=2;
        }
    }
    if(change==2)
    {
        anglehead++;
        if(anglehead==45)
        {
            anglehead=45;
            change=3;
        }
    }
    if(change==3)
    {
        anglehead--;
        if(anglehead==0)
        {
            anglehead=0;
            change=4;
        }
    }
    if(change==4)
    {
        anglebody--;
        if(anglebody==0)
        {
        change=1;
        time++;
        }
    }
}

if(t==4)
{
    if(count %2==1)
    {x+=0.001;
        if(change==1)
        {
            anglelegr++;
            if(anglelegr==20)
            {
                change=2;
            }
        }
        if(change==2)
        {
            anglelegr--;
            if(anglelegr==0)
            {
                change=1;
                count++;
            }
        }

    }
    if(count %2==0)
    {
        if(change==1)
        {
            anglelegl--;
            if(anglelegl==-20)
            {
                change=2;
            }
        }
        if(change==2)
        {
            anglelegl++;
            if(anglelegl==0)
            {
                change=1;
                count++;
            }
        }
        x+=0.005;
    }
    if (count==4)
    {
        time++;
        count=1;
    }

}


if(t==5)
{x-=0.0001;
    if(count %2==1)
    {
        if(change==1)
        {   x-=0.01;
            anglelegr++;
            if(anglelegr==20)
            {
                change=2;
            }
        }
        if(change==2)
        {
            anglelegr--;
            if(anglelegr==0)
            {
                change=1;
                count++;
            }
        }

    }
    if(count %2==0)
    {
        if(change==1)
        {
            anglelegl--;
            if(anglelegl==-20)
            {
                change=2;
            }
        }
        if(change==2)
        {
            anglelegl++;
            if(anglelegl==0)
            {
            change=1;
            count++;
            }
        }
    }
    if (count==4)
    {
    time++;
    count=1;
    }


}
if(t==6)
{
if(change==1)
{
    anglearml--;
    anglearmr++;
    anglehandl--;
    anglehandr++;
    anglelegr++;
    anglefoot++;
    if(anglefoot==35)
    {
        anglefoot=35;
    }

    if(anglelegr==75)
    {
        anglelegr=75;
    }
    if(anglearml==-90)
    {
        change=2;
    }
}
if(change==2)
{
    anglebody++;
    if(anglebody==1080)
    {
        anglebody=0;
        change=3;
    }
}//rotate
if(change==3)
{
    anglearml++;
    anglearmr--;
    anglehandl++;
    anglehandr--;
    anglelegr--;
    anglefoot--;
    if(anglefoot==0)
    {
        anglefoot=0;
    }

    if(anglelegr==0)
    {
        anglelegr=0;
    }
    if(anglearml==0)
    {
        change=1;
        time++;
    }
}
}
if(time==11)
   time=1;
glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);
    ///打光2 : 設定light值 (拿前面的陣列來用)
    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    ///打光 2-2 : 設定物體material
    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);

glutSwapBuffers();
}

#include <math.h>
float eyeX=0, eyeY=0, eyeZ=1;///TODO
float angle=0;
static void key(unsigned char key, int x, int y)
{
    switch (key)
    {
        case 27 :
        case 'q':
            exit(0);
            break;

        case 'z':
            angle+=0.01;
            break;

        case 'x':

                angle-=0.01;
            break;
            case 't':
            myMP3.Load("bellet.mp3");
            myMP3.Play();
            time=1;
            break;
    }

    glutPostRedisplay();
}
static void idle(void)
{
    eyeX=sin(angle);
    eyeZ=cos(angle);


    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;///原本只有2行, 沒有運鏡
    gluLookAt(eyeX, eyeY, eyeZ, 0,0,0, 0,1,0); ///需要運鏡時, 要加上第3行 gluLookAt()

    glutPostRedisplay();
}
void motion(int x, int y)
{
    eyeY = (y-240)/240.0;
}
int main(int argc, char**argv) ///高手等級的main()
{
    //myMP3.Load("bellet.mp3");
    //myMP3.Play();
     glutInit(&argc,argv);///main的參數,於近來
     glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);   ///啟動3D的顯示能力,兩倍顯示buffer,有3D深度值
     glutCreateWindow("期末!!!");    ///建立3D窗子
     glutDisplayFunc(display);    ///等一下怎麼畫
      ///打光要3D的depth test
    glutIdleFunc(display);
glutKeyboardFunc(key);
     glutReshapeFunc(resize);
     glutIdleFunc(idle);
     glutMotionFunc(motion);///TODO 控制 eyeY



     glClearColor(1,1,1,1);
    glEnable(GL_DEPTH_TEST);
     glDepthFunc(GL_LESS);
    ///打光1 : 開啟光線


    glutMainLoop();    ///主要迴圈卡在這裡,不會結束
}

作業紀錄-會跳舞的機器人

#include <GL/glut.h>
#include "glm.h"
#include<stdio.h>
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include<windows.h>

#include<mmsystem.h>


#include "CMP3_MCI.h"

CMP3_MCI myMP3;
#include <stdlib.h>

GLMmodel * model=NULL;
GLMmodel * mode2=NULL;
GLMmodel * mode3=NULL;
GLMmodel * mode4=NULL;
GLMmodel * mode5=NULL;
GLMmodel * mode6=NULL;
int start=0;
///打光0 : 宣告陣列,裡面是光的屬性值
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 angle8=0,angle1=0,angle3=0,angle4=0,angle5=0,angle6=0,angle7=0;
float dx3=1,dx4=1,dx5=1,dx6=1,dx7=1,dx8=1;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    if(model==NULL)///如果沒有複製
    {
        model = glmReadOBJ("headd.obj");///讀入模型
        glmUnitize(model);///Unit單位大小-1...+1
        glmFacetNormals(model);///算面face法向量
        glmVertexNormals(model,90);///在推算出vertex法向量
    }///離開if就有模型了


if(mode2==NULL)///如果沒有複製
    {
        mode2 = glmReadOBJ("body.obj");///讀入模型
        glmUnitize(mode2);///Unit單位大小-1...+1
        glmFacetNormals(mode2);///算面face法向量
        glmVertexNormals(mode2,90);///在推算出vertex法向量
    }///離開if就有模型了

    if(mode3==NULL)///如果沒有複製
    {
        mode3 = glmReadOBJ("l.obj");///讀入模型
        glmUnitize(mode3);///Unit單位大小-1...+1
        glmFacetNormals(mode3);///算面face法向量
        glmVertexNormals(mode3,90);///在推算出vertex法向量
    }///離開if就有模型了





    if(mode4==NULL)///如果沒有複製
    {
        mode4 = glmReadOBJ("r.obj");///讀入模型
        glmUnitize(mode4);///Unit單位大小-1...+1
        glmFacetNormals(mode4);///算面face法向量
        glmVertexNormals(mode4,90);///在推算出vertex法向量
    }///離開if就有模型了



    if(mode5==NULL)///如果沒有複製
    {
        mode5 = glmReadOBJ("le.obj");///讀入模型
        glmUnitize(mode5);///Unit單位大小-1...+1
        glmFacetNormals(mode5);///算面face法向量
        glmVertexNormals(mode5,90);///在推算出vertex法向量
    }///離開if就有模型了

if(mode6==NULL)///如果沒有複製
    {
        mode6 = glmReadOBJ("ri.obj");///讀入模型
        glmUnitize(mode6);///Unit單位大小-1...+1
        glmFacetNormals(mode6);///算面face法向量
        glmVertexNormals(mode6,90);///在推算出vertex法向量
    }///離開if就有模型了
    glPushMatrix();
    glTranslatef(0,0.4,0);///把下面正在轉動的手臂移到右上角
    glRotatef(angle1,0,1,0);///對Z軸轉動,像時針一樣轉動
    glTranslatef(0,0,0);///把關節(旋轉中心)放到畫面正中心
    glScalef(0.5,0.5,0.5);
    glmDraw(model,GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix();

   glPushMatrix();
    glTranslatef(0,0.05,0);///把下面正在轉動的手臂移到右上角
    glRotatef(180,0,1,0);///對Z軸轉動,像時針一樣轉動
    glTranslatef(0,0,0);///把關節(旋轉中心)放到畫面正中心
    glScalef(0.2,0.2,0.2);
    glmDraw(mode2,GLM_SMOOTH | GLM_MATERIAL);
      glPopMatrix();

       glPushMatrix();
    glTranslatef(0.15,0.25,0);///把下面正在轉動的手臂移到右上角
    glRotatef(angle3,1,0,1);///對Z軸轉動,像時針一樣轉動
    glTranslatef(0.01,0,0);///把關節(旋轉中心)放到畫面正中心
    glScalef(0.3,0.3,0.3);
    glmDraw(mode3,GLM_SMOOTH | GLM_MATERIAL);
      glPopMatrix();

      glPushMatrix();
    glTranslatef(-0.29,0.15,0);///把下面正在轉動的手臂移到右上角
    glRotatef(angle4,0,0,1);///對Z軸轉動,像時針一樣轉動
    glTranslatef(0.1,0,0);///把關節(旋轉中心)放到畫面正中心
    glScalef(0.35,0.35,0.35);
    glmDraw(mode4,GLM_SMOOTH | GLM_MATERIAL);
      glPopMatrix();

       glPushMatrix();
    glTranslatef(0.1,-0.15,0);///把下面正在轉動的手臂移到右上角
    glRotatef(angle5,0,0,1);///對Z軸轉動,像時針一樣轉動
    glTranslatef(0.1,0,0);///把關節(旋轉中心)放到畫面正中心
    glScalef(0.2,0.2,0.2);
    glmDraw(mode5,GLM_SMOOTH | GLM_MATERIAL);
      glPopMatrix();

      glPushMatrix();
    glTranslatef(-0.09,-0.1,0);///把下面正在轉動的手臂移到右上角
    glRotatef(angle6,0,0,1);///對Z軸轉動,像時針一樣轉動
    glTranslatef(-0.1,0,0);///把關節(旋轉中心)放到畫面正中心
    glScalef(0.15,0.15,0.15);
    glmDraw(mode6,GLM_SMOOTH | GLM_MATERIAL);
      glPopMatrix();
    glutSwapBuffers();
if(start==1)
{

angle1++;
angle3+=dx3*0.3;
    if(angle3>60) dx3=-1;
    if(angle3<0) dx3=+1;

    angle4+=dx4*0.3;
    if(angle4>30) dx4=-1;
    if(angle4<0) dx4=+1;


    angle5+=dx5*0.3;
    if(angle5>30) dx5=-1;
    if(angle5<0) dx5=+1;

    angle6+=dx6*0.3;
    if(angle6>30) dx6=-1;
    if(angle6<0) dx6=+1;
}

}
#include <math.h>
float eyeX=0, eyeY=0, eyeZ=1;///TODO
float angle=0;
static void key(unsigned char key, int x, int y)
{
    switch (key)
    {
        case 27 :
        case 'z':
            angle+=0.03;
            break;

        case 'x':

                angle-=0.03;
            break;
            case 'o':
             start=1;
             myMP3.Load("three.mp3");///讀入檔案
             myMP3.Play();///播放
            break;
    }

    glutPostRedisplay();
}
static void idle(void)
{
    eyeX=sin(angle);
    eyeZ=cos(angle);


    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;///原本只有2行, 沒有運鏡
    gluLookAt(eyeX, eyeY, eyeZ, 0,0,0, 0,1,0); ///需要運鏡時, 要加上第3行 gluLookAt()

    glutPostRedisplay();
}
void motion(int x, int y)
{
    eyeY = (y-240)/240.0;
}

int main(int argc, char**argv)
{
    glutInit(&argc,argv);
     glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week11自己寫的喔~!!");

    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutKeyboardFunc(key);
    glutIdleFunc(idle);
    glutMotionFunc(motion);///TODO 控制 eyeY
    glClearColor(1,1,1,1);


    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    ///打光1:要開啟光線
    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);
    ///打光2:要設定光的設定值
    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);
    ///打光2.2:要把物體也設定好它的matreial
    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_POSITION, high_shininess);

    glutMainLoop();
}

week15

茶壺位置儲存
#include <GL/glut.h>
///int angle[10]={0,0,0,0,0, 0,0,0,0,0};///如果關節要變多
int angle[20]={};///全部先放0 ///Week1603
///可以讓移動也加進去 x,y
void display()
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glPushMatrix();
        glTranslatef( angle[11]/100.0, angle[12]/100.0, angle[13]/100.0 );
        ///Week1603 原來的int會變float -1.0 ... +1.0

        glColor3f(1,1,1);///白色
  glutSolidTeapot(0.3);///body

  glPushMatrix();///右邊
            glTranslatef(0.3, 0,0);
            glRotatef(angle[0], 0,0,1);///轉動
            glTranslatef(0.2, 0,0);///最重要,旋轉中心要放在中心

            glColor3f(1,0,0);///紅色
            glutSolidTeapot(0.2);///右上手臂
            glPushMatrix();///右下手臂
                glTranslatef(0.2, 0,0);
                glRotatef(angle[1], 0,0,1);
                glTranslatef(0.2, 0,0);

                glColor3f(1,1,0);///黃
                glutSolidTeapot(0.2);
            glPopMatrix();
  glPopMatrix();

  glPushMatrix();///左邊
            glTranslatef(-0.3, 0,0);
            glRotatef(angle[2], 0,0,1);///轉動
            glTranslatef(-0.2, 0,0);///最重要,旋轉中心要放在中心

            glColor3f(0,1,0);///綠色
            glutSolidTeapot(0.2);///左上手臂
            glPushMatrix();
                glTranslatef(-0.2, 0,0);
                glRotatef(angle[3], 0,0,1);
                glTranslatef(-0.2, 0,0);

                glColor3f(0,0,1);///藍色
                glutSolidTeapot(0.2);///左下手臂
            glPopMatrix();
  glPopMatrix();

 glPopMatrix();
 glutSwapBuffers();
}
int angleID=0;///TODO2:要動哪個關節
int oldX=0, oldY=0;///TODO2:
#include <stdio.h>///TODO3: //TODO4:記得要移高一點哦!
FILE * fout=NULL;///TODO3: 檔案是NULL
FILE * fin=NULL;///TODO4: File Input (fin)
void readAll()///TODO5: 把程式碼拉出來, 變成函式 readAll();
{
    if(fin==NULL) fin=fopen("motion.txt", "r" );///TODO4: 開檔案
    for(int i=0; i<20; i++){ ///Week1603
        ///scanf(  "%d", &a[i]);
        fscanf(fin,"%d", &angle[i]);///TODO4: 讀入
    }
}
int oldAngle[20];///新的會變成舊的 ///Week162
int newAngle[20];///先讀到新的 ///Week162
void timer(int t)///TODO5: 用timer自動readAll()再更新
{
    glutTimerFunc(20, timer, t+1);///TODO5: 再註冊下一個時間點 20ms 之後
    if(t==0){///第1次進入,先讀新的
        if(fin==NULL) fin=fopen("motion.txt", "r");///Week162
        for(int i=0; i<20; i++){///Week162 ///Week1603
            fscanf(fin, "%d", &newAngle[i]);///Week162
        }
    }
    float alpha = (t%30)/30.0; ///Week162 讓 alpha介於0.0-1.0中間
    if( t%30==0 ){///每次進入橙色區域,就再做一次調整
        for(int i=0; i<20; i++){///Week162 ///Week1603
            oldAngle[i] = newAngle[i];///Week162
            fscanf(fin, "%d", &newAngle[i]);///Week162
        }
    }
    for(int i=0; i<20; i++){///Week162 ///Week1603
        angle[i] = alpha*newAngle[i] + (1-alpha)*oldAngle[i];///Week162 真的內插
        ///printf(" %d", angle[i]);
    }
    ///readAll();
    glutPostRedisplay();
}
void keyboard(unsigned char key, int x, int y)
{
    if(key=='0') angleID=0;///TODO2: 要動的關節
    if(key=='1') angleID=1;///TODO2: 要動的關節
    if(key=='2') angleID=2;///TODO2: 要動的關節
    if(key=='3') angleID=3;///TODO2: 要動的關節
    if(key=='a') angleID=11;///Week1603
    if(key=='r'){///TODO4: 我們要讀檔案囉!!!!
        readAll();///TODO5:
        glutPostRedisplay();///TODO4: 更新畫面/重畫
    }else if(key=='p'){///TODO5: Play播放
        glutTimerFunc(20, timer, 0);///TODO5: 要用timer來自動播放
    }else if(key=='s'){///Week161
        void saveAll();///Week161 函式的宣告,就認識下面這行
        saveAll();///Week161
    }
}
void mouse(int button, int state, int x, int y)
{
    oldX=x; oldY=y;///TODO2: mouse按下去時, 記得在哪裡
}
void saveAll()///TODO3:全部存起來
{///TODO3: (第1次是NULL,要把檔案開起來, 以後就不用再開它了...)
    if(fout==NULL) fout=fopen("motion.txt", "w+");///TODO3: 檔案是NULL
    for(int i=0; i<20; i++){ ///Week1603
        printf("%d ", angle[i]);
        fprintf(fout, "%d ", angle[i]);
    }
    printf("\n");
    fprintf(fout, "\n");
}
void motion(int x, int y)
{
    angle[angleID] += (x-oldX);///TODO2: 讓關節動起來
    if(angleID==11){ ///Week1603
        angle[angleID+1] += (oldY-y); ///Week1603
    }
    oldX=x; oldY=y; ///Week1603
    ///Week161 ///saveAll();///TODO3:全部存起來
    glutPostRedisplay();
}
int main(int argc, char**argv)
{
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
 glutCreateWindow("week14 file");

 glutDisplayFunc(display);
 glutKeyboardFunc(keyboard);///TODO2: keyboard運作
 glutMouseFunc(mouse);///TODO2: mouse
 glutMotionFunc(motion);///TODO2: motion

 glutMainLoop();
}

week10電腦圖學

今天教的是計時器,因為有些電腦的設定不同為了統一程式的開始,我們需要做一個計時器。
void timer(int t)
{
    glutTimerFunc(33,timer,t+1);
    glutPostRedisplay();
}
這是小葉老師寫出來幫助我們認識TRT旋轉的程式