2013年5月17日 星期五

第十三周上課內容

1.旋轉茶壺:
程式碼:

#include<GL/glut.h>
#include<stdio.h>
float rot=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(rot,0,0,1);
glutSolidTeapot(0.1);
glPopMatrix();
glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y)
{
if(key=='a') rot++;
printf("%f\n",rot);
glutPostRedisplay();
}
int main()
{
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("text");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;

}
圖片:

旋轉後(按a鍵):

轉轉長方形:


#include<GL/glut.h>
#include<stdio.h>
float rot=0;

void body()
{
glBegin(GL_POLYGON);
glVertex2f(-0.3,-0.1);
glVertex2f(0.3,-0.1);
glVertex2f(0.3,0.1);
glVertex2f(-0.3,0.1);
glEnd();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glColor3f(1,1,1);
glutSolidTeapot(0.3);
glRotatef(rot,0,0,1);
glTranslatef(0.3,0.1,0);
glColor3f(1,0,0);
body();
glPopMatrix();
glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y)
{
if(key=='a') rot++;
printf("%f\n",rot);
glutPostRedisplay();
}
int main()
{
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("text");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;

}
圖:
3.移動方形:
程式碼:

#include<GL/glut.h>
#include<stdio.h>
float rot=0;

void body()
{
glBegin(GL_POLYGON);
glVertex2f(-0.3,-0.1);
glVertex2f(0.3,-0.1);
glVertex2f(0.3,0.1);
glVertex2f(-0.3,0.1);
glEnd();
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glColor3f(1,1,1);
glutSolidTeapot(0.3);
glTranslatef(0.5,0.13,0);//第3步把轉動物體移到右上角 
glRotatef(rot,0,0,1);//第1步有個轉動中心 
glTranslatef(0.3,0.1,0);//第3步把旋轉中心移動 
glColor3f(1,0,0);
body();
glPopMatrix();
glutSwapBuffers();
}
void keyboard(unsigned char key,int x,int y)
{
if(key=='a') rot++;
printf("%f\n",rot);
glutPostRedisplay();
}
int main()
{
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("text");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
圖:
 
作業:
#include <GL/glut.h>
#include <stdio.h>
#include <opencv/highgui.h>
#include <opencv/cv.h>
GLuint gun, gundam;
GLuint leftlower;

float rot=0;//角度初始為0
void drawLeftLower()//盾牌
{
    glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D,leftlower);
    glBegin(GL_POLYGON);
  glTexCoord2f(0,0);glVertex3f(-0.9,-0.15,0);//貼圖座標
  glTexCoord2f(1,0);glVertex3f(0.9,-0.15,0);//貼圖座標
  glTexCoord2f(1,1);glVertex3f(0.9,0.15,0);//貼圖座標
  glTexCoord2f(0,1);glVertex3f(-0.9,0.15,0);//貼圖座標
 glEnd();        
}
void drawGun()//槍
{
    glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D,gun);
    glBegin(GL_POLYGON);
  glTexCoord2f(0,0);glVertex3f(-1,-0.3,0);//貼圖座標
  glTexCoord2f(1,0);glVertex3f(1,-0.3,0);//貼圖座標
  glTexCoord2f(1,1);glVertex3f(1,0.3,0);//貼圖座標
  glTexCoord2f(0,1);glVertex3f(-1,0.3,0);//貼圖座標
 glEnd();       
}
void drawGundam()//鋼彈模型
{
    glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D,gundam);
    glBegin(GL_POLYGON);
  glTexCoord2f(0,0);glVertex3f(-2,-1,0);//貼圖座標
  glTexCoord2f(1,0);glVertex3f(1,-1,0);//貼圖座標
  glTexCoord2f(1,1);glVertex3f(1,1,0);//貼圖座標
  glTexCoord2f(0,1);glVertex3f(-2,1,0);//貼圖座標
 glEnd();       
}
void myTexture(GLuint &id, char * filename)
{
//Texture image file by OpenCV
 IplImage * img = cvLoadImage(filename);
 cvCvtColor(img,img,CV_BGR2RGB);
//Texture image file by OpenGL
 glEnable(GL_TEXTURE_2D);
 glGenTextures(1,&id);
 glBindTexture(GL_TEXTURE_2D,id);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_LINEAR);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_LINEAR);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,img->width,img->height,0,GL_RGB,GL_UNSIGNED_BYTE,img->imageData);
//Texture End
}
void display()
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glPushMatrix();
  drawGundam();
      glPushMatrix();//備份matrix
  
                glTranslatef(-1, 0.2,0);//移動旋轉角度位置
       glRotatef(rot, 0,0,1);//旋轉角度
       glTranslatef(0, 0.2, 0 );//移動圖形
                drawGun();//槍
            glPopMatrix();//還原//matrix
   glPushMatrix();//備份matrix
    glTranslatef(0,0,0);//移動旋轉角度位置
    glRotatef(rot, 0,0,1);//旋轉角度
    glTranslatef(0,0,0);//移動圖形
    drawLeftLower();//盾牌
 
           glPopMatrix();//還原//matrix
 glPopMatrix();
 glutSwapBuffers();
}
void keyboard(unsigned char key, int x, int y)
{
 if(key=='a') rot++;//按a逆時針走
 else if(key=='A') rot--;//按A順時針走

 printf("%f\n", rot);
 glutPostRedisplay();
}
int main()
{
 glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
 glutCreateWindow("00161081");
 myTexture(gun,"gun.png");
 myTexture(gundam,"gundam.png");
 myTexture(leftlower, "sh.png");

 glutDisplayFunc(display);
 glutKeyboardFunc(keyboard);

 glutMainLoop();
 return 0;
}
damo:
 



沒有留言:

張貼留言