2023年5月31日 星期三

DTang---week16__總複習

 week16_總複習--完成機器人

複習以往所教

⬗以下取自小葉老師的GITHUB

            皆為做重點標記用

第一個複習:實作圖型,繪製茶壺與任意(有頂點的)圖型

#include <GL/glut.h>

void display()

{

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glColor3f(0,1,0);   ///加顏色

    glBegin(GL_POLYGON); ///畫圖型

        glVertex2f(0.5, 0.5);   ///四個頂點--此為四方形

        glVertex2f(-0.5, 0.5);

        glVertex2f(-0.5, -0.5);

        glVertex2f(0.5, -0.5);

    glEnd();

    glColor3f(1,1,0);

    glutSolidTeapot( 0.3 );     ///畫茶壺

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week16");

    glutDisplayFunc(display);

    glutMainLoop();

}


第二個複習:加入動作指令,使圖型可以拖移

#include <GL/glut.h>

float teapotX=0, teapotY=0;

void motion(int x, int y) {   ///動作指令

    teapotX = (x-150) / 150.0;

    teapotY = (150-y) / 150.0;

    glutPostRedisplay();

}

void display() {

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glTranslatef(teapotX, teapotY, 0);   ///呼叫動作指令

        glutSolidTeapot( 0.3 );

    glPopMatrix();

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week16");

    glutDisplayFunc(display);

    glutMotionFunc(motion);

    glutMainLoop();

}


第三個複習:加入滑鼠指令,使圖型可以轉動

#include <GL/glut.h>

float teapotX=0, teapotY=0, angle=0, oldX=0, oldY=0;

void mouse(int button, int state, int x, int y) {  ///用滑鼠拖曳

    oldX = x;

    oldY = y;

}

void motion(int x, int y) {

    angle += x - oldX; ///teapotX = (x-150) / 150.0;

    oldX = x;          ///teapotY = (150-y) / 150.0;

    glutPostRedisplay();

}

void display() {

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glRotatef(angle, 0, 0, 1);   ///轉動目標物(指茶壺)

        ///glTranslatef(teapotX, teapotY, 0);

        glutSolidTeapot( 0.3 );

    glPopMatrix();

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week16");

    glutDisplayFunc(display);

    glutMotionFunc(motion);

    glutMouseFunc(mouse);

    glutMainLoop();

}


第四個複習:給定一個中心點,方便下一步找到圖型要做的轉動位置

#include <GL/glut.h>

#include <stdio.h>

float teapotX=0, teapotY=0, angle=0, oldX=0, oldY=0;

void mouse(int button, int state, int x, int y) {

    oldX = x;

    oldY = y;

}

void motion(int x, int y) {

    teapotX = (x-150) / 150.0;///angle += x - oldX; ///

    teapotY = (150-y) / 150.0;///oldX = x;          ///

    printf("glTranslatef(%.3f , %.3f , 0 );\n", teapotX, teapotY);

    glutPostRedisplay();

}

void display() {

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glColor3f(1,1,1);

        ///glTranslatef(....);

        ///glRotatef(angle, 0, 0, 1);

        ///glTranslatef(....);

        glTranslatef(teapotX, teapotY, 0);

        glutSolidTeapot( 0.3 );

    glPopMatrix();

    glColor3f(0,1,0);

    glutSolidTeapot( 0.01 );

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week16");

    glutDisplayFunc(display);

    glutMotionFunc(motion);

    glutMouseFunc(mouse);

    glutMainLoop();

}


第五個複習:加入滑鼠指令,使圖型可以轉動後,調回原位

#include <GL/glut.h>

#include <stdio.h>

float teapotX=0, teapotY=0, angle=0, oldX=0, oldY=0;

void mouse(int button, int state, int x, int y) {

    oldX = x;

    oldY = y;

}

void motion(int x, int y) {

    teapotX = (x-150) / 150.0;

    teapotY = (150-y) / 150.0;

    angle += x - oldX;

    oldX = x;

    printf("glTranslatef(%.3f , %.3f , 0 );\n", teapotX, teapotY);

    glutPostRedisplay();

}

void display() {

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glColor3f(1,1,1);

        glTranslatef(-0.420 , +0.047 , 0 );///glTranslatef(....);

        glRotatef(angle, 0, 0, 1);

        glTranslatef(0.420 , -0.047 , 0 );///glTranslatef(....);

        ///glTranslatef(teapotX, teapotY, 0);

        glutSolidTeapot( 0.3 );

    glPopMatrix();

    glColor3f(0,1,0);

    glutSolidTeapot( 0.01 );

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week16");

    glutDisplayFunc(display);

    glutMotionFunc(motion);

    glutMouseFunc(mouse);

    glutMainLoop();

}


第六個複習加入模型--以期末專案的模型為範例

有需要做的動作!

1. 進入專案的properties改店工作執行目錄

2. 把freeglut.dll檔拉到專案裡

3. 將glm.cpp及glm.h複製到專案裏頭


#include <GL/glut.h>

#include <stdio.h>

#include "glm.h"

GLMmodel * keroro = NULL;

float teapotX=0, teapotY=0, angle=0, oldX=0, oldY=0;

void mouse(int button, int state, int x, int y) {

    oldX = x;

    oldY = y;

}

void motion(int x, int y) {

    teapotX = (x-150) / 150.0;

    teapotY = (150-y) / 150.0;

    angle += x - oldX;

    oldX = x;

    printf("glTranslatef(%.3f , %.3f , 0 );\n", teapotX, teapotY);

    glutPostRedisplay();

}

void display() {

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glColor3f(1,1,0);

        glScalef(0.02,0.02,0.02);

        glmDraw(keroro, GLM_MATERIAL);

    glPopMatrix();

    glColor3f(0,1,0);

    glutSolidTeapot( 0.01 );

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week16");

    glutDisplayFunc(display);

    glutMotionFunc(motion);

    glutMouseFunc(mouse);

    Meowth = glmReadOBJ("model/whole.obj");

    glutMainLoop();

}

第七個複習:加入模型的皮膚(貼圖)

有需要做的動作!

1. 下載OpenCV並安裝,選擇add openCV to system PATH 的選項

2. 安裝完成重新開啟Code:Blocks

3. 開啟Code:Blocks後==>點擊"Setting",選擇Compiler ==> 進入"Search dirctories"

