close

參考書籍-OpenGL 3D繪圖互動程式設計

 

理論

openGL-(5個座標空間) @ 奇怪的(´・ω・`)增加了的部落格 :: 痞客邦 :: (pixnet.net)  

openGL-(正交投影&透視投影) @ 奇怪的(´・ω・`)增加了的部落格 :: 痞客邦 :: (pixnet.net) 


實作

openGL-視窗建立(詳解) @ 奇怪的(´・ω・`)增加了的部落格 :: 痞客邦 :: (pixnet.net)  下面沒有介紹的這裡有。

openGL-建立茶壺(詳解) @ 奇怪的(´・ω・`)增加了的部落格 :: 痞客邦 :: (pixnet.net)  下面沒有介紹的這裡有。

openGL-旋轉茶壺(詳解) @ 奇怪的(´・ω・`)增加了的部落格 :: 痞客邦 :: (pixnet.net)

openGL-鍵盤改變旋轉茶壺角度(詳解) @ 奇怪的(´・ω・`)增加了的部落格 :: 痞客邦 :: (pixnet.net)

openGL-特殊鍵更改背景顏色(詳解) @ 奇怪的(´・ω・`)增加了的部落格 :: 痞客邦 :: (pixnet.net)

openGL-滑鼠按下拖移旋轉茶壺(詳解) @ 奇怪的(´・ω・`)增加了的部落格 :: 痞客邦 :: (pixnet.net)

 


一個選單有3個子選單,子選單調整大小、顏色、離開。

imageimageimage

完整程式碼:(紅色的部分為這次所新增的,其他程式碼可以到上面點選超連結,下面有介紹)

#include "GL/freeglut.h"
#include "GL/glut.h"

float backgroundGray=0.0f;
float teapot_size=1.0f;
int MENU_SIZE_1=1;
int MENU_SIZE_2=2;
int MENU_EXIT=3;
int MENU_COLOR_3=4;
int MENU_COLOR_4=5;
int MENU_COLOR_5=6;
int MENU_COLOR_6=7;
int COLOR_R=200;
int COLOR_G=120;
int COLOR_B=0;


void My_Display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0, 2.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    glColor3ub(COLOR_R,COLOR_G ,COLOR_B);
    glutWireTeapot(teapot_size);
    glutSwapBuffers();    
    
}

void My_Reshape(int  width, int  height)
{
    int aspect = width * 1.0f / height;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0,0,width, height);
    gluPerspective(60.0f, aspect, 0.1f, 10.0f);
}

void My_Menu(int id)
{
    if(id == MENU_SIZE_1)
    {
        teapot_size+=1.0f;
    }else if(id == MENU_SIZE_2)
    {
        teapot_size-=1.0f;
    }else if(id == MENU_COLOR_3)
    {
        COLOR_R=255;
        COLOR_G=0;
        COLOR_B=0;
    }else if(id == MENU_COLOR_4)
    {
        COLOR_R=0;
        COLOR_G=0;
        COLOR_B=255;
    }else if(id == MENU_COLOR_5)
    {
        COLOR_R=0;
        COLOR_G=255;
        COLOR_B=0;
    }else if(id == MENU_COLOR_6)
    {
        COLOR_R=255;
        COLOR_G=255;
        COLOR_B=255;
    }else if(id == MENU_EXIT)
    {
        exit(0);
    }
    glutWireTeapot(teapot_size);
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
        
    glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(600,600);
    glutCreateWindow("glut");
    glClearColor(backgroundGray, backgroundGray,backgroundGray,1.0f);
    
    
    int menu_main = glutCreateMenu(My_Menu);
    int menu_entry = glutCreateMenu(My_Menu);
    int menu_entry_2 = glutCreateMenu(My_Menu);
    glutSetMenu(menu_main);
    glutAddSubMenu("Teapot size", menu_entry);
    glutAddSubMenu("Teapot color", menu_entry_2);
    glutAddMenuEntry("Exit", MENU_EXIT);

    glutSetMenu(menu_entry);
    glutAddMenuEntry("+1.0", MENU_SIZE_1);
    glutAddMenuEntry("-1.0", MENU_SIZE_2);
    
    glutSetMenu(menu_entry_2);
    glutAddMenuEntry("Red", MENU_COLOR_3);
    glutAddMenuEntry("Blue", MENU_COLOR_4);
    glutAddMenuEntry("Green", MENU_COLOR_5);
    glutAddMenuEntry("White", MENU_COLOR_6);
    
    glutSetMenu(menu_main);
    glutAttachMenu(GLUT_RIGHT_BUTTON);
    glutReshapeFunc(My_Reshape);
    glutDisplayFunc(My_Display);
    glutMainLoop();
    return 0;    
}

 


