คอมพิวเตอร์กราฟิกส์ใช้ OpenGL

Download Report

Transcript คอมพิวเตอร์กราฟิกส์ใช้ OpenGL

คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL
(Computer Graphics using OpenGL)
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
1
บทที่ 11
คีย์บอร์ ด, เมาส์ และเมนู
(Keyboard, Mouse & Menu)
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
2
คีย์บอร์ ด, เมาส์ และเมนู (Keyboard, Mouse & Menu)
ปกติเราสร้ างโปรแกรมโดยใช้ ข้อมูลผ่านทางคาสัง่
คงเป็ นประโยชน์ไม่น้อยถ้ าเราสามารถใส่ข้อมูลผ่านทางอุปกรณ์หรื อ
หนทางอื่นในขณะที่โปรแกรมกาลังทางานอยู่
ยกตัวอย่างเช่น เราอาจจะต้ องการเปลี่ยนมุมมอง หรื อตาแหน่งของ
ออปเจ็กต์ที่แสดงอยูบ่ นจอภาพในขณะนัน้
การทางานเมื่อได้ รับข้ อมูลจากผู้ใช้ งานเป็ นการอินเทอร์ เฟซระหว่าง
โปรแกรมกับผู้ใช้ ที่เรี ยกว่า “อินเทอร์ เอ็กทีพ” (Interactive)
มีข้อมูลหลายประเภทที่ถกู นามาใช้ ในโปรแกรมทางกราฟิ ก และก็มี
วิธีการนาข้ อมูลเข้ าสูโ่ ปรแกรมได้ หลายวิธี
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
3
คีย์บอร์ ด, เมาส์ และเมนู (Keyboard, Mouse & Menu)
ปั จจุบนั การอินเทอร์ เฟซกับระบบก็ได้ ขยายเข้ ามาอินเทอร์ แอ็กทีพกับ
โปรแกรมทางกราฟิ กมากขึ ้น ไม่วา่ จะเป็ น วินโดว์แสดงผล, ไอคอน,
เมนู และเมาส์ รวมทังอุ
้ ปกรณ์พื ้นฐานอย่างคีย์บอร์ ด และอุปกรณ์เพื่อ
ควบคุมเคอร์ เซอร์ อีกมากมาย
ถึงแม้ ในไลบรารี พื ้นฐานของ OpenGL ไม่ได้ เตรี ยมเครื่ องมืออานวย
ความสะดวกในการอินเทอร์ เฟซกับผู้ใช้
มีเพียงเครื่ องมือในการจัดการกับกราฟิ กเท่านัน้
แต่ในไลบรารี ของ GLUT ได้ เตรี ยมเครื่ องมือในการอินเทอร์ เฟซกับผู้ใช้
แบบกราฟิ กไว้ หลายอย่าง โดยเฉพาะฟั งก์ชนั glutMainLoop() ที่ช่วย
ดักอีเวนต์ตา่ ง ๆ ที่มีเข้ ามา ใน 3 หนทางคือ
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
4
คีย์บอร์ ด, เมาส์ และเมนู (Keyboard, Mouse & Menu)
อีเวนต์ของคีย์บอร์ ดที่ถกู กระตุ้นเมื่อผู้ใช้ กดปุ่ มบนคีย์บอร์ ดที่
เป็ นคีย์ ASCII หรื อคีย์ที่ใช้ ควบคุม หรื อเคลื่อนย้ ายเคอร์ เซอร์
อีเวนต์ของเมาส์ที่ถกู กระตุ้นเมื่อมีการกดปุ่ มบนเมาส์ หรื อเมื่อมี
การเปลี่ยนตาแหน่งของเมาส์
อีเวนต์ของเมนูที่ถกู กระตุ้นเมื่อแอปพลิเคชันมีการกาหนด
ฟั งก์ชนั การทางานให้ กบั เมนูเพื่อให้ ทางานร่วมกับเมาส์
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
5
ฟั งก์ ชันเรียกกลับ (Callback function)
GLUT จัดการกับอีเวนต์ที่เข้ ามาด้ วยฟั งก์ชนั เรี ยกกลับ (Callback
function)
ถ้ าคุณต้ องการจัดการกับอีเวนต์เช่น การกดคีย์บนคีย์บอร์ ด หรื อการ
คลิก หรื อย้ ายเมาส์ คุณสามารถสร้ างฟั งก์ชนั เพื่อให้ ทางานตอบสนอง
อีเวนต์นนได้
ั ้ โดยตรงตามต้ องการ
หรื อหลังจากนันคุ
้ ณลงทะเบียนฟั งก์ชนั นันโดยการส่
้
งผ่านชื่อตัวแปร
เป็ นอาร์ กิวเมนต์ไปยังฟั งก์ชนั ที่มีชื่อในลักษณะ glutXXXFunc() โดย
XXX บ่งบอกถึงฟั งก์ชนั เรี ยกกลับที่คณ
ุ ลงทะเบียนไว้
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
6
ฟั งก์ ชันเรียกกลับ (Callback function)
ตอนนี ้สมมุตวิ า่ โปรแกรมของเราใช้ ฟังก์ชนั เพื่อแสดงภาพกราฟิ ก
ดังตัวอย่างข้ างล่างนี ้ ในฟั งก์ชนั นี ้จะสร้ างเมทริกซ์การมองเพื่อหมุนทัง้
3 แกน โดยใช้ ตวั แปร 3 ตัวคือ x_angle, y_angle และ z_angle ที่เป็ น
เลขทศนิยมที่กาหนดโดยฟั งก์ชนั เรี ยกกลับ
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
7
ฟั งก์ ชันเรียกกลับ (Callback function)
void display (void)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(x_angle, 1.0, 0.0, 0.0);
glRotatef(y_angle, 0.0, 1.0, 0.0);
glRotatef(z_angle, 0.0, 0.0, 1.0);
glutWireCube(1.0);
glutSwapBuffers();
}
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
8
ฟั งก์ ชันเรียกกลับ (Callback function)
ตัวอย่างโปรแกรมใช้ เพื่อหมุนรูปลูกบาศก์ซงึ่ เราจะต้ องเพิม่ ฟั งก์ชนั
เรี ยกกลับเพื่อให้ ทางานตามต้ องการต่อไป
OpenGL เรี ยกว่าโปรแกรมที่ไม่ได้ ทาอะไรว่า idle function ซึง่ แอป
พลิเคชันทัว่ ไปของ idle function คือทาให้ มีการเคลื่อนไหวต่อไป
โปรแกรมตามตัวอย่างที่ผา่ นมาถ้ าเป็ นการแสดงการหมุนของลูกบาศก์
รอบแกน x ต่อไปนี ้คือขันตอนการเขี
้
ยนโปรแกรม
1. โปรแกรมหลักต้ องลงทะเบียน idle function คาสัง่ ต่อไปนี ้จะ
เป็ นการเรี ยก idle function ที่ชื่อ spin()
glutIdleFunc(spin);
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
9
ฟั งก์ ชันเรียกกลับ (Callback function)
2. ต้ องประกาศ idle function ฟั งก์ชนั นี ้ไม่ต้องมีอาร์ กิวเมนต์และ
ไม่ต้องส่งผลลัพธ์กลับ ฟั งก์ชนั ต่อไปนี ้จะเป็ นการเพิ่มค่าตัวแปร
โกลบอลให้ เพิ่มมุม และสัง่ ให้ แสดงผลอีกครัง้
void spin (void)
{
x_angle += 1.0;
glutPostRedisplay();
}
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
10
ฟั งก์ ชันเรียกกลับ (Callback function)
3. หลังจากเปลี่ยนแปลงค่ามุมแล้ ว ฟั งก์ชนั spin() ไม่ต้องเรี ยก
ฟั งก์ชนั display() โดยตรง แต่จะเรี ยกฟั งก์ชนั
glutPostRedisplay() แทน ซึง่ ทาให้ ฟังก์ชนั glutMainLoop()
แสดงผลอีกครัง้ หนึง่
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
11
ฟั งก์ ชันเรียกกลับ (Callback function)
ex11_01.cpp แสดงการ
เรี ยกใช้ ฟังก์ชนั เรี ยกกลับ
เพื่อสัง่ ให้ หมุนลูกบาศก์
ตามแนวแกน x
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
12
ฟั งก์ ชันของคีย์บอร์ ด
ในการอินเทอร์ เฟซกับผู้ใช้ งานโปรแกรมทางกราฟิ ก คุณจะต้ องรวม
ไฟล์ที่เป็ นเฮดเดอร์ ไฟล์ไว้ ที่ตอนต้ นของโปรแกรมด้ วยคาสัง่ #include
<stdio.h>
หลังจากนัน้ ถ้ ามีการลงทะเบียนฟั งก์ชนั เรี ยกกลับไว้ แล้ วก็สามารถ
เรี ยกใช้ งานได้ ทนั ทีที่ต้องการเพื่อให้ สามารถโต้ ตอบกับผู้ใช้ ได้ ทนั ทีที่มี
การกดคีย์บนคีย์บอร์ ด
ในไลบรารี ของ GLUT ได้ ลงทะเบียนฟั งก์ชนั เรี ยกกลับเพื่อใช้ งานกับ
คีย์บอร์ ดไว้ แล้ ว 2 ฟั งก์ชนั เพื่อทางานเมื่อกดคีย์ที่เป็ นตัวอักษรบน
คีย์บอร์ ด และเพื่อใช้ งานคีย์พิเศษที่ใช้ ในการควบคุมและเคลื่อนย้ าย
เคอร์ เซอร์
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
13
ฟั งก์ ชันของคีย์บอร์ ด
สาหรับการกดคีย์ ESC (ซึง่ มีรหัส ASCII เป็ น 27) ซึง่ บางครัง้ ผู้ใช้
ต้ องการกดคีย์นี ้เพื่อให้ ออกจากโปรแกรม
เนื่องจากฟั งก์ชนั glutMainLoop() เป็ นฟั งก์ชนั ที่วนรอบการแสงผลไม่
มีวนั จบสิ ้น มีวิธีเดียวที่จะออกจากการวนรอบได้ คือจะต้ องเรี ยก
ฟั งก์ชนั exit ของระบบ
ในทางปฏิบตั กิ ็คือการที่ผ้ ใู ช้ กดคีย์ ESC เพื่อเรี ยกฟั งก์ชนั exit จนทา
ให้ โปรแกรมหยุดการทางาน (จาไว้ วา่ ต้ องมีการเพิ่มไฟล์ stdlib.h ไว้
ตอนต้ นของโปรแกรม) ลักษณะการกาหนดสาหรับคีย์ ESC จะเป็ น
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
14
ฟั งก์ ชันของคีย์บอร์ ด
void keyboard(unsigned char key, int x, int y)
{
if (key == 27)
exit(0);
}
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
15
การใช้ คีย์ตัวอักษรบนคีย์บอร์ ด
เพื่อให้ สามารถโต้ ตอบกับผู้ใช้ เมื่อมีการกดคีย์ตวั อักษรบนคีย์บอร์ ด
คุณต้ องใช้ คาสัง่ ดังนี ้
glutKeyboardFunc (keyboard);
ฟั งก์ชนั นี ้จะต้ องใช้ อาร์ กิวเมนต์ 3 ตัว ซึง่ มีรูปแบบคือ
keyboard (unsigned char key, int x, int y);
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
16
การใช้ คีย์ตัวอักษรบนคีย์บอร์ ด
พารามิเตอร์ key ถูกกาหนดด้ วยค่าตัวอักษร หรื อรหัส ASCII ให้ สมั พันธ์กบั การ
ทางานตามที่ผ้ อู อกแบบโปรแกรมต้ องการ
เมื่อผู้ใช้ กดคีย์ตามที่กาหนด โปรแกรมจะทางานตามที่ได้ ออกแบบไว้
ส่วนพารามิเตอร์ x และ y เป็ นตาแหน่งของเมาส์ในขณะที่มีการกดคีย์บน
คีย์บอร์ ด ตาแหน่งของเมาส์สมั พันธ์กบั มุมบนซ้ ายของจอภาพ ตัวอย่างคาสัง่
void keyboard (unsigned char key, int x, int y)
{
if (key == ’r’) …;
if (key == ’g’) …;
…
}
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
17
การใช้ คีย์ตัวอักษรบนคีย์บอร์ ด
หรื อใช้ ในลักษณะ switch…case
void keyboard (unsigned char key, int x, int y)
{
switch (key)
{
case 'r':
…;
break;
case 'g':
…;
break;
default:
break;
}
}
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
18
การใช้ คีย์ตัวอักษรบนคีย์บอร์ ด
ตัวอย่าง ex11_02.cpp เราจะทดลองให้ ผ้ ใู ช้ เลือกว่าจะแสดงกาน ้าชา
สีอะไร
ถ้ าผู้ใช้ กด r จะเป็ นการแสดงกาน ้าชาสีแดง
ถ้ าผู้ใช้ กด g จะเป็ นการแสดงกาน ้าชาสีเขียว
ถ้ าผู้ใช้ กด b จะเป็ นการแสดงกาน ้าชาสีน ้าเงิน
ถ้ าผู้ใช้ กดคีย์ ESC จะเป็ นการปิ ดวินโดว์แสดงผล
สาหรับตัวอย่างของฟั งก์ชนั keyboard ทังหมดอาจจะเป็
้
นดังนี ้
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
19
การใช้ คีย์ตัวอักษรบนคีย์บอร์ ด
void keyboard (unsigned char key, int x, int y)
{
switch (key)
{
case 'r':
glColor3f(1.0, 0.0, 0.0);
glutPostRedisplay();
break;
case 'g':
glColor3f(0.0, 1.0, 0.0);
glutPostRedisplay();
break;
case 'b':
glColor3f(0.0, 0.0, 1.0);
glutPostRedisplay();
break;
case 27:
// or use case ESCAPE when #define ESCAPE 27
exit(0);
break;
default:
break;
}
}
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
20
การใช้ คีย์ตัวอักษรบนคีย์บอร์ ด
ex11_02.cpp เลือกจะ
แสดงกาน ้าชาสีอะไร
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
21
การใช้ คีย์พเิ ศษบนคีย์บอร์ ด
นอกจากคีย์ตวั อักษรบนคีย์บอร์ ดแล้ ว คุณยังสามารถใช้ คีย์พิเศษที่ใช้
ในการควบคุมและเคลื่อนย้ ายเคอร์ เซอร์ เช่น F1, F2, HOME,
DELETE, INSERT, PageUp หรื อ  เพื่อโต้ ตอบกับผู้ใช้ ได้ คีย์
เหล่านี ้ใช้ ได้ ผา่ นฟั งก์ชนั เรี ยกกลับของ GLUT โดยใช้ คาสัง่ ดังนี ้
glutSpecialFunc (specialkey);
 ฟั งก์ชนั นี ้จะต้ องใช้ อาร์ กิวเมนต์ 3 ตัว ซึง่ มีรูปแบบคือ