==> 1. Compiler : C:\OpenCV2.1\include      ((圖1
        2. Linker:C:\OpenCV2.1\lib                    ((圖2
        3. 在Linker setting裡,加入三個關鍵字(library)
            --> cv210、cxcore210、highgui210     ((圖3

#include <stdio.h>

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可

#include <opencv/cv.h>

#include <GL/glut.h>

#include "glm.h"

GLMmodel * gundam = NULL;

int myTexture(char * filename)

{

    IplImage * img = cvLoadImage(filename); ///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);

    return id;

}

float teapotX=0, teapotY=0, angle=0, oldX=0, oldY=0;

void mouse(int button, int state, int x, int y) {

    oldX = x;

    oldY = y;

}

void motion(int x, int y) {

    teapotX = (x-150) / 150.0;

    teapotY = (150-y) / 150.0;

    angle += x - oldX;

    oldX = x;

    printf("glTranslatef(%.3f , %.3f , 0 );\n", teapotX, teapotY);

    glutPostRedisplay();

}

void display() {

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glColor3f(1,1,1);///glColor3f(1,0,0);

        glScalef(0.03, 0.03, 0.03);

        glRotatef(angle, 0, 1, 0);

        glmDraw(gundam, GLM_MATERIAL | GLM_TEXTURE);

    glPopMatrix();

    glColor3f(0,1,0);

    glutSolidTeapot( 0.01 );

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week16");

    glutDisplayFunc(display);

    glutMotionFunc(motion);

    glutMouseFunc(mouse);

    gundam = glmReadOBJ("model/gundam.obj");

    myTexture("model/Diffuse.jpg");

    glEnable(GL_DEPTH_TEST);

    glutMainLoop();

}


第八個複習:控制單個部位--有誤


第九個複習:控制單個部位-讓頭部轉動

#include <stdio.h>

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可

#include <opencv/cv.h>

#include <GL/glut.h>

#include "glm.h"

GLMmodel * head = NULL;

GLMmodel * body = NULL; ///GLMmodel * gundam = NULL;

int myTexture(char * filename)

{.............}

float teapotX=0, teapotY=0, angle=0, angle2=0, oldX=0, oldY=0;  ///有不同

void mouse(int button, int state, int x, int y) {

    oldX = x;

    oldY = y;

}

void motion(int x, int y) {

    teapotX += (x - oldX)/10.0; ///有不同

    teapotY += (oldY - y)/10.0; ///有不同

    angle += x - oldX;

    angle2 += y - oldY; ///有不同

    oldX = x;

    oldY = y; ///有不同

    printf("glTranslatef(%.3f , %.3f , 0 );\n", teapotX, teapotY);

    glutPostRedisplay();

}

void display() {

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glColor3f(1,1,1);///glColor3f(1,0,0);

        glScalef(0.03, 0.03, 0.03);

        ///glRotatef(angle, 0, 1, 0);

        glmDraw(body, GLM_MATERIAL | GLM_TEXTURE); ///glmDraw(gundam, GLM_MATERIAL | GLM_TEXTURE);

        glPushMatrix();

            glTranslatef(0.000 , +22.300 , 0 );

            glRotatef(angle, 0, 1, 0);

            glRotatef(angle2, 1, 0, 0);

            glTranslatef(0.000 , -22.300 , 0 );

            ///glTranslatef(teapotX, teapotY, 0);

            glmDraw(head, GLM_MATERIAL | GLM_TEXTURE);

        glPopMatrix();

    glPopMatrix();

    glColor3f(0,1,0);

    glutSolidTeapot( 0.01 );

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week16");


    glutDisplayFunc(display);

    glutMotionFunc(motion);

    glutMouseFunc(mouse);


    head = glmReadOBJ("model/head.obj");

    body = glmReadOBJ("model/body.obj"); ///gundam = glmReadOBJ("model/gundam.obj");

    myTexture("model/Diffuse.jpg");

    glEnable(GL_DEPTH_TEST);


    glutMainLoop();

}


第十個複習:加入手臂1

#include <stdio.h>

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可

#include <opencv/cv.h>

#include <GL/glut.h>

#include "glm.h"

GLMmodel * head = NULL;

GLMmodel * body = NULL; ///GLMmodel * gundam = NULL;

GLMmodel * arm1 = NULL, * arm2 = NULL;

int myTexture(char * filename)

{

    ......

}

float teapotX=0, teapotY=0, angle=0, angle2=0, oldX=0, oldY=0;  ///有不同

void mouse(int button, int state, int x, int y) {

    oldX = x;

    oldY = y;

}

void motion(int x, int y) {

    teapotX += (x - oldX)/10.0; ///有不同

    teapotY += (oldY - y)/10.0; ///有不同

    angle += x - oldX;

    angle2 += y - oldY; ///有不同

    oldX = x;

    oldY = y; ///有不同

    printf("glTranslatef(%.3f , %.3f , 0 );\n", teapotX, teapotY);

    glutPostRedisplay();

}

void display() {

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glScalef(2,2,2);

        glTranslatef(0, -0.4, 0);

        glPushMatrix();

            glColor3f(1,1,1);///glColor3f(1,0,0);

            glScalef(0.03, 0.03, 0.03);

            ///glRotatef(angle, 0, 1, 0);

            glmDraw(body, GLM_MATERIAL | GLM_TEXTURE); ///glmDraw(gundam, GLM_MATERIAL | GLM_TEXTURE);

            glPushMatrix();

                glTranslatef(0.000 , +22.300 , 0 );

                //glRotatef(angle, 0, 1, 0);

                //glRotatef(angle2, 1, 0, 0);

                glTranslatef(0.000 , -22.300 , 0 );

                ///glTranslatef(teapotX, teapotY, 0);

                glmDraw(head, GLM_MATERIAL | GLM_TEXTURE);

            glPopMatrix();

            glPushMatrix();

                glTranslatef(teapotX, teapotY, 0);

                glmDraw(arm1, GLM_MATERIAL | GLM_TEXTURE);

            glPopMatrix();

        glPopMatrix();

        glColor3f(0,1,0);///中心點的位置

        glutSolidTeapot( 0.01 );///中心點的位置

    glPopMatrix();

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week16");

    glutDisplayFunc(display);

    glutMotionFunc(motion);

    glutMouseFunc(mouse);

    head = glmReadOBJ("model/head.obj");

    body = glmReadOBJ("model/body.obj"); ///gundam = glmReadOBJ("model/gundam.obj");

    arm1 = glmReadOBJ("model/arm1.obj");

    arm2 = glmReadOBJ("model/arm1.obj");

    myTexture("model/Diffuse.jpg");

    glEnable(GL_DEPTH_TEST);

    glutMainLoop();

}


第十一個複習:加入手臂1,並能成功轉動

#include <stdio.h>

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可

#include <opencv/cv.h>

#include <GL/glut.h>

#include "glm.h"

GLMmodel * head = NULL;

GLMmodel * body = NULL; ///GLMmodel * gundam = NULL;

GLMmodel * arm1 = NULL, * arm2 = NULL;

int myTexture(char * filename)

{

    .......

}

float teapotX=0, teapotY=0, angle=0, angle2=0, oldX=0, oldY=0;  ///有不同

void mouse(int button, int state, int x, int y) {

    oldX = x;

    oldY = y;

}

void motion(int x, int y) {

    teapotX += (x - oldX)/10.0; ///有不同

    teapotY += (oldY - y)/10.0; ///有不同

    angle += x - oldX;

    angle2 += y - oldY; ///有不同

    oldX = x;

    oldY = y; ///有不同

    printf("glTranslatef(%.3f , %.3f , 0 );\n", teapotX, teapotY);

    glutPostRedisplay();

}

void display() {

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glScalef(2,2,2);

        glTranslatef(0, -0.4, 0);

        glPushMatrix();

            glColor3f(1,1,1);///glColor3f(1,0,0);

            glScalef(0.03, 0.03, 0.03);

            ///glRotatef(angle, 0, 1, 0);

            glmDraw(body, GLM_MATERIAL | GLM_TEXTURE); ///glmDraw(gundam, GLM_MATERIAL | GLM_TEXTURE);

            glPushMatrix();

                glTranslatef(0.000 , +22.300 , 0 );

                //glRotatef(angle, 0, 1, 0);

                //glRotatef(angle2, 1, 0, 0);

                glTranslatef(0.000 , -22.300 , 0 );

                ///glTranslatef(teapotX, teapotY, 0);

                glmDraw(head, GLM_MATERIAL | GLM_TEXTURE);

            glPopMatrix();

            glPushMatrix();

                glTranslatef(-3.800 , +21.200 , 0 );

                glRotatef(angle, 0, 1, 0);

                glRotatef(angle2, 1, 0, 0);

                glTranslatef(3.800 , -21.200 , 0 );

                ///glTranslatef(teapotX, teapotY, 0);

                glmDraw(arm1, GLM_MATERIAL | GLM_TEXTURE);

            glPopMatrix();

        glPopMatrix();

        glColor3f(0,1,0);///中心點的位置

        glutSolidTeapot( 0.01 );///中心點的位置

    glPopMatrix();

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week16");

    glutDisplayFunc(display);

    glutMotionFunc(motion);

    glutMouseFunc(mouse);

    head = glmReadOBJ("model/head.obj");

    body = glmReadOBJ("model/body.obj"); ///gundam = glmReadOBJ("model/gundam.obj");

    arm1 = glmReadOBJ("model/arm1.obj");

    arm2 = glmReadOBJ("model/arm1.obj");

    myTexture("model/Diffuse.jpg");

    glEnable(GL_DEPTH_TEST);

    glutMainLoop();

}

第十二個複習:加入全部(兩邊)手掌與手腕(下手臂)

#include <stdio.h>

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可

#include <opencv/cv.h>

#include <GL/glut.h>

#include "glm.h"

GLMmodel * head = NULL;

GLMmodel * body = NULL; ///GLMmodel * gundam = NULL;

GLMmodel * arm1 = NULL, * arm2 = NULL;

GLMmodel * hand1 = NULL, * hand2 = NULL;

int myTexture(char * filename)

{

    ......

}

float teapotX=0, teapotY=0, angle=0, angle2=0, oldX=0, oldY=0;  ///有不同

void mouse(int button, int state, int x, int y) {

    oldX = x;

    oldY = y;

}

void motion(int x, int y) {

    teapotX += (x - oldX)/10.0; ///有不同

    teapotY += (oldY - y)/10.0; ///有不同

    angle += x - oldX;

    angle2 += y - oldY; ///有不同

    oldX = x;

    oldY = y; ///有不同

    printf("glTranslatef(%.3f , %.3f , 0 );\n", teapotX, teapotY);

    glutPostRedisplay();

}

void display() {

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glScalef(2,2,2);

        glTranslatef(0, -0.4, 0);

        glPushMatrix();

            glColor3f(1,1,1);///glColor3f(1,0,0);

            glScalef(0.03, 0.03, 0.03);

            ///glRotatef(angle, 0, 1, 0);

            glmDraw(body, GLM_MATERIAL | GLM_TEXTURE); ///glmDraw(gundam, GLM_MATERIAL | GLM_TEXTURE);

            glPushMatrix();

                glTranslatef(0.000 , +22.300 , 0 );

                //glRotatef(angle, 0, 1, 0);

                //glRotatef(angle2, 1, 0, 0);

                glTranslatef(0.000 , -22.300 , 0 );

                ///glTranslatef(teapotX, teapotY, 0);

                glmDraw(head, GLM_MATERIAL | GLM_TEXTURE);

            glPopMatrix();

            glPushMatrix();

                glTranslatef(-3.800 , +21.200 , 0 );

                //glRotatef(angle, 0, 1, 0);

                //glRotatef(angle2, 1, 0, 0);

                glTranslatef(3.800 , -21.200 , 0 );

                ///glTranslatef(teapotX, teapotY, 0);

                glmDraw(arm1, GLM_MATERIAL | GLM_TEXTURE);

                glPushMatrix();

                    glTranslatef(-4.300 , +18.600 , 0 );

                    glRotatef(angle, 0, 1, 0);

                    glRotatef(angle2, 1, 0, 0);

                    glTranslatef(4.300 , -18.600 , 0 );

                    glmDraw(hand1, GLM_MATERIAL | GLM_TEXTURE);

                glPopMatrix();

            glPopMatrix();

            glPushMatrix();

                glTranslatef(+3.800 , +21.200 , 0 );

                //glRotatef(angle, 0, 1, 0);

                //glRotatef(angle2, 1, 0, 0);

                glTranslatef(-3.800 , -21.200 , 0 );

                ///glTranslatef(teapotX, teapotY, 0);

                glmDraw(arm2, GLM_MATERIAL | GLM_TEXTURE);

                glPushMatrix();

                    glTranslatef(+4.300 , +18.600 , 0 );

                    glRotatef(angle, 0, 1, 0);

                    glRotatef(angle2, 1, 0, 0);

                    glTranslatef(-4.300 , -18.600 , 0 );

                    glmDraw(hand2, GLM_MATERIAL | GLM_TEXTURE);

                glPopMatrix();

            glPopMatrix();

        glPopMatrix();

        glColor3f(0,1,0);///中心點的位置

        glutSolidTeapot( 0.01 );///中心點的位置

    glPopMatrix();

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week16");

    glutDisplayFunc(display);

    glutMotionFunc(motion);

    glutMouseFunc(mouse);

    head = glmReadOBJ("model/head.obj");

    body = glmReadOBJ("model/body.obj"); ///gundam = glmReadOBJ("model/gundam.obj");

    arm1 = glmReadOBJ("model/arm1.obj");

    arm2 = glmReadOBJ("model/arm2.obj");

    hand1 = glmReadOBJ("model/hand1.obj");

    hand2 = glmReadOBJ("model/hand2.obj");

    myTexture("model/Diffuse.jpg");

    glEnable(GL_DEPTH_TEST);

    glutMainLoop();

}


第十三個複習:加入下半身

#include <stdio.h>

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可

#include <opencv/cv.h>

#include <GL/glut.h>

#include "glm.h"

GLMmodel * head = NULL;

GLMmodel * body = NULL; ///GLMmodel * gundam = NULL;

GLMmodel * arm1 = NULL, * arm2 = NULL;

GLMmodel * hand1 = NULL, * hand2 = NULL;

GLMmodel * bot = NULL;

GLMmodel * leg1 = NULL, * leg2 = NULL;

GLMmodel * knee1 = NULL, * knee2 = NULL;

GLMmodel * foot1 = NULL, * foot2 = NULL;

int myTexture(char * filename)

{

    ......

}


float teapotX=0, teapotY=0, angle=0, angle2=0, oldX=0, oldY=0;  ///有不同

void mouse(int button, int state, int x, int y) {

    oldX = x;

    oldY = y;

}


void motion(int x, int y) {

    teapotX += (x - oldX)/10.0; ///有不同

    teapotY += (oldY - y)/10.0; ///有不同

    angle += x - oldX;

    angle2 += y - oldY; ///有不同

    oldX = x;

    oldY = y; ///有不同

    printf("glTranslatef(%.3f , %.3f , 0 );\n", teapotX, teapotY);

    glutPostRedisplay();

}

void display() {

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glScalef(2,2,2);

        glTranslatef(0, -0.4, 0);

        glPushMatrix();

            glColor3f(1,1,1);///glColor3f(1,0,0);

            glScalef(0.03, 0.03, 0.03);

            ///glRotatef(angle, 0, 1, 0);

            glmDraw(body, GLM_MATERIAL | GLM_TEXTURE); ///glmDraw(gundam, GLM_MATERIAL | GLM_TEXTURE);


            glPushMatrix();

                glTranslatef(0.000 , +22.300 , 0 );

                //glRotatef(angle, 0, 1, 0);

                //glRotatef(angle2, 1, 0, 0);

                glTranslatef(0.000 , -22.300 , 0 );

                ///glTranslatef(teapotX, teapotY, 0);

                glmDraw(head, GLM_MATERIAL | GLM_TEXTURE);

            glPopMatrix();


            glPushMatrix();

                glTranslatef(-3.800 , +21.200 , 0 );

                //glRotatef(angle, 0, 1, 0);

                //glRotatef(angle2, 1, 0, 0);

                glTranslatef(3.800 , -21.200 , 0 );

                ///glTranslatef(teapotX, teapotY, 0);

                glmDraw(arm1, GLM_MATERIAL | GLM_TEXTURE);

                glPushMatrix();

                    glTranslatef(-4.300 , +18.600 , 0 );

                    //glRotatef(angle, 0, 1, 0);

                    //glRotatef(angle2, 1, 0, 0);

                    glTranslatef(4.300 , -18.600 , 0 );

                    glmDraw(hand1, GLM_MATERIAL | GLM_TEXTURE);

                glPopMatrix();

            glPopMatrix();


            glPushMatrix();

                glTranslatef(+3.800 , +21.200 , 0 );

                //glRotatef(angle, 0, 1, 0);

                //glRotatef(angle2, 1, 0, 0);

                glTranslatef(-3.800 , -21.200 , 0 );

                ///glTranslatef(teapotX, teapotY, 0);

                glmDraw(arm2, GLM_MATERIAL | GLM_TEXTURE);

                glPushMatrix();

                    glTranslatef(+4.300 , +18.600 , 0 );

                    //glRotatef(angle, 0, 1, 0);

                    //glRotatef(angle2, 1, 0, 0);

                    glTranslatef(-4.300 , -18.600 , 0 );

                    glmDraw(hand2, GLM_MATERIAL | GLM_TEXTURE);

                glPopMatrix();

            glPopMatrix();


            glmDraw(bot, GLM_MATERIAL | GLM_TEXTURE);

            

            glPushMatrix();///左大腿

                glTranslatef(-2.000 , +14.100 , 0 );

                //glRotatef(angle, 0, 1, 0);

                //glRotatef(angle2, 1, 0, 0);

                glTranslatef(2.000 , -14.100 , 0 );

                glmDraw(leg1, GLM_MATERIAL | GLM_TEXTURE);


                glPushMatrix();

                    glTranslatef(-2.000 , +10.500 , 0 );

                    //glRotatef(angle, 0, 1, 0);

                    //glRotatef(angle2, 1, 0, 0);

                    glTranslatef(2.000 , -10.500 , 0 );

                    glmDraw(knee1, GLM_MATERIAL | GLM_TEXTURE);


                    glPushMatrix();

                        glTranslatef(-2.000 , +3.000 , 0 );

                        glRotatef(angle, 0, 1, 0);

                        glRotatef(angle2, 1, 0, 0);

                        glTranslatef(2.000 , -3.000 , 0 );

                        glmDraw(foot1, GLM_MATERIAL | GLM_TEXTURE);

                    glPopMatrix();

                glPopMatrix();

            glPopMatrix();


        glPopMatrix();

        glColor3f(0,1,0);///中心點的位置

        glutSolidTeapot( 0.01 );///中心點的位置

    glPopMatrix();


    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week16");


    glutDisplayFunc(display);

    glutMotionFunc(motion);

    glutMouseFunc(mouse);


    head = glmReadOBJ("model/head.obj");

    body = glmReadOBJ("model/body.obj"); ///gundam = glmReadOBJ("model/gundam.obj");

    arm1 = glmReadOBJ("model/arm1.obj");

    arm2 = glmReadOBJ("model/arm2.obj");

    hand1 = glmReadOBJ("model/hand1.obj");

    hand2 = glmReadOBJ("model/hand2.obj");

    bot = glmReadOBJ("model/bot.obj");

    leg1 = glmReadOBJ("model/leg1.obj");

    leg2 = glmReadOBJ("model/leg2.obj");

    knee1 = glmReadOBJ("model/knee1.obj");

    knee2 = glmReadOBJ("model/knee2.obj");

    foot1 = glmReadOBJ("model/foot1.obj");

    foot2 = glmReadOBJ("model/foot2.obj");

    myTexture("model/Diffuse.jpg");

    glEnable(GL_DEPTH_TEST);


    glutMainLoop();

}


第十四個複習: 13.的修改

#include <stdio.h>

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可

#include <opencv/cv.h>

#include <GL/glut.h>

#include "glm.h"

GLMmodel * head = NULL;

GLMmodel * body = NULL; ///GLMmodel * gundam = NULL;

GLMmodel * arm1 = NULL, * arm2 = NULL;

GLMmodel * hand1 = NULL, * hand2 = NULL;

GLMmodel * bot = NULL;

GLMmodel * leg1 = NULL, * leg2 = NULL;

GLMmodel * knee1 = NULL, * knee2 = NULL;

GLMmodel * foot1 = NULL, * foot2 = NULL;

int myTexture(char * filename)

{

 ......

}


float teapotX=0, teapotY=0, angle=0, angle2=0, oldX=0, oldY=0;  ///有不同

void mouse(int button, int state, int x, int y) {

    oldX = x;

    oldY = y;

}


void motion(int x, int y) {

    teapotX += (x - oldX)/10.0; ///有不同

    teapotY += (oldY - y)/10.0; ///有不同

    angle += x - oldX;

    angle2 += y - oldY; ///有不同

    oldX = x;

    oldY = y; ///有不同

    printf("glTranslatef(%.3f , %.3f , 0 );\n", teapotX, teapotY);

    glutPostRedisplay();

}

void display() {

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glScalef(2,2,2);

        glTranslatef(0, -0.4, 0);

        glPushMatrix();

            glColor3f(1,1,1);///glColor3f(1,0,0);

            glScalef(0.03, 0.03, 0.03);

            ///glRotatef(angle, 0, 1, 0);

            glmDraw(body, GLM_MATERIAL | GLM_TEXTURE); ///glmDraw(gundam, GLM_MATERIAL | GLM_TEXTURE);


            glPushMatrix();

                glTranslatef(0.000 , +22.300 , 0 );

                //glRotatef(angle, 0, 1, 0);

                //glRotatef(angle2, 1, 0, 0);

                glTranslatef(0.000 , -22.300 , 0 );

                ///glTranslatef(teapotX, teapotY, 0);

                glmDraw(head, GLM_MATERIAL | GLM_TEXTURE);

            glPopMatrix();


            glPushMatrix();

                glTranslatef(-3.800 , +21.200 , 0 );

                //glRotatef(angle, 0, 1, 0);

                //glRotatef(angle2, 1, 0, 0);

                glTranslatef(3.800 , -21.200 , 0 );

                ///glTranslatef(teapotX, teapotY, 0);

                glmDraw(arm1, GLM_MATERIAL | GLM_TEXTURE);

                glPushMatrix();

                    glTranslatef(-4.300 , +18.600 , 0 );

                    //glRotatef(angle, 0, 1, 0);

                    //glRotatef(angle2, 1, 0, 0);

                    glTranslatef(4.300 , -18.600 , 0 );

                    glmDraw(hand1, GLM_MATERIAL | GLM_TEXTURE);

                glPopMatrix();

            glPopMatrix();


            glPushMatrix();

                glTranslatef(+3.800 , +21.200 , 0 );

                //glRotatef(angle, 0, 1, 0);

                //glRotatef(angle2, 1, 0, 0);

                glTranslatef(-3.800 , -21.200 , 0 );

                ///glTranslatef(teapotX, teapotY, 0);

                glmDraw(arm2, GLM_MATERIAL | GLM_TEXTURE);

                glPushMatrix();

                    glTranslatef(+4.300 , +18.600 , 0 );

                    //glRotatef(angle, 0, 1, 0);

                    //glRotatef(angle2, 1, 0, 0);

                    glTranslatef(-4.300 , -18.600 , 0 );

                    glmDraw(hand2, GLM_MATERIAL | GLM_TEXTURE);

                glPopMatrix();

            glPopMatrix();


            glmDraw(bot, GLM_MATERIAL | GLM_TEXTURE);


            glPushMatrix();///左大腿

                glTranslatef(-2.000 , +14.100 , 0 );

                //glRotatef(angle, 0, 1, 0);

                //glRotatef(angle2, 1, 0, 0);

                glTranslatef(2.000 , -14.100 , 0 );

                glmDraw(leg1, GLM_MATERIAL | GLM_TEXTURE);


                glPushMatrix();

                    glTranslatef(-2.000 , +10.500 , 0 );

                    //glRotatef(angle, 0, 1, 0);

                    //glRotatef(angle2, 1, 0, 0);

                    glTranslatef(2.000 , -10.500 , 0 );

                    glmDraw(knee1, GLM_MATERIAL | GLM_TEXTURE);


                    glPushMatrix();

                        glTranslatef(-2.000 , +3.000 , 0 );

                        glRotatef(angle, 0, 1, 0);

                        glRotatef(angle2, 1, 0, 0);

                        glTranslatef(2.000 , -3.000 , 0 );

                        glmDraw(foot1, GLM_MATERIAL | GLM_TEXTURE);

                    glPopMatrix();

                glPopMatrix();

            glPopMatrix();


            glPushMatrix();///右大腿

                glTranslatef(+2.000 , +14.100 , 0 );

                //glRotatef(angle, 0, 1, 0);

                //glRotatef(angle2, 1, 0, 0);

                glTranslatef(-2.000 , -14.100 , 0 );

                glmDraw(leg2, GLM_MATERIAL | GLM_TEXTURE);


                glPushMatrix();

                    glTranslatef(+2.000 , +10.500 , 0 );

                    glRotatef(angle, 0, 1, 0);

                    glRotatef(angle2, 1, 0, 0);

                    glTranslatef(-2.000 , -10.500 , 0 );

                    glmDraw(knee2, GLM_MATERIAL | GLM_TEXTURE);


                    glPushMatrix();

                        glTranslatef(+2.000 , +3.000 , 0 );

                        glRotatef(angle, 0, 1, 0);

                        glRotatef(angle2, 1, 0, 0);

                        glTranslatef(-2.000 , -3.000 , 0 );

                        glmDraw(foot2, GLM_MATERIAL | GLM_TEXTURE);

                    glPopMatrix();

                glPopMatrix();

            glPopMatrix();


        glPopMatrix();

        glColor3f(0,1,0);///中心點的位置

        glutSolidTeapot( 0.01 );///中心點的位置

    glPopMatrix();


    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week16");


    glutDisplayFunc(display);

    glutMotionFunc(motion);

    glutMouseFunc(mouse);


    head = glmReadOBJ("model/head.obj");

    body = glmReadOBJ("model/body.obj"); ///gundam = glmReadOBJ("model/gundam.obj");

    arm1 = glmReadOBJ("model/arm1.obj");

    arm2 = glmReadOBJ("model/arm2.obj");

    hand1 = glmReadOBJ("model/hand1.obj");

    hand2 = glmReadOBJ("model/hand2.obj");

    bot = glmReadOBJ("model/bot.obj");

    leg1 = glmReadOBJ("model/leg1.obj");

    leg2 = glmReadOBJ("model/leg2.obj");

    knee1 = glmReadOBJ("model/knee1.obj");

    knee2 = glmReadOBJ("model/knee2.obj");

    foot1 = glmReadOBJ("model/foot1.obj");

    foot2 = glmReadOBJ("model/foot2.obj");

    myTexture("model/Diffuse.jpg");

    glEnable(GL_DEPTH_TEST);


    glutMainLoop();

}

第十五個複習:各部位加入編號,個別控制

#include <stdio.h>

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可

#include <opencv/cv.h>

#include <GL/glut.h>

#include "glm.h"

GLMmodel * head = NULL;

GLMmodel * body = NULL; ///GLMmodel * gundam = NULL;

GLMmodel * arm1 = NULL, * arm2 = NULL;

GLMmodel * hand1 = NULL, * hand2 = NULL;

GLMmodel * bot = NULL;

GLMmodel * leg1 = NULL, * leg2 = NULL;

GLMmodel * knee1 = NULL, * knee2 = NULL;

GLMmodel * foot1 = NULL, * foot2 = NULL;

int myTexture(char * filename)

{

    .......

}

float teapotX=0, teapotY=0, oldX=0, oldY=0;  ///有不同

float angle[20]={}, angle2[20]={};

int ID=0; ///0:head, 1,2:left, 3,4:right hand, 5,6,7:left leg, 8,9,10:right leg

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

    if(key=='0') ID=0;

    if(key=='1') ID=1;

    if(key=='2') ID=2;

    if(key=='3') ID=3;

    if(key=='4') ID=4;

    if(key=='5') ID=5;

    if(key=='6') ID=6;

    if(key=='7') ID=7;

    if(key=='8') ID=8;

    if(key=='9') ID=9;

}

void mouse(int button, int state, int x, int y) {

    oldX = x;

    oldY = y;

}


void motion(int x, int y) {

    teapotX += (x - oldX)/10.0; ///有不同

    teapotY += (oldY - y)/10.0; ///有不同

    angle[ID] += x - oldX;

    angle2[ID] += y - oldY; ///有不同

    oldX = x;

    oldY = y; ///有不同

    printf("glTranslatef(%.3f , %.3f , 0 );\n", teapotX, teapotY);

    glutPostRedisplay();

}

void display() {

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glScalef(2,2,2);

        glTranslatef(0, -0.4, 0);

        glPushMatrix();

            glColor3f(1,1,1);///glColor3f(1,0,0);

            glScalef(0.03, 0.03, 0.03);

            glRotatef(90, 0, 1, 0);

            glmDraw(body, GLM_MATERIAL | GLM_TEXTURE); ///glmDraw(gundam, GLM_MATERIAL | GLM_TEXTURE);


            glPushMatrix();

                glTranslatef(0.000 , +22.300 , 0 );

                glRotatef(angle[0], 0, 1, 0);

                glRotatef(angle2[0], 1, 0, 0);

                glTranslatef(0.000 , -22.300 , 0 );

                glmDraw(head, GLM_MATERIAL | GLM_TEXTURE);

            glPopMatrix();


            glPushMatrix();

                glTranslatef(-3.800 , +21.200 , 0 );

                glRotatef(angle[1], 0, 1, 0);

                glRotatef(angle2[1], 1, 0, 0);

                glTranslatef(3.800 , -21.200 , 0 );

                glmDraw(arm1, GLM_MATERIAL | GLM_TEXTURE);

                glPushMatrix();

                    glTranslatef(-4.300 , +18.600 , 0 );

                    glRotatef(angle[2], 0, 1, 0);

                    glRotatef(angle2[2], 1, 0, 0);

                    glTranslatef(4.300 , -18.600 , 0 );

                    glmDraw(hand1, GLM_MATERIAL | GLM_TEXTURE);

                glPopMatrix();

            glPopMatrix();


            glPushMatrix();

                glTranslatef(+3.800 , +21.200 , 0 );

                glRotatef(angle[3], 0, 1, 0);

                glRotatef(angle2[3], 1, 0, 0);

                glTranslatef(-3.800 , -21.200 , 0 );

                glmDraw(arm2, GLM_MATERIAL | GLM_TEXTURE);

                glPushMatrix();

                    glTranslatef(+4.300 , +18.600 , 0 );

                    glRotatef(angle[4], 0, 1, 0);

                    glRotatef(angle2[4], 1, 0, 0);

                    glTranslatef(-4.300 , -18.600 , 0 );

                    glmDraw(hand2, GLM_MATERIAL | GLM_TEXTURE);

                glPopMatrix();

            glPopMatrix();


            glmDraw(bot, GLM_MATERIAL | GLM_TEXTURE);


            glPushMatrix();///左大腿

                glTranslatef(-2.000 , +14.100 , 0 );

                glRotatef(angle[5], 0, 1, 0);

                glRotatef(angle2[5], 1, 0, 0);

                glTranslatef(2.000 , -14.100 , 0 );

                glmDraw(leg1, GLM_MATERIAL | GLM_TEXTURE);


                glPushMatrix();

                    glTranslatef(-2.000 , +10.500 , 0 );

                    glRotatef(angle[6], 0, 1, 0);

                    glRotatef(angle2[6], 1, 0, 0);

                    glTranslatef(2.000 , -10.500 , 0 );

                    glmDraw(knee1, GLM_MATERIAL | GLM_TEXTURE);


                    glPushMatrix();

                        glTranslatef(-2.000 , +3.000 , 0 );

                        glRotatef(angle[7], 0, 1, 0);

                        glRotatef(angle2[7], 1, 0, 0);

                        glTranslatef(2.000 , -3.000 , 0 );

                        glmDraw(foot1, GLM_MATERIAL | GLM_TEXTURE);

                    glPopMatrix();

                glPopMatrix();

            glPopMatrix();


            glPushMatrix();///右大腿

                glTranslatef(+2.000 , +14.100 , 0 );

                glRotatef(angle[8], 0, 1, 0);

                glRotatef(angle2[8], 1, 0, 0);

                glTranslatef(-2.000 , -14.100 , 0 );

                glmDraw(leg2, GLM_MATERIAL | GLM_TEXTURE);


                glPushMatrix();

                    glTranslatef(+2.000 , +10.500 , 0 );

                    glRotatef(angle[9], 0, 1, 0);

                    glRotatef(angle2[9], 1, 0, 0);

                    glTranslatef(-2.000 , -10.500 , 0 );

                    glmDraw(knee2, GLM_MATERIAL | GLM_TEXTURE);


                    glPushMatrix();

                        glTranslatef(+2.000 , +3.000 , 0 );

                        glRotatef(angle[10], 0, 1, 0);

                        glRotatef(angle2[10], 1, 0, 0);

                        glTranslatef(-2.000 , -3.000 , 0 );

                        glmDraw(foot2, GLM_MATERIAL | GLM_TEXTURE);

                    glPopMatrix();

                glPopMatrix();

            glPopMatrix();


        glPopMatrix();

        glColor3f(0,1,0);///中心點的位置

        glutSolidTeapot( 0.01 );///中心點的位置

    glPopMatrix();


    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week16");


    glutDisplayFunc(display);

    glutMotionFunc(motion);

    glutMouseFunc(mouse);

    glutKeyboardFunc(keyboard);


    head = glmReadOBJ("model/head.obj");

    body = glmReadOBJ("model/body.obj"); ///gundam = glmReadOBJ("model/gundam.obj");

    arm1 = glmReadOBJ("model/arm1.obj");

    arm2 = glmReadOBJ("model/arm2.obj");

    hand1 = glmReadOBJ("model/hand1.obj");

    hand2 = glmReadOBJ("model/hand2.obj");

    bot = glmReadOBJ("model/bot.obj");

    leg1 = glmReadOBJ("model/leg1.obj");

    leg2 = glmReadOBJ("model/leg2.obj");

    knee1 = glmReadOBJ("model/knee1.obj");

    knee2 = glmReadOBJ("model/knee2.obj");

    foot1 = glmReadOBJ("model/foot1.obj");

    foot2 = glmReadOBJ("model/foot2.obj");

    myTexture("model/Diffuse.jpg");

    glEnable(GL_DEPTH_TEST);


    glutMainLoop();

}

第十六個複習: 寫入存檔

在keyboard函數裡加入下列

if(key=='s'){ ///save

        if(fout==NULL) fout = fopen("motion.txt", "w");

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

            fprintf(fout, "%.2f ", angle[i] );

            fprintf(fout, "%.2f ", angle2[i] );

        }

        fprintf(fout, "\n");

        printf("你寫了1行\n");

    }

第十七個複習: 讀入存檔

if(key=='s'){ ///save

        if(fout==NULL) fout = fopen("motion.txt", "w");

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

            fprintf(fout, "%.2f ", angle[i] );

            fprintf(fout, "%.2f ", angle2[i] );

        }

        fprintf(fout, "\n");

        printf("你寫了1行\n");

    }

    if(key=='r'){ ///read

        if(fin==NULL) fin = fopen("motion.txt", "r");

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

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

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

        }

        glutPostRedisplay();

    }

第十八個複習:加入播放timer

#include <stdio.h>

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可

#include <opencv/cv.h>

#include <GL/glut.h>

#include "glm.h"

GLMmodel * head = NULL;

GLMmodel * body = NULL; ///GLMmodel * gundam = NULL;

GLMmodel * arm1 = NULL, * arm2 = NULL;

GLMmodel * hand1 = NULL, * hand2 = NULL;

GLMmodel * bot = NULL;

GLMmodel * leg1 = NULL, * leg2 = NULL;

GLMmodel * knee1 = NULL, * knee2 = NULL;

GLMmodel * foot1 = NULL, * foot2 = NULL;

int myTexture(char * filename)

{

    IplImage * img = cvLoadImage(filename); ///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);

    return id;

}

FILE * fin = NULL;

FILE * fout = NULL;

float teapotX=0, teapotY=0, oldX=0, oldY=0;  ///有不同

float angle[20]={}, angle2[20]={};

float OldAngle[20]={}, NewAngle[20]={};

float OldAngle2[20]={}, NewAngle2[20]={};

int ID=0; ///0:head, 1,2:left, 3,4:right hand, 5,6,7:left leg, 8,9,10:right leg

void timer(int t) {

    glutTimerFunc(20, timer, t+1);

    if(t%50==0){ ///新的開始,要讀新的動作

        if(fin==NULL) fin = fopen("motion.txt", "r");

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

            OldAngle[i] = NewAngle[i];

            OldAngle2[i] = NewAngle2[i];

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

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

        }

    }

    float alpha = (t%50) / 50.0;

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

        angle[i] = alpha * NewAngle[i] + (1-alpha) * OldAngle[i];

        angle2[i] = alpha * NewAngle2[i] + (1-alpha) * OldAngle2[i];

    }

    glutPostRedisplay();

}

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

    if(key=='0') ID=0;

    if(key=='1') ID=1;

    if(key=='2') ID=2;

    if(key=='3') ID=3;

    if(key=='4') ID=4;

    if(key=='5') ID=5;

    if(key=='6') ID=6;

    if(key=='7') ID=7;

    if(key=='8') ID=8;

    if(key=='9') ID=9;

    if(key=='s'){ ///save 三選一: save, read, play (重開)

        if(fout==NULL) fout = fopen("motion.txt", "w");

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

            fprintf(fout, "%.2f ", angle[i] );

            fprintf(fout, "%.2f ", angle2[i] );

        }

        fprintf(fout, "\n");

        printf("你寫了1行\n");

    }

    if(key=='r'){ ///read 三選一: save, read, play (重開)

        if(fin==NULL) fin = fopen("motion.txt", "r");

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

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

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

        }

        glutPostRedisplay();

    }

    if(key=='p'){ ///play 三選一: save, read, play (重開)

        glutTimerFunc(0, timer, 0);

    }

}

