參考書籍-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個子選單,子選單調整大小、顏色、離開。
完整程式碼:(紅色的部分為這次所新增的,其他程式碼可以到上面點選超連結,下面有介紹)
#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);
}
點擊選單就會觸發的函式。