float backgroundGray=0.0f; //背景顏色
float teapot_size=1.0f;    //茶壺大小
int MENU_SIZE_1=1;         //選單ID
int MENU_SIZE_2=2;         //選單ID
int MENU_EXIT=3;           //選單ID
int MENU_COLOR_3=4;        //選單ID
int MENU_COLOR_4=5;        //選單ID
int MENU_COLOR_5=6;        //選單ID
int MENU_COLOR_6=7;        //選單ID
int COLOR_R=200;           //預設茶壺顏色
int COLOR_G=120;           //預設茶壺顏色
int COLOR_B=0;             //預設茶壺顏色

 

int menu_main = glutCreateMenu(My_Menu);
int menu_entry = glutCreateMenu(My_Menu);
int menu_entry_2 = glutCreateMenu(My_Menu);

宣告子選單主選單、大小、顏色,裡面的參數是函式。


glutSetMenu(menu_main);
glutAddSubMenu("Teapot size", menu_entry);
glutAddSubMenu("Teapot color", menu_entry_2);
glutAddMenuEntry("Exit", MENU_EXIT);

設置主選單有大小、顏色、離開。


int MENU_SIZE_1=1;
int MENU_SIZE_2=2;

glutSetMenu(menu_entry);    
glutAddMenuEntry("+1.0", MENU_SIZE_1);
glutAddMenuEntry("-1.0", MENU_SIZE_2);

子選單Teapot size,裡面有兩個小選單名稱為+1.0、-1.0,編號為MENU_SIZE_1、MENU_SIZE_2。


int MENU_COLOR_3=4;
int MENU_COLOR_4=5;
int MENU_COLOR_5=6;
int MENU_COLOR_6=7;

glutSetMenu(menu_entry_2);
glutAddMenuEntry("Red", MENU_COLOR_3);
glutAddMenuEntry("Blue", MENU_COLOR_4);
glutAddMenuEntry("Green", MENU_COLOR_5);
glutAddMenuEntry("White", MENU_COLOR_6);

子選單Teapot color,裡面有四個小選單名稱為Red、Blue、Green、White,編號為MENU_COLOR_3~MENU_COLOR_6。


glutSetMenu(menu_main);
glutAttachMenu(GLUT_RIGHT_BUTTON);

設置選單,按下滑鼠右鍵顯示。


void My_Menu(int id)
{
    if(id == MENU_SIZE_1)
    {
        teapot_size+=1.0f;
    }else if(id == MENU_SIZE_2)
    {
        teapot_size-=1.0f;
    }else if(id == MENU_COLOR_3)
    {
        COLOR_R=255;
        COLOR_G=0;
        COLOR_B=0;
    }else if(id == MENU_COLOR_4)
    {
        COLOR_R=0;
        COLOR_G=0;
        COLOR_B=255;
    }else if(id == MENU_COLOR_5)
    {
        COLOR_R=0;
        COLOR_G=255;
        COLOR_B=0;
    }else if(id == MENU_COLOR_6)
    {
        COLOR_R=255;
        COLOR_G=255;
        COLOR_B=255;
    }else if(id == MENU_EXIT)
    {
        exit(0);
    }
    glutWireTeapot(teapot_size);
}

點擊選單就會觸發的函式。

 

arrow
arrow
    創作者介紹
    創作者 讀書小天地 的頭像
    讀書小天地

    書籍分享天地

    讀書小天地 發表在 痞客邦 留言(0) 人氣()