先到 點我辣!這個網站
然後下載data、win32、glut32.dll、source
將windows解壓縮,glut32.dll跟data的資料放進去
點開data並開啟OBJ檔
可以看到模型是怎麼做的
v=頂點 vn=打光法向量
f=面 g=group
一個group用一個顏色
自己做模型!
先把main裡面的函式都刪掉
然後複製貼上基本需要的程式碼
接著就開始自己動手打做出模型的程式碼了!
----------------------------------------
#include <GL/glut.h>
#include "glm.h"///用glm外掛,glm.h放在跟專案同一個目錄裡
GLMmodel * model = NULL;///glm的資料結構,先NULL空
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if(model==NULL){///如果沒有模型
model = glmReadOBJ("data/Al.obj");///讀入模型
glmUnitize(model);///Unit單位大小 -1...+1
glmFacetNormals(model);///計算面的法向量
glmVertexNormals(model,90);///推算頂點法向量
}
glmDraw(model, GLM_SMOOTH | GLM_MATERIAL);///畫模型
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("weeeeeeeeeeeeeeeek11_DIY!");
glutDisplayFunc(display);
glutMainLoop();
}
----------------------------------------
加上打光的程式碼!
要讓模型看起來式立體ㄉ!
可以先到我第五週的文章複製打光的程式碼
所以我們就用Rotate讓他轉向我們ㄅ
強制轉向啦嘿(*´▽`*)
嘿喲!我們看到他的正臉ㄌ!
這邊附上程式碼給你
----------------------------------------
#include <GL/glut.h>
#include "glm.h"///用glm外掛,glm.h放在跟專案同一個目錄裡
GLMmodel * model = NULL;///glm的資料結構,先NULL空
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, 3.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(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if(model==NULL){///如果沒有模型
model = glmReadOBJ("data/Al.obj");///讀入模型
glmUnitize(model);///Unit單位大小 -1...+1
glmFacetNormals(model);///計算面的法向量
glmVertexNormals(model,90);///推算頂點法向量
}
glPushMatrix();
glRotatef(180,0,1,0);///針對Y軸轉向
glmDraw(model, GLM_SMOOTH | GLM_MATERIAL);///加上貼圖就可以看到貼圖ㄌ
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("weeeeeeeeeeeeeeeek11_DIY!");
glutDisplayFunc(display);
///打光需要3Dㄉdepth test
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_SHININESS, high_shininess);
glutMainLoop();
}
----------------------------------------
下面4作業ㄉ程式碼
#include <GL/glut.h>
#include <stdio.h>
#include "glm.h" ///使用glm外掛 glm.h在專案同一目錄裡
GLMmodel *model=NULL; ///這是glm的資料結構 NULL為空
GLMmodel *model2=NULL;
GLMmodel *model3=NULL;
GLMmodel *model4=NULL;
GLMmodel *model5=NULL;
GLMmodel *model6=NULL;
GLMmodel *arm=NULL;
///打光第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[] = { 0.0f, 1.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 angle=0,angle_y=0,angle1=0,angle2=0,angle4=0.25,angle5=0.25,angle6=0.25,angle7=0.25;
float d=0.5,dy=0,d1=0,d2=0,d4=0,d5=0,d6=0,d7=0;
float y=0,z=1;
int t=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
///以前畫茶壺,今天畫3D模型
if(model==NULL){///如果沒有模型
model = glmReadOBJ("hand.obj"); ///讀入模型
glmUnitize(model); ///Unit單位大小 -1...+1
glmFacetNormals(model); ///算面facet法向量
glmVertexNormals(model, 90); ///在推算出vertex法向量
} ///離開if就有模型
if(model2==NULL){///如果沒有模型
model2 = glmReadOBJ("hand2.obj"); ///讀入模型
glmUnitize(model2); ///Unit單位大小 -1...+1
glmFacetNormals(model2); ///算面facet法向量
glmVertexNormals(model2, 90); ///在推算出vertex法向量
}///離開if就有模型
if(model3==NULL){///如果沒有模型
model3 = glmReadOBJ("hand3.obj"); ///讀入模型
glmUnitize(model3); ///Unit單位大小 -1...+1
glmFacetNormals(model3); ///算面facet法向量
glmVertexNormals(model3, 90); ///在推算出vertex法向量
}///離開if就有模型
if(model4==NULL){///如果沒有模型
model4 = glmReadOBJ("hand4.obj"); ///讀入模型
glmUnitize(model4); ///Unit單位大小 -1...+1
glmFacetNormals(model4); ///算面facet法向量
glmVertexNormals(model4, 90); ///在推算出vertex法向量
}///離開if就有模型
if(model5==NULL){///如果沒有模型
model5 = glmReadOBJ("hand5.obj"); ///讀入模型
glmUnitize(model5); ///Unit單位大小 -1...+1
glmFacetNormals(model5); ///算面facet法向量
glmVertexNormals(model5, 90); ///在推算出vertex法向量
}///離開if就有模型
if(model6==NULL){///如果沒有模型
model6 = glmReadOBJ("hand6.obj"); ///讀入模型
glmUnitize(model6); ///Unit單位大小 -1...+1
glmFacetNormals(model6); ///算面facet法向量
glmVertexNormals(model6, 90); ///在推算出vertex法向量
}///離開if就有模型
if(arm==NULL){///如果沒有模型
arm = glmReadOBJ("arm.obj"); ///讀入模型
glmUnitize(arm); ///Unit單位大小 -1...+1
glmFacetNormals(arm); ///算面facet法向量
glmVertexNormals(arm, 90); ///在推算出vertex法向量
}///離開if就有模型
glPushMatrix();///arm
glTranslatef(0,-0.5,0);
glRotatef(180, 0,1,0);
glRotatef(angle, 0,0,1);
glRotatef(angle_y, 0,1,0);
glTranslatef(0,0.4,0);
glScalef(0.6,0.6,0.6);
glmDraw(arm, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();///1
glTranslatef(-0.025,1,0.2);
glRotatef(angle1, 1,0,0);
glScalef(0.3,0.3,0.3);
glmDraw(model, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();///2
glTranslatef(0.15,1,0);
glRotatef(angle2, 1,0,0);
glTranslatef(0,0.3,0);
glScalef(0.9,0.9,0.9);
glmDraw(model2, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();///4
glTranslatef(-0.03,0.6,-0.25);
glRotatef(angle4, 1,0,0);
glTranslatef(0,0.2,0.2);
glScalef(1.8,1.8,1.8);
glmDraw(model4, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();///5
glTranslatef(-0.02,0.1,0);
glRotatef(angle5, 1,0,0);
glTranslatef(0,0.2,0);
glScalef(1.28,1.28,1.28);
glmDraw(model5, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();///5
glPopMatrix();///4
glPopMatrix();///2
glPushMatrix();
glTranslatef(-1.1,0.5,0.3);
glRotatef(angle6, 0.5,1,0);
glScalef(1,1,1);
glmDraw(model6, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();
glTranslatef(-0.24,0.2,0);
glRotatef(angle7, 0,1,0);
glTranslatef(0,0.2,0);
glScalef(0.94,0.94,0.94);
glmDraw(model6, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();///6-2
glPopMatrix();///6
glPopMatrix();///1
glPopMatrix();///arm
angle+=d;
angle_y+=dy;
angle1+=d1;
angle2+=d2;
angle4+=d4;
angle5+=d5;
angle6+=d6;
angle7+=d7;
if(angle==30) d=-0.5;
if(angle==-30) d=+0.5;
if(angle==0) t++;
if(t==3) {
d=0;
d1=0.25;
}
if(angle1==40) {
d1=0;
d2=0.25;
if(angle2==40) {
d2=0;
d4=0.25;
d6=0.25;
if(angle4==70) {
d4=0;
d6=0;
d5=0.25;
d7=0.25;
if(angle5==70) {
d5=0;
d7=0;
}
}
}
}
if(angle5==70){
y=1,z=0;
dy=0.5;
}
if(angle_y==180) dy=0;
glutSwapBuffers();
}
static void idle(void)
{
glutPostRedisplay();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(400,400);
glutCreateWindow("自己做模型!");
glutDisplayFunc(display);
glutIdleFunc(idle);
///打光需要3Dㄉdepth test
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_SHININESS, high_shininess);
glutMainLoop();
}












沒有留言:
張貼留言