2015年3月26日 星期四

02160074_張凱晴 week05

本周重點:自製3D模型、利用mouse旋轉

1.先開啟上周的甜甜圈

2.glBegin(GL_LINE_LOOP); ///將線連成四方形
glBegin(GL_POLYGON);///四方形

3.glBegin(GL_QUAD_STRIP);///將兩面的連接,變成一個四方體
    glVertex3f(0.2,0.2,0.5);
    glVertex3f(0.2,0.2,-0.5);

    glVertex3f(0.2,-0.2,0.5);
    glVertex3f(0.2,-0.2,-0.5);

    glVertex3f(-0.2,-0.2,0.5);
    glVertex3f(-0.2,-0.2,-0.5);

    glVertex3f(-0.2,0.2,0.5);
    glVertex3f(-0.2,0.2,-0.5);

    glVertex3f(0.2,0.2,0.5);
    glVertex3f(0.2,0.2,-0.5);
    glEnd();

4.將四方體加上邊線(圖中白色的線)↓↓↓
側邊的線↓↓↓
glBegin(GL_LINES);
    glVertex3f(0.2,0.2,0.5);
    glVertex3f(0.2,0.2,-0.5);

    glVertex3f(0.2,-0.2,0.5);
    glVertex3f(0.2,-0.2,-0.5);

    glVertex3f(-0.2,-0.2,0.5);
    glVertex3f(-0.2,-0.2,-0.5);

    glVertex3f(-0.2,0.2,0.5);
    glVertex3f(-0.2,0.2,-0.5);

    glVertex3f(0.2,0.2,0.5);
    glVertex3f(0.2,0.2,-0.5);
    glEnd();


5.利用 mouse 旋轉,先在 main 增加glutMotionFunc(motion);///mouse的拖曳
增加 motion 函式,印出座標可知道滑鼠所在位置


如何使四方體不是透明的?
在 main 裡面 glutInit(&argc,argv);下一行增加
 glutInitDisplayMode(GLUT_DEPTH);///讓顯示的Window有3D深度的功能

glEnable(GL_DEPTH_TEST);///開啟GL_DEPTH_TEST深度測試,讓近的面擋住遠的面
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

完整程式↓↓↓
#include <GL/glut.h>
#include <stdio.h>
float angleX=0,angleY=0;
void display()
{
    glEnable(GL_DEPTH_TEST);///開啟GL_DEPTH_TEST深度測試,讓近的面擋住遠的面
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glRotatef(angleX,0,1,0);///左右轉動
    glRotatef(angleY,1,0,0);///上下轉動

    glColor3f(0,0.5,0.8);///畫面
    glBegin(GL_LINE_LOOP);
    glVertex3f(0.2,0.2,0.5);
    glVertex3f(0.2,-0.2,0.5);
    glVertex3f(-0.2,-0.2,0.5);
    glVertex3f(-0.2,0.2,0.5);
    glEnd();

    glBegin(GL_POLYGON);
    glVertex3f(0.2,0.2,-0.5);
    glVertex3f(0.2,-0.2,-0.5);
    glVertex3f(-0.2,-0.2,-0.5);
    glVertex3f(-0.2,0.2,-0.5);
    glEnd();

    glBegin(GL_QUAD_STRIP);
    glVertex3f(0.2,0.2,0.5);
    glVertex3f(0.2,0.2,-0.5);

    glVertex3f(0.2,-0.2,0.5);
    glVertex3f(0.2,-0.2,-0.5);

    glVertex3f(-0.2,-0.2,0.5);
    glVertex3f(-0.2,-0.2,-0.5);

    glVertex3f(-0.2,0.2,0.5);
    glVertex3f(-0.2,0.2,-0.5);

    glVertex3f(0.2,0.2,0.5);
    glVertex3f(0.2,0.2,-0.5);
    glEnd();///以上為畫面的

    glColor3f(1,1,1);///從這邊開始畫線
    glBegin(GL_LINE_LOOP);
    glVertex3f(0.2,0.2,0.5);
    glVertex3f(0.2,-0.2,0.5);
    glVertex3f(-0.2,-0.2,0.5);
    glVertex3f(-0.2,0.2,0.5);
    glEnd();

    glBegin(GL_LINE_LOOP);
    glVertex3f(0.2,0.2,-0.5);
    glVertex3f(0.2,-0.2,-0.5);
    glVertex3f(-0.2,-0.2,-0.5);
    glVertex3f(-0.2,0.2,-0.5);
    glEnd();

    glBegin(GL_LINES);
    glVertex3f(0.2,0.2,0.5);
    glVertex3f(0.2,0.2,-0.5);

    glVertex3f(0.2,-0.2,0.5);
    glVertex3f(0.2,-0.2,-0.5);

    glVertex3f(-0.2,-0.2,0.5);
    glVertex3f(-0.2,-0.2,-0.5);

    glVertex3f(-0.2,0.2,0.5);
    glVertex3f(-0.2,0.2,-0.5);

    glVertex3f(0.2,0.2,0.5);
    glVertex3f(0.2,0.2,-0.5);
    glEnd();

    glPopMatrix();
    glFlush();
    //angle+=0.05;
}
void motion(int x, int y)
{
    printf("%d %d\n", x, y);///印出座標
    angleX=x;
    angleY=y;
}
int main(int argc,char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DEPTH);///讓顯示的Window有3D深度的功能
    glutCreateWindow("02160074");

    glutDisplayFunc(display);
    glutIdleFunc(display);
    ///glutMouseFunc();///mouse的三個按鍵,按下去DOWN/彈起來UP
    glutMotionFunc(motion);///mouse的拖曳

    glutMainLoop();
}

沒有留言:

張貼留言