2022年6月9日 星期四

Yiting_week15_HW4

 HomeWork4製作擺pose機器人

step1:

在maya製作模型(各部位必須分開,不能combine),並輸出成obj檔

輸出obj檔:File/Export Selection/files of type選擇obj

*點選部位直接匯出就好,不須一個一個刪



Step2:

將obj檔及相對應的html檔放入codeblocks相對的資料夾(為了排放整齊,可創一個資料夾為date放)


Step3:
先將glm.h&glm.cpp&freeglut.dll放入codeblocks的相對應資料夾


開始打程式:

#include <GL/glut.h>
#include <stdio.h>
#include "glm.h"
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 };///打光

GLMmodel * head =NULL;
GLMmodel * body =NULL;
GLMmodel * hand1 =NULL;
GLMmodel * hand2 =NULL;
GLMmodel * leg1 =NULL;
GLMmodel * leg2 =NULL;///部位

float angle[20]={};///角度
int angleID=0;///初始化各關節

GLMmodel * myReadOne(char * filename){
    GLMmodel * one =NULL;
    one = glmReadOBJ(filename);
    glmUnitize(one);
    glmFacetNormals(one);
    glmVertexNormals(one,90);
    return one;
}///讀obj檔
float dx=0,dy=0,dz=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){
    dx+=(x-oldX)/250.0;dy-=(y-oldY)/250.0;
    angle[angleID]+=(x-oldX);
    oldX=x;oldY=y;
    printf("glTranslatef(%.2f,%.2f,%.2f);\n",dx,dy,dz);
    glutPostRedisplay();
}///滑鼠位置
void keyboard(unsigned char key,int x,int y)
{
    if(key=='0') angleID=0;
    if(key=='1') angleID=1;
    if(key=='2') angleID=2;
    if(key=='3') angleID=3;
}///鍵盤
void display()
{
     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
     glmDraw(body,GLM_SMOOTH);

     glPushMatrix();
        glTranslatef(0.02,0.75,0.00);///模型位置
        glmDraw(head,GLM_SMOOTH);
     glPopMatrix();

     glPushMatrix();
        glTranslatef(0.20,0.5,0.00);///模型位置
        glRotatef(angle[0],0,0,1);///(第幾個關節,x,y,z(選擇旋轉哪一軸))
        glTranslatef(0.19,-0.38,0.00);///旋轉的中心點
        glmDraw(hand1,GLM_SMOOTH);
     glPopMatrix();

     glPushMatrix();
        glTranslatef(-0.25,0.5,0.00);///模型位置
        glRotatef(angle[1],0,0,1);///(第幾個關節,x,y,z(選擇旋轉哪一軸))
        glTranslatef(-0.17,-0.35,0.00);///旋轉的中心點
        glmDraw(hand2,GLM_SMOOTH);
     glPopMatrix();

      glPushMatrix();
        glTranslatef(0.13,-0.35,0.00);///模型位置
        glRotatef(angle[2],0,0,1);///(第幾個關節,x,y,z(選擇旋轉哪一軸))
        glTranslatef(0.00,-0.26,0.00);///旋轉的中心點
        glmDraw(leg1,GLM_SMOOTH);
     glPopMatrix();

     glPushMatrix();
        glTranslatef(-0.20,-0.35,0.00);///模型位置
        glRotatef(angle[3],0,0,1);///(第幾個關節,x,y,z(選擇旋轉哪一軸))
        glTranslatef(-0.00,-0.26,0.00);///旋轉的中心點
        glmDraw(leg1,GLM_SMOOTH);
     glPopMatrix();

     glutSwapBuffers();
}///模型的位置&轉動

void myLighting(){
    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);
}///打光
int main(int argc, char** argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("HW4");
    head = myReadOne("date/head.obj");
    body = myReadOne("date/body.obj");
    hand1 = myReadOne("date/hand1.obj");
    hand2 = myReadOne("date/hand2.obj");
    leg1 = myReadOne("date/leg1.obj");
    leg2 = myReadOne("date/leg2.obj");///從哪讀檔
    glutDisplayFunc( display );
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);
    myLighting();
    glutMainLoop();
}

*1:在要確定各關節位置時,可使用printf("glTranslatef(%.2f,%.2f,%.2f);\n",dx,dy,dz);和glTranslatef(dx,dy,dz);,方便確定關節該放在什麼座標上
*2:在設定旋轉的中心點時,可先做一個茶壺出來確定中心點在哪

完成圖:




沒有留言:

張貼留言