specialkey (int key, int x, int y);
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
22
การใช้ คีย์พเิ ศษบนคีย์บอร์ ด
พารามิเตอร์ key ถูกกาหนดด้ วยค่าคงที่ตามที่ GLUT กาหนดไว้ เพื่อให้
สัมพันธ์กบั การทางานตามที่ผ้ อู อกแบบโปรแกรมต้ องการ
เมื่อผู้ใช้ กดคีย์ตามที่กาหนด โปรแกรมจะทางานตามที่ได้ ออกแบบไว้
ค่าคงที่ตามที่ GLUT กาหนดไว้ เป็ นดังตาราง 11-1
ตัวอย่างการใช้ คาสัง่ เช่น
void special (int key, int x, int y)
{
if (key == GLUT_KEY_F1) …;
if (key == GLUT_KEY_INSERT) …;
…
}
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
23
การใช้ คีย์พเิ ศษบนคีย์บอร์ ด
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
24
การใช้ คีย์พเิ ศษบนคีย์บอร์ ด
นอกจากค่าคงที่ตามที่กาหนดในไลบรารี ของ GLUT แล้ ว ยังมีคีย์
พิเศษอีก 3 คีย์คือ CONTROL, ALT, SHIFT ที่คณ
ุ สามารถใช้ ฟังก์ชนั
glutGetModifiers () ซึง่ จะให้ คา่ ตรรกศาสตร์ ของ AND ของ
GLUT_ACTIVE_CTRL, GLUT_ACTIVE_ALT หรื อ
GLUT_ACTIVE_SHIFT ตามตัวอย่างการใช้ งาน คือ
If ((glutGetModifiers() GLUT_ACTIVE_CTRL) &&
((key == ‘c’ || (key == ‘C’))) exit (0);
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
25
การใช้ คีย์พเิ ศษบนคีย์บอร์ ด
ตัวอย่าง ex11_03.cpp เป็ นการปรับปรุง ex11_02.cpp โดยมาใช้ คีย์
พิเศษแทนคีย์ที่เป็ นตัวอักษร
ถ้ าผู้ใช้ กดคีย์ F1 กาหนดให้ กาน ้าชาเป็ นสีแดง
ถ้ าผู้ใช้ กดคีย์ INSERT กาหนดให้ กาน ้าชาเป็ นสีเขียว
ถ้ าผู้ใช้ กดคีย์ HOME กาหนดให้ กาน ้าชาเป็ นสีน ้าเงิน
ถ้ าผู้ใช้ กดคีย์ Page Up กาหนดให้ กาน ้าชาเป็ นสีเหลือง
ถ้ าผู้ใช้ กดคีย์  กาหนดให้ กาน ้าชาเป็ นสีมว่ งแดง
ถ้ าผู้ใช้ กดคีย์  กาหนดให้ กาน ้าชาเป็ นสีฟ้า เป็ นต้ น
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
26
การใช้ คีย์พเิ ศษบนคีย์บอร์ ด
ex11_03.cpp ใช้ คีย์พิเศษ
เพื่อเปลี่ยนสีกาน ้าชา
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
27
ฟั งก์ ชันของเมาส์
นอกจากการโต้ ตอบผ่านคีย์บอร์ ดได้ แล้ ว คุณยังสามารถโต้ ตอบกับ
ผู้ใช้ ได้ โดยใช้ การคลิกเมาส์
ปกติเมาส์ทวั่ ไปมี 3 ปุ่ มทาให้ คณ
ุ สามารถคลิกเมาส์เพื่อโต้ ตอบได้ 3
กรณี (GLUT_LET_BUTON, GLUT_MIDDLE_BUTTON,
GLU_RIGH_BUTTON)
การทางานของเมาส์มี 2 สถานะคือคลิกปุ่ ม (GLUT_DOWN) หรื อ
ปล่อยปุ่ ม (GLUT_UP)
ในไลบรารี ของ GLUT ได้ เตรี ยมฟั งก์ชนั เรี ยกกลับพร้ อมให้ คณ
ุ ใช้ งาน
แล้ ว รูปแบบของฟั งก์ชนั คือ
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
28
ฟั งก์ ชันของเมาส์
glutMouseFunc (mouseFcn);
ฟั งก์ชนั นี ้มีพารามิเตอร์ 4 ตัว อยูใ่ นรูปแบบ
void mouseFcn (int button, int action, int x, int y)
ในไลบรารี พารามิเตอร์ ที่กาหนดโดย GLUT เป็ นค่าคงที่ของการกด
เมาส์ทงั ้ 3 ปุ่ มคือ GLUT_LEFT_BUTTON,
GLUT_MIDDLE_BUTTON หรื อ GLUT_RIGHT_BUTTON (ถ้ าเป็ น
เมาส์แบบ 2 ปุ่ มก็จะใช้ เพียงปุ่ มซ้ าย กับปุ่ มขวา เท่านัน)
้
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
29
ฟั งก์ ชันของเมาส์
ส่วนพารามิเตอร์ action จะกาหนดสถานะการทางานของเมาส์คือเมื่อ
คลิกเมาส์จะใช้ GLUT_DOWN หรื อเมื่อปล่อยปุ่ มเมาส์จะใช้ GLUT_UP
ตัวอย่างรูปแบบคาสัง่ อาจจะเป็ น
void mouseFcn (int button, int action, int x, int y)
{
if (button == GLUT_LEFT_BUTTON) && action == GLUT_DOWN)
…;
if (button == GLUT_RIGHT_BUTTON) && action == GLUT_DOWN)
…;
}
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
30
ฟั งก์ ชันของเมาส์
ตัวอย่าง ex11_04.cpp คล้ ายกับตัวอย่าง ex11_02.cpp แต่ใน
ตัวอย่างนี ้จะใช้ การคลิกเมาส์แทน
โดยถ้ าผู้ใช้ คลิกเมาส์ปมซ้
ุ่ ายจะแสดงกาน ้าชาเป็ นสีแดง (ซึง่ ปกติจะใช้
ค่า action == GLUT_DOWN แต่เมื่อปล่อยเมาส์จะกลับเป็ นสีเดิม
ดังนันเพื
้ ่อให้ เกิดผลต่อไปเมื่อปล่อยเมาส์ จาเป็ นต้ องใช้ action ==
GLUT_UP ด้ วย)
ถ้ าผู้ใช้ คลิกเมาส์ปมขวาจะแสดงกาน
ุ่
้าชาเป็ นสีเขียว (เมื่อปล่อยเมาส์
ยังคงสีเขียว)
ถ้ าผู้ใช้ คลิกเมาส์ปมกลางจะแสดงกาน
ุ่
้าชาเป็ นสีน ้าเงิน
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
31
ฟั งก์ ชันของเมาส์
ex11_04.cpp ใช้ การคลิก
เมาส์เพื่อเปลี่ยนสีกาน ้าชา
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
32
ฟั งก์ ชันของเมาส์
ex11_05.cpp ใช้ การคลิก
เมาส์เพื่อพล็อตจุด
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
33
ฟั งก์ ชันของเมาส์
นอกจากการคลิกเมาส์แล้ ว GLUT ยังมีความสามารถในการตรวจจับ
การเคลื่อนที่ของเมาส์ได้ อีกด้ วย
มีการเคลื่อนที่ 2 ประเภทที่ GLUT เตรี ยมฟั งก์ชนั ไว้ คือ การเคลื่อนที่
แบบแอ็กทีพ (active) และแบบพาสซีพ (passive)
โดยที่การเคลื่อนที่แบบแอ็กทีพเกิดขึ ้นเมื่อมีการเคลือ่ นย้ ายเมาส์พร้ อม
กับการกดเมาส์ค้างไว้
ส่วนการเคลื่อนที่แบบพาสซีพเกิดขึ ้นเมื่อมีการเคลื่อนย้ ายเมาส์แต่ไม่มี
การกปุ่ มเมาส์ค้างไว้
เมื่อเมาส์มีการเคลื่อนย้ ายไปจะมีการสร้ างอีเวนต์ตอ่ เฟรมในขณะที่
เมาส์เคลื่อนย้ ายไปนัน้
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
34
ฟั งก์ ชันของเมาส์
สาหรับการเคลื่อนที่แบบแอ็กทีพ GLUT ได้ เตรี ยมฟั งก์ชนั เรี ยกกลับไว้
โดยมีรูปแบบดังนี ้
glutMotionFunc (void (fncDoSomething);
ฟั งก์ชนั นี ้มีพารามิเตอร์ 2 ค่า ตามรูปแบบ ดังนี ้
void fncDoSomething (int x, int y);
โดยที่ (x, y) เป็ นตาแหน่งของเมาส์บนจอแสดงผลอ้ างอิงกับมุมบนซ้ าย
ของจอภาพ เมื่อมีการกดเมาส์ค้างไว้
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
35
ฟั งก์ ชันของเมาส์
สาหรับการเคลื่อนที่แบบพาสซีพ GLUT ได้ เตรี ยมฟั งก์ชนั เรี ยกกลับไว้
โดยมีรูปแบบ ดังนี ้
glutPassiveMotionFunc(void (fncDoSomethingElse);
ฟั งก์ชนั นี ้มีพารามิเตอร์ 2 ค่า ตามรูปแบบ ดังนี ้
void fncDoSomethingElse (int x, int y);
โดยที่ (x, y) เป็ นตาแหน่งของเมาส์บนจอแสดงผลอ้ างอิงกับมุมบนซ้ าย
ของจอภาพ เมื่อมีการกเมาส์ค้างไว้
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
36
ฟั งก์ ชันสร้ างเมนู
นอกจากฟั งก์ชนั ในการติดต่อระหว่างผู้ใช้ กบั โปรแกรมเป็ นคีย์บอร์ ดและ
เมาส์แล้ ว
ยังมีอปุ กรณ์อื่น ๆ และการกาหนดเป็ นเมนูให้ ผ้ ใู ช้ เลือกใช้ งานอีกเป็ น
จานวนมาก
แต่ยงั สามารถสร้ างระบบเมนูเพื่อนาไปใช้ งานในโปรแกรมกราฟิ กต่อไป
GLUT ได้ เตรี ยมฟั งก์ชนั มากมายเพื่อให้ ผ้ อู อกแบบเพิ่มเมนูลงใน
โปรแกรมในลักษณะป๊ อบอัพเมนู (pop-up menu)
ฟั งก์ชนั เหล่านี ้ เราสามารถกาหนดและควบคุมการทางานของเมนูและ
เมนูยอ่ ย
คาสัง่ เมนูของ GLUT จะวางอยูใ่ นโปรซีเดอร์ main เช่นเดียวกับฟั งก์ชนั
อื่น ๆ
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
37
การสร้ างเมนูของ GLUT
การสร้ างป๊ อบอัพเมนูทาได้ ด้วยคาสัง่
glutCreateMenu (menuFnc);
พารามิเตอร์ menuFcn เป็ นชื่อของโปรซีเดอร์ ที่จะทางานเมื่อมีการเลือก
เมนู โปรซีเดอร์ นี ้มีอาร์ กิวเมนต์ 1 ตัวซึง่ เป็ นเลขจานวนเต็มที่สมั พันธ์กบั
ตาแหน่งของออปชันที่เลือก
void menuFcn (int menuItemNumber);
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
38
การสร้ างเมนูของ GLUT
ค่าเลขจานวนเต็มจะส่งผ่านค่าพารามิเตอร์ menuItemNumber ไปให้
menuFcn เพื่อทางานบางอย่าง เมื่อมีการสร้ างเมนูขึ ้นมา เมนูจะ
สัมพันธ์กบั วินโดว์แสดงผลปั จจุบนั
ครัง้ แรกเมื่อเราออกแบบฟั งก์ชนั ของเมนูที่ทางานเมื่อมีการเลือกคาสัง่
ในเมนู
เราต้ องกาหนดออปชันที่อยูใ่ นลิสต์ของเมนู เราทาได้ ด้วยชุดของคาสัง่ ที่
แสดงชื่อและตาแหน่งในแต่ละออปชัน
คาสัง่ เหล่านี ้มีรูปแบบทัว่ ไปคือ
glutAddMenuEntry (charString, menuItemNumber);
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
39
การสร้ างเมนูของ GLUT
พารามิเตอร์ charString กาหนดตัวอักษรที่แสดงบนเมนู
พารามิเตอร์ menuItemNumber บอกตาแหน่งของแต่ละคาสัง่ ในเมนู
คาสัง่ ต่อไปนี ้สร้ างเมนูที่มี 2 ออปชัน
glutCreateMenu (menuFcn);
glutAddMenuEntry (“First Menu Item”, 1);
glutAddMenuEntry (“Second Menu Item”, 2);
เราต้ องกาหนดปุ่ มของเมาส์ที่จะใช้ เมื่อเลือกออปชันของเมนู ด้ วยคาสัง่
glutAttachMenu (button);
พารามิเตอร์ button กาหนดเป็ น GL_LEFT_BUTTON สาหรับเมาส์ปมซ้
ุ่ าย
GLUT_MIDDLE_BUTTON สาหรับปุ่ มปุ่ มกลาง
GLUT_RIGHT_BUTTON สาหรับเมาส์ปมขวา
ุ่
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
40
การสร้ างเมนูของ GLUT
ex11_06.cpp เป็ นโปรแกรม
วาดกาน ้าชา แล้ วเลือกสีกาน ้า
ชาจากการคลิกเมาส์ปมขวา
ุ่
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
41
การสร้ างและการจัดการเมนูหลายเมนูของ GLUT
เมื่อมีการสร้ างเมนู เมนูนี ้จะสัมพันธ์กบั วินโดว์แสดงผลปั จจุบนั
เราสามารถสร้ างเมนูได้ หลายเมนูในวินโดว์แสดงผล 1 วินโดว์นนั ้
เราสามารถสร้ างเมนูที่แตกต่างกันในแต่ละวินโดว์ที่แตกต่างกัน
ในแต่ละเมนูที่สร้ างขึ ้น เมนูจะกาหนดด้ วยตัวกาหนดที่เป็ นเลขจานวน
เต็มที่เริ่มต้ นด้ วยเลข 1
สาหรับการส้ รางเมนูแรก ตัวกาหนดที่เป็ นเลขจานวนเต็มของเมนูจะให้
ค่ากลับด้ วยรูทีน glutCreateMenu
เราสามารถบันทึกค่าด้ วยคาสัง่ เช่น
menuID = glutCreateMenu (menuFcn);
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
42
การสร้ างและการจัดการเมนูหลายเมนูของ GLUT
เมนูที่สร้ างใหม่สดุ จะเป็ นเมนูปัจจุบนั สาหรับวินโดว์แสดงผลปั จจุบนั
การแอ็กทีพเมนูสาหรับวินโดว์แสดงผลปั จจุบนั เราจะใช้ คาสัง่
glutSetMenu (menuID);
หลังจากนัน้ เมนูนี ้จะกลายเป็ นเมนูปัจจุบนั ซึง่ จะป๊ อบอัพในวินโดว์
แสดงผลเมื่อมีการกดปุ่ มเมาส์ที่แจ้ งไว้ ในเมนู หรื อเราสามารถกาจัดเมนู
ได้ ด้วยคาสัง่
glutDestroyMenu (menuID);
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
43
การสร้ างและการจัดการเมนูหลายเมนูของ GLUT
ถ้ าเมนูที่ออกแบบเป็ นเมนูปัจจุบนั ของวินโดว์แสดงผลแล้ ว หลังจากนัน้
วินโดว์นนไม่
ั ้ มีการกาหนดเมนูให้ เป็ นเมนูปัจจุบนั อีกถึงแม้ วา่ เมนูอื่น
อาจจะมีอยูก่ ็ตาม
ฟั งก์ชนั ต่อไปนี ้ใช้ เพื่อให้ ได้ มาซึง่ ตัวกาหนดสาหรับเมนูปัจจุบนั ในวินโดว์
แสดงผลปั จจุบนั
currentMenuID = glutGetMenu () ;
ค่า 0 ถูกส่งกลับออกมาถ้ าไม่มีเมนูในวินโดว์แสดงผล หรื อถ้ าเมนู
ปั จจุบนั ก่อนหน้ านี ้ถูกกาจัดออกไปด้ วยฟั งก์ชนั glutDestroyMenu
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
44
การสร้ างและการจัดการเมนูหลายเมนูของ GLUT
ex11_07.cpp เป็ นการกาหนดเมนูหลายเมนูขึ ้นมา แล้ วให้ ผ้ ใู ช้ กาหนด
ว่าจะใช้ เมนูใดเป็ นเมนูปัจจุบนั ของวินโดว์แสดงผล
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
45
การสร้ างเมนูย่อยของ GLUT
นอกจากเมนูที่เราสามารถเพิ่มลงในโปรแกรมกราฟิ กแล้ ว GLUT ได้ เพิ่ม
ความสามารถของการเขียนโปรแกรมโดยให้ เราเพิ่มเมนูยอ่ ยลงในเมนู
หลักได้ อีกด้ วย
เมนูยอ่ ยมีความสัมพันธ์กบั เมนูโดยสร้ างเมนูยอ่ ยขึ ้นมาก่อนด้ วยคาสัง่
glutCreateMenu ตามด้ วยลิสต์ของออปชันย่อย
หลังจากนันลิ
้ สต์เมนูยอ่ ยให้ เป็ นออปชันเพิ่มเติมในเมนูหลัก
เราสามารถเพิ่มเมนูยอ่ ยให้ กบั ลิสต์ในเมนูหลัก (หรื อเมนูยอ่ ยอื่น) โดย
ใช้ ชดุ ของคาสัง่
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
46
การสร้ างเมนูย่อยของ GLUT
submenuID = glutCreateMenu (submenuFcn);
glutAddMenuEntry (“First Submenu Item”, 1);
:
:
glutCreateMenu (menuFcn);
glutAddMenuEntry (“First Menu Item”, 1);
:
:
glutAddSubMenu (“Submenu option”, submenuID);
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
47
การสร้ างเมนูย่อยของ GLUT
ex11_08.cpp เป็ นการสร้ างเมนูหลักผสมกับเมนูยอ่ ย แสดงรูปทรง
และสีตา่ ง ๆ บนสีแบ็คกราวนด์ที่แตกต่างกัน
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
48
การปรั บแต่ งเมนูของ GLUT
ถ้ าเราต้ องการเปลี่ยนปุ่ มเมาส์ที่ใช้ ในการเลือกออปชันของเมนู ในขัน้
แรกเราต้ องยกเลิกปุ่ มปั จจุบนั ที่ใช้ อยู่ หลังจากนันใช้
้ ปมใหม่
ุ่
การยกเลิก
ปุ่ มเมาส์ที่ใช้ อยูใ่ นเมนูปัจจุบนั ทาได้ ด้วยคาสัง่
glutDetachMenu (mouseButton);
พารามิเตอร์ mouseButton ถูกกาหนดด้ วยค่าคงที่ของ GLUT ที่
กาหนดปุ่ มซ้ าย, กลาง และขวา ที่กาหนให้ กบั เมาส์ก่อนหน้ านี ้
ออปชันภายในเมนูที่มีอยูก่ ็สามารถเปลี่ยนได้ ยกตัวอย่างเช่น เรา
สามารถลบออปชันในเมนูปัจจุบนั ด้ วยฟั งก์ชนั
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
49
การปรั บแต่ งเมนูของ GLUT
glutRemoveMenuItem (itemNumber);
 พารามิเตอร์ itemNumber เป็ นค่าจานวนเต็มของออปชันของเมนูที่จะ
ถูกลบออกไป
 รูทีนอื่น ๆ ของ GLUT ยอมให้ เราปรับปุงชื่อหรื อสถานะของออปชันใน
เมนูที่มีอยู่ ยกตัวอย่าง เช่น เราสามารถใช้ รูทีนเหล่านี ้ในการเปลี่ยนการ
แสงชื่อของออปชันของเมนู หรื อเพื่อเปลี่ยนจานวนออปชัน หรื อเปลี่ยน
ออปชันในเมนูยอ่ ย
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
50
สรุ ปฟั งก์ ชันคีย์บอร์ ด เมาส์ และเมนูของ OpenGL
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
51
สรุ ปฟั งก์ ชันคีย์บอร์ ด เมาส์ และเมนูของ OpenGL
คอมพิวเตอร์ กราฟิ กส์ ใช้ OpenGL (Computer Graphics using OpenGL)
52