void mouse(int button, int state, int x, int y) {

    oldX = x;

    oldY = y;

}


void motion(int x, int y) {

    teapotX += (x - oldX)/10.0; ///有不同

    teapotY += (oldY - y)/10.0; ///有不同

    angle[ID] += x - oldX;

    angle2[ID] += y - oldY; ///有不同

    oldX = x;

    oldY = y; ///有不同

    ///printf("glTranslatef(%.3f , %.3f , 0 );\n", teapotX, teapotY);

    glutPostRedisplay();

}

void display() {

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glScalef(2,2,2);

        glTranslatef(0, -0.4, 0);

        glPushMatrix();

            glColor3f(1,1,1);///glColor3f(1,0,0);

            glScalef(0.03, 0.03, 0.03);

            glRotatef(180, 0, 1, 0);

            glmDraw(body, GLM_MATERIAL | GLM_TEXTURE); ///glmDraw(gundam, GLM_MATERIAL | GLM_TEXTURE);


            glPushMatrix();

                glTranslatef(0.000 , +22.300 , 0 );

                glRotatef(angle[0], 0, 1, 0);

                glRotatef(angle2[0], 1, 0, 0);

                glTranslatef(0.000 , -22.300 , 0 );

                glmDraw(head, GLM_MATERIAL | GLM_TEXTURE);

            glPopMatrix();


            glPushMatrix();

                glTranslatef(-3.800 , +21.200 , 0 );

                glRotatef(angle[1], 0, 1, 0);

                glRotatef(angle2[1], 1, 0, 0);

                glTranslatef(3.800 , -21.200 , 0 );

                glmDraw(arm1, GLM_MATERIAL | GLM_TEXTURE);

                glPushMatrix();

                    glTranslatef(-4.300 , +18.600 , 0 );

                    glRotatef(angle[2], 0, 1, 0);

                    glRotatef(angle2[2], 1, 0, 0);

                    glTranslatef(4.300 , -18.600 , 0 );

                    glmDraw(hand1, GLM_MATERIAL | GLM_TEXTURE);

                glPopMatrix();

            glPopMatrix();


            glPushMatrix();

                glTranslatef(+3.800 , +21.200 , 0 );

                glRotatef(angle[3], 0, 1, 0);

                glRotatef(angle2[3], 1, 0, 0);

                glTranslatef(-3.800 , -21.200 , 0 );

                glmDraw(arm2, GLM_MATERIAL | GLM_TEXTURE);

                glPushMatrix();

                    glTranslatef(+4.300 , +18.600 , 0 );

                    glRotatef(angle[4], 0, 1, 0);

                    glRotatef(angle2[4], 1, 0, 0);

                    glTranslatef(-4.300 , -18.600 , 0 );

                    glmDraw(hand2, GLM_MATERIAL | GLM_TEXTURE);

                glPopMatrix();

            glPopMatrix();


            glmDraw(bot, GLM_MATERIAL | GLM_TEXTURE);


            glPushMatrix();///左大腿

                glTranslatef(-2.000 , +14.100 , 0 );

                glRotatef(angle[5], 0, 1, 0);

                glRotatef(angle2[5], 1, 0, 0);

                glTranslatef(2.000 , -14.100 , 0 );

                glmDraw(leg1, GLM_MATERIAL | GLM_TEXTURE);


                glPushMatrix();

                    glTranslatef(-2.000 , +10.500 , 0 );

                    glRotatef(angle[6], 0, 1, 0);

                    glRotatef(angle2[6], 1, 0, 0);

                    glTranslatef(2.000 , -10.500 , 0 );

                    glmDraw(knee1, GLM_MATERIAL | GLM_TEXTURE);


                    glPushMatrix();

                        glTranslatef(-2.000 , +3.000 , 0 );

                        glRotatef(angle[7], 0, 1, 0);

                        glRotatef(angle2[7], 1, 0, 0);

                        glTranslatef(2.000 , -3.000 , 0 );

                        glmDraw(foot1, GLM_MATERIAL | GLM_TEXTURE);

                    glPopMatrix();

                glPopMatrix();

            glPopMatrix();


            glPushMatrix();///右大腿

                glTranslatef(+2.000 , +14.100 , 0 );

                glRotatef(angle[8], 0, 1, 0);

                glRotatef(angle2[8], 1, 0, 0);

                glTranslatef(-2.000 , -14.100 , 0 );

                glmDraw(leg2, GLM_MATERIAL | GLM_TEXTURE);


                glPushMatrix();

                    glTranslatef(+2.000 , +10.500 , 0 );

                    glRotatef(angle[9], 0, 1, 0);

                    glRotatef(angle2[9], 1, 0, 0);

                    glTranslatef(-2.000 , -10.500 , 0 );

                    glmDraw(knee2, GLM_MATERIAL | GLM_TEXTURE);


                    glPushMatrix();

                        glTranslatef(+2.000 , +3.000 , 0 );

                        glRotatef(angle[10], 0, 1, 0);

                        glRotatef(angle2[10], 1, 0, 0);

                        glTranslatef(-2.000 , -3.000 , 0 );

                        glmDraw(foot2, GLM_MATERIAL | GLM_TEXTURE);

                    glPopMatrix();

                glPopMatrix();

            glPopMatrix();


        glPopMatrix();

        glColor3f(0,1,0);///中心點的位置

        glutSolidTeapot( 0.01 );///中心點的位置

    glPopMatrix();


    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week16");


    glutDisplayFunc(display);

    glutMotionFunc(motion);

    glutMouseFunc(mouse);

    glutKeyboardFunc(keyboard);


    head = glmReadOBJ("model/head.obj");

    body = glmReadOBJ("model/body.obj"); ///gundam = glmReadOBJ("model/gundam.obj");

    arm1 = glmReadOBJ("model/arm1.obj");

    arm2 = glmReadOBJ("model/arm2.obj");

    hand1 = glmReadOBJ("model/hand1.obj");

    hand2 = glmReadOBJ("model/hand2.obj");

    bot = glmReadOBJ("model/bot.obj");

    leg1 = glmReadOBJ("model/leg1.obj");

    leg2 = glmReadOBJ("model/leg2.obj");

    knee1 = glmReadOBJ("model/knee1.obj");

    knee2 = glmReadOBJ("model/knee2.obj");

    foot1 = glmReadOBJ("model/foot1.obj");

    foot2 = glmReadOBJ("model/foot2.obj");

    myTexture("model/Diffuse.jpg");

    glEnable(GL_DEPTH_TEST);


    glutMainLoop();

}




沒有留言:

張貼留言