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:在設定旋轉的中心點時,可先做一個茶壺出來確定中心點在哪
完成圖:




沒有留言:
張貼留言