
#include <GL/glut.h>
///打光的第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);
glutSolidTeapot( 0.3 );
glutSwapBuffers();
}
/* Program entry point */
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutDisplayFunc(display);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
///打光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_SPECULAR, light_specular);
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);
glutMainLoop();
return EXIT_SUCCESS;
}

#include <GL/glut.h>
///打光的第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 teapotX=0, teapotY=0;///TODO1:
int oldX=0,oldY=0;///TODO1:
void mouse(int button,int state,int x,int y)
{///TODO1:mouse要可移動teapot Step1:按下去
oldX=x;
oldY=y;
}
void motion(int x,int y)///Step2: motion動
{
teapotX += x-oldX;
teapotY += y-oldY;
oldX=x;
oldY=y;
glutPostRedisplay();///更新畫面
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///TODO1:
glTranslatef(teapotX/250.0,teapotY/250.0,0);
glutSolidTeapot( 0.3 );
glPopMatrix();///TODO1:
glutSwapBuffers();
}
/* Program entry point */
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(500,500);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutDisplayFunc(display);
glutMouseFunc(mouse);///TODO
glutMotionFunc(motion);///TODO1
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
///打光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_SPECULAR, light_specular);
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);
glutMainLoop();
return EXIT_SUCCESS;
}
接下來,要讓茶壺可以移動加轉動。這個時候就要加上可以設定旋轉的程式碼。
阿這個是要先按w,e才可以開始移動的喔~!

#include <GL/glut.h>
///打光的第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 };
int type=1;///TODO2: 1:rotate,2: translate
float teapotX=0, teapotY=0;///TODO1:
float teapotRotY=0;///TODO2:轉動的變數
int oldX=0,oldY=0;///TODO1:
void mouse(int button,int state,int x,int y)
{///TODO1:mouse要可移動teapot Step1:按下去
oldX=x;
oldY=y;
}
void motion(int x,int y)///Step2: motion動
{
if(type==1){
teapotRotY += x-oldX;
}else if(type==2){///TODO2:移動
teapotX += x-oldX;///TODO1
teapotY += y-oldY;///TODO1
}
oldX=x;
oldY=y;
glutPostRedisplay();///更新畫面
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///TODO2:備份矩陣
glTranslatef(teapotX/250.0,teapotY/250.0,0);
glRotatef(teapotX,0,-1,0);///x方向的動 vs. y軸
glutSolidTeapot( 0.3 );
glPopMatrix();///TODO2:備份矩陣
glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y)///TODO2:
{///沒有正負號,全部都當正的來用 0...255
if(key=='e' || key=='E') type=1;///Maya:轉動1
if(key=='w' || key=='W') type=2;///Maya:轉動2
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(500,500);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutDisplayFunc(display);
glutMouseFunc(mouse);///TODO
glutMotionFunc(motion);///TODO1
glutKeyboardFunc(keyboard);///TODO2
glEnable(GL_DEPTH_TEST);
///打光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_SPECULAR, light_specular);
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);
glutMainLoop();
return EXIT_SUCCESS;
}
接下來要讓茶壺可以自由移動
為了瞭解
可以先去 http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/ 下載data,win32,glut32
然後把data跟wimdow解壓縮 ,再把data跟glut32丟到window資料夾中
了解原理後,就可以開始打程式碼了。
#include <GL/glut.h>
///打光的第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 };
int type=1;///TODO2: 1:rotate,2: translate
float teapotX=0, teapotY=0;///TODO1:
float teapotRotY=0;///TODO2:轉動的變數
int oldX=0,oldY=0;///TODO1:
void mouse(int button,int state,int x,int y)
{///TODO1:mouse要可移動teapot Step1:按下去
oldX=x;
oldY=y;
}
void motion(int x,int y)///Step2: motion動
{
if(type==1){
teapotRotY += x-oldX;
}else if(type==2){///TODO2:移動
teapotX += x-oldX;///TODO1
teapotY += y-oldY;///TODO1
}
oldX=x;
oldY=y;
glutPostRedisplay();///更新畫面
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///TODO2:備份矩陣
glTranslatef(teapotX/250.0,-teapotY/250.0,0);
glRotatef(teapotRotY,0,-1,0);///x方向的動 vs. y軸
glutSolidTeapot( 0.3 );
glPopMatrix();///TODO2:備份矩陣
glutSwapBuffers();
teapotRotY++;///TODO3:每次多轉動1度
}
void keyboard(unsigned char key,int x,int y)///TODO2:
{///沒有正負號,全部都當正的來用 0...255
if(key=='e' || key=='E') type=1;///Maya:轉動1
if(key=='w' || key=='W') type=2;///Maya:轉動2
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(500,500);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutDisplayFunc(display);
glutMouseFunc(mouse);///TODO
glutMotionFunc(motion);///TODO1
glutKeyboardFunc(keyboard);///TODO2
glutIdleFunc(display);///TODO3: Idle閒閒的時候,就重畫
glEnable(GL_DEPTH_TEST);
///打光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_SPECULAR, light_specular);
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);
glutMainLoop();
return EXIT_SUCCESS;
}
今天的是最累的~我的眼睛好痛...



沒有留言:
張貼留言