⏰ TIMER ⏰
1.劃出簡單的圓球
程式碼如下:
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidSphere(0.3,30,30); ///0.3是半徑,實心的圓球
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("08160554");
glutDisplayFunc(display);
glutMainLoop();
}
2.啟動計時器
程式碼如下:
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidSphere(0.3,30,30);
glutSwapBuffers();
}
void timer(int t)
{
glClearColor(1,0,0,0);///紅色的
display();
}
int main(int argc, char** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("08160554");
glutDisplayFunc(display);
glutTimerFunc(4000,timer,0);
///4000=>要等多久,timer=>叫誰,0=>參數
glutMainLoop();
}
3.縱切橫切
程式碼如下:
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutWireSphere(0.3,12,5); ///Wire變成線,改變縱切橫切
glutSwapBuffers();
}
void timer(int t)
{
glClearColor(1,0,0,0);
display();
}
int main(int argc, char** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("08160554");
glutDisplayFunc(display);
glutTimerFunc(4000,timer,0);
glutMainLoop();
}
4.轉動的方塊
#include <GL/glut.h>
int angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle,0,0,1);
glutSolidCube(0.3);
glPopMatrix();
glutSwapBuffers();
}
void timer(int t)
{
glutTimerFunc(30,timer,t+1);
angle++;
display();
}
int main(int argc, char** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("08160554");
glutDisplayFunc(display);
glutTimerFunc(4000,timer,0);
glutMainLoop();
}
5.方塊轉過去轉回來
程式碼如下:
#include <GL/glut.h>
int angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle,0,0,1);
glutSolidCube(0.3);
glPopMatrix();
glutSwapBuffers();
}
int diff=2;
void timer(int t)
{
glutTimerFunc(30,timer,t+1);
angle+=diff;
if(angle>180)diff=-diff;
if(angle<0)diff=-diff;
///利用angle+=diff的方法,配合if()調整diff的正負號
display();
}
int main(int argc, char** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("08160554");
glutDisplayFunc(display);
glutTimerFunc(4000,timer,0);
glutMainLoop();
}
6.手臂方塊
#include <GL/glut.h>
int angle=0;
void drawArm1()
{
glPushMatrix();
glScalef(1,0.5,0.5);
glColor3f(1,0,0); ///左手是紅色
glutSolidCube(0.3);
glPopMatrix();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glColor3f(1,1,1);
glutSolidCube(0.4);
glPushMatrix();
glTranslatef(-0.2,+0.2,0); ///掛到右上角
glRotatef(angle,0,0,1); ///轉動
glTranslatef(-0.15,0,0);
///把旋轉中心的關節軸,放在正中心
drawArm1();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int diff=2;
void timer(int t)
{
glutTimerFunc(30,timer,t+1);
angle+=diff;
if(angle>90||angle<0)diff=-diff;
display();
}
int main(int argc, char** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("08160554");
glutDisplayFunc(display);
glutTimerFunc(0,timer,0);
glutMainLoop();
}
作業4
程式碼如下:
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <GL/glut.h>
#include "glm.h"///使用外掛
GLMmodel*pmodel1=NULL;
GLMmodel*head=NULL;
GLMmodel*handl=NULL;
GLMmodel*handr=NULL;
GLMmodel*legl=NULL;
GLMmodel*legr=NULL;
GLMmodel*body=NULL;
const GLfloat light_ambient[] = { 1.0f, 1.0f, 1.0f, 10.0f };
const GLfloat light_diffuse[] = { 10.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 2.0f, 2.0f, 2.0f, 2.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 };
GLuint id1, id2;
int myTexture(char * filename)
{
IplImage * img = cvLoadImage(filename);
cvCvtColor(img,img, CV_BGR2RGB);
glEnable(GL_TEXTURE_2D);
GLuint id;
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
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 angle=0;
float anglehl=10;
float anglehr=10;
float anglefl=-10;///初始角度=0
float anglefr=10;///初始角度=0
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, id1);
glPushMatrix();
glTranslatef(0,-0.3,0);
glRotatef(180,0,1,0);
glScalef(0.2,0.2,0.2);
glmDraw(head,GLM_SMOOTH|GLM_TEXTURE);
glPopMatrix();
glPushMatrix();
glTranslatef(0,-0.3,0);
glRotatef(180,0,1,0);
glScalef(0.2,0.2,0.2);
glmDraw(body,GLM_SMOOTH|GLM_TEXTURE);
glPopMatrix();
glPushMatrix();
glTranslatef(0,-0.05,0.2);
glRotatef(anglehl,0,0,1);
glTranslatef(-0.18,-0.35,0.1);
glScalef(0.25,0.2,0.2);
glmDraw(handl,GLM_SMOOTH|GLM_MATERIAL);
glPopMatrix();
glPushMatrix();
glTranslatef(0,0,0.2);
glRotatef(anglehr,0,0,1);
glTranslatef(0.25,-0.4,-0.1);
glScalef(0.25,0.2,0.2);
glmDraw(handr,GLM_SMOOTH|GLM_MATERIAL);
glPopMatrix();
glPushMatrix();
glTranslatef(0,0,0.2);
glRotatef(anglefl,1,0,0);
glTranslatef(0,-0.3,0);
glScalef(0.2,0.2,0.2);
glmDraw(legl,GLM_SMOOTH|GLM_MATERIAL);
glPopMatrix();
glPushMatrix();
glTranslatef(0,0,0.2);
glRotatef(anglefr,1,0,0);
glTranslatef(0,-0.3,0);
glScalef(0.2,0.2,0.2);
glmDraw(legr,GLM_SMOOTH|GLM_MATERIAL);
glPopMatrix();
glBindTexture(GL_TEXTURE_2D, id2);
glBegin(GL_POLYGON);
glTexCoord2f( 0, 0 ); glVertex3f( -1, +1 ,0.8);
glTexCoord2f( 0, 1 ); glVertex3f( -1, -1 ,0.8);
glTexCoord2f( 1, 1 ); glVertex3f( +1, -1 ,0.8);
glTexCoord2f( 1, 0 ); glVertex3f( +1, +1 ,0.8);
glEnd();
glutSwapBuffers();
anglehl+=1;
anglehr+=1;
anglefl+=1;
anglefr+=1;
if(anglefl>25)anglehr=-anglehr;
if(anglefr>25)anglehl=-anglehl;
if(anglefl>25)anglefl=-anglefl;
if(anglefr>25)anglefr=-anglefr;
}
int main(int argc, char** argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("08160554");
glutDisplayFunc(display);
glutIdleFunc(display);
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);
id1 = myTexture("Diffuse.jpg");
id2 = myTexture("bg.jpg");
body=glmReadOBJ("body.obj");
head=glmReadOBJ("head.obj");
handl=glmReadOBJ("handl.obj");
handr=glmReadOBJ("handr.obj");
legl=glmReadOBJ("legl.obj");
legr=glmReadOBJ("legr.obj");
glEnable(GL_DEPTH_TEST);
glutMainLoop();
}






沒有留言:
張貼留言