GLUT 事件處理函式 靜宜大學資管系 蔡奇偉 副教授 2003-2006.

Slides:



Advertisements
Similar presentations
市民三小時免費上網線上教學 入門班.
Advertisements

第二章 计算机的基本组成和工作原理 任课教师:殷凤玲.
C语言程序设计 主讲教师 :张群燕 电话:
第1单元 操作系统概论 第一节 绪论 操作系统定义.
和码汉字字形技术 和码汉字字形学习法 和码汉字字形输入法.
第一章 C语言概述 计算机公共教学部.
项目五——校园一卡通程序功能模块化设计 5-1项目显示查询和退出函数设计.
第3章 Word 2003文字处理 3.1 字处理软件概述 3.2 Word 2003 概述 3.3 Word 2003的基本操作
補充: Input from a text file
基于操作系统的编程复习 张玉宏
学习目标: 1.了解键盘键位及功能 2.能以正确的坐姿和规范的指法录入中英文
OpenGL 的键盘控制 1、特殊键的按键消息 2、普通键的按键消息.
提高打字技能 —— 键盘规范操作.
第一课 计算机基础知识.
五年级信息技术 第四课 比一比,夺金星.
计算机文化基础.
第8章 字元與字串處理 8-1 C語言的字元檢查函數 8-2 C語言的字串 8-3 字串的輸入與輸出 8-4 指標與字串
计算机图形学 讲 授:董兰芳 研究方向:科学计算可视化 图形、图像处理 模式识别 中国科学技术大学 视觉计算与可视化实验室
C语言程序设计 第十二章 位运算.
函數 授課:ANT 日期:2009/3/24.
OpenGL常见问题.
OpenGL (7) 靜宜大學資工系 蔡奇偉 副教授
C 程式設計— 指標.
函數 授課:ANT 日期:2011/3/28.
OpenGL使用简介.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
程序设计期末复习 黎金宁
第三章 C++中的C 面向对象程序设计(C++).
今天上課流程表 一 復習 當機急救法 。 二 怪客故事(二) 三 校園打字機— 高級 60秒, 零錯字。
C语言 程序设计基础与试验 刘新国、2012年秋.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
Introduction to OpenGL (2)
第四章 图元的属性 曾智勇 软件学院.
PROGRAM 6 Earth E. Angel.
MS Windows XP 作業系統使用操作簡介.
Page Down 跳頁 高等眾生不一定都住在天堂, 當你內心有愛、很單純、 有同情心,內心很平靜時, 你就是高等眾生了。 由 鄭福平.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第4讲 C++程序控制结构(二) 4.1 循环结构 4.2 转向控制 4.3 综合案例分析.
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
Module - pyopengl 應用於2d,3d圖形繪製.
OpenGL几何变换程序.
Oop8 function函式.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
信息技术试卷评价交流 南京市第五十中 蔡晓红.
第八次上課流程表 *** 大頭貼 1. 請到 大頭貼網站 製作圖檔 2. 將圖片存到桌面(按右鍵---另存圖片)
指標
<编程达人入门课程> 本节内容 字符与字符串 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
本节内容 字符与字符串 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C语言程序设计 李祥 QQ:
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 类型、对象、运算符和表达式.
PROGRAM 7 SQUARE E. Angel.
OpenGL 基础 计算机科学与技术系.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
第四章 函数 丘志杰 电子科技大学 计算机学院 软件学院.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
第1章程序设计和C语言.
第十二章 位运算.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
| | 那天,I Miss U I Miss PPT宝藏网整理发布- ~ 、 Tab Enter
第6章 嵌入式软件开发基础.
PROGRAM 1 Simple E. Angel, Interactive Computer Graphics A Top-Down Approach with OpenGL, Third Edition Addison-Wesley Longman, 2003.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
隨機函數.
Presentation transcript:

GLUT 事件處理函式 靜宜大學資管系 蔡奇偉 副教授 2003-2006

大綱 註冊處理事件的 callback 函式 註冊鍵盤輸入的 callback 註冊滑鼠操作的 callback glutKeyboardFunc glutSpecialFunc 註冊滑鼠操作的 callback glutMouseFunc glutMotionFunc & glutPassiveMotionFunc glutGetModifiers

glutKeyboardFunc void glutKeyboardFunc(void (*func)(unsigned char key, int x, int y)); 此函式註冊處理鍵盤輸入字元鍵的 callback 函式。當使用者在目前視窗中敲入能產生 ASCII 碼的按鍵時,GLUT 就會自動執行你所指定的 callback 函式,並傳入下列三項資料: key: 輸入鍵的 ASCII 碼。 x: 按鍵時滑鼠在視窗位置的 x 座標。 y: 按鍵時滑鼠在視窗位置的 y 座標。

範例 // draw_triangle(), draw_square(), and draw_circle() are // functions to darw a triangle, a square, and a circle, // respectively. void draw_figure (unsigned char key, int x, int y) { switch (key) { case ‘1’: draw_triangle(); break; case ‘2’: draw_square(); break; case ‘3’: draw_circle(); break; } glutPostRedisplay(); // update the window // in main() function // glutKeyboardFunc(draw_figure);

glutSpecialFunc void glutSpecialFunc(void (*func)(int key, int x, int y)); 此函式註冊處理鍵盤輸入功能鍵或方向鍵的 callback 函式。當使用者在目前視窗中敲入功能鍵或方向鍵時,GLUT 就會自動執行你所指定的 callback 函式,並傳入下列三項資料: key: 功能鍵或方向鍵的 GLUT 鍵名(見下一頁)。 x: 按鍵時滑鼠在視窗位置的 x 座標。 y: 按鍵時滑鼠在視窗位置的 y 座標。

GLUT 鍵名 按鍵 GLUT_KEY_F1 F1 功能鍵 GLUT_KEY_F2 F2 功能鍵 GLUT_KEY_F3 F3 功能鍵 GLUT_KEY_F4 F4 功能鍵 GLUT_KEY_F5 F5 功能鍵 GLUT_KEY_F6 F6 功能鍵 GLUT_KEY_F7 F7 功能鍵 GLUT_KEY_F8 F8 功能鍵 GLUT_KEY_F9 F9 功能鍵 GLUT_KEY_F10 F10 功能鍵 GLUT_KEY_F11 F11 功能鍵 GLUT_KEY_F12 F12 功能鍵 GLUT_KEY_LEFT  方向鍵 GLUT_KEY_UP  方向鍵 GLUT_KEY_RIGHT  方向鍵 GLUT_KEY_DOWN  方向鍵 GLUT_KEY_PAGE_UP Page up 方向鍵 GLUT_KEY_PAGE_DOWN Page down 方向鍵 GLUT_KEY_HOME Home 方向鍵 GLUT_KEY_END End 方向鍵 GLUT_KEY_INSERT Insert 鍵

範例 #include <GL/glut.h> int window_width = 250, window_height = 250; float center_x = 0.5, center_y = 0.5, half_width = 0.25; const float inc_amount = 0.01; void display(void) { glClear (GL_COLOR_BUFFER_BIT); /* clear all pixels */ glColor3f (1.0, 1.0, 1.0); glBegin(GL_POLYGON); glVertex3f (center_x - half_width, center_y - half_width, 0.0); glVertex3f (center_x + half_width, center_y - half_width, 0.0); glVertex3f (center_x + half_width, center_y + half_width, 0.0); glVertex3f (center_x - half_width, center_y + half_width, 0.0); glEnd(); glFlush (); }

void handle_special_key (int key, int x, int y) { switch (key) { case GLUT_KEY_LEFT: if (center_x >= half_width) center_x -= inc_amount; break; case GLUT_KEY_RIGHT: if (1.0 - center_x >= half_width) center_x += inc_amount; case GLUT_KEY_UP: if (1.0 - center_y >= half_width) center_y += inc_amount; case GLUT_KEY_DOWN: if (center_y >= half_width) center_y -= inc_amount; } glutPostRedisplay(); // update the window

void handle_key (unsigned char key, int x, int y) { switch (key) { case 's': if (half_width >= 0.1) half_width -= inc_amount; break; case 'l': if (half_width < 0.5) half_width += inc_amount; } glutPostRedisplay(); // update the window

int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (window_width, window_height); glutInitWindowPosition (100, 100); glutCreateWindow ("hello"); init (); glutDisplayFunc(display); glutKeyboardFunc(handle_key); glutSpecialFunc(handle_special_key); glutMainLoop(); return 0; /* ANSI C requires main to return int. */ }

glutMouseFunc void glutMouseFunc(void (*func)(int button, int state, int x, int y)); 此函式註冊處理滑鼠按鈕的 callback。當滑鼠按鈕在目前視窗中按下或放開時, GLUT 就會自動執行你所指定的 callback 函式。 button: 下列三種按鈕值之一 GLUT_LEFT_BUTTON(左按鈕) GLUT_MIDDLE_BUTTON(中按鈕) GLUT_RIGHT_BUTTON(右按鈕) state: 按鈕的狀態 GLUT_UP(放開按鈕) GLUT_DOWN(壓下按鈕) x, y: 按鈕操作發生時滑鼠的視窗座標。

範例 void handle_mouse_buttons (int button, int state, int x, int y) { if (state == GLUT_DOWN) { // 只處理壓下滑鼠按鈕 switch (button) { case GLUT_LEFT_BUTTON: // 處理滑鼠的左按鈕 break; case GLUT_MIDDLE_BUTTON: // 處理滑鼠的中按鈕 case GLUT_RIGHT_BUTTON: // 處理滑鼠的右按鈕 } // in main() function glutMouseFunc(handle_mouse_buttons);

glutMotionFunc & glutPassiveMotionFunc void glutMotionFunc(void (*func)(int x, int y)); 此函式註冊處理滑鼠移動的 callback。按住任何一個滑鼠鈕在目前視窗中移動滑鼠時, GLUT 就會自動執行你所指定的 callback 函式。 void glutPassiveMotionFunc(void (*func)(int x, int y)); 此函式註冊處理滑鼠移動的 callback。當不按任何鈕地在目前視窗中移動滑鼠時, GLUT 就會自動執行你所指定的 callback 函式。 x, y: 移動時滑鼠在視窗位置的座標。

glutGetModifiers int glutGetModifiers(void); GLUT_ACTIVE_SHIFT 若按下 Shift 鍵或 Caps Lock 鍵 GLUT_ACTIVE_CTRL 若按下 Ctrl 鍵 GLUT_ACTIVE_ALT 若按下 Alt 鍵 此函式傳回鍵盤輸入或滑鼠操作時的修飾鍵狀態。在鍵盤 callback 或滑鼠 callback 中,你可以把函式的傳回值和上面的三個常數做 bit AND 運算來測試那一個修飾鍵被按下。譬如: int modifier_key = glutGetModifiers(); if (modifier_key & GLUT_ACTIVE_CTRL) { // 按下 Ctrl 鍵 }

範例 /* * mouseclick.c * This is a simple, introductory OpenGL program. */ #include <GL/glut.h> #include <stdio.h> int window_width = 250, window_height = 250; const int max_point = 100; GLint x_coord[max_point], y_coord[max_point]; int nPoints = 0; inline GLfloat x_convert (int x) { return x/(window_width-1.0); } inline GLfloat y_convert (int y) return 1.0 - y /(window_height-1.0);

void display(void) { glClear (GL_COLOR_BUFFER_BIT); /* clear all pixels */ glColor3f (1.0, 1.0, 1.0); glBegin(GL_POINTS); for (int i = 0; i < nPoints; i++) { glVertex3f (x_convert(x_coord[i]), y_convert(y_coord[i]), 0.0); } glEnd(); glFlush (); void handle_mouseclick (int button, int state, int x, int y) if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { if (nPoints == max_point) nPoints = 0; x_coord[nPoints] = x; y_coord[nPoints] = y; nPoints++; glutPostRedisplay();

int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (window_width, window_height); glutInitWindowPosition (100, 100); glutCreateWindow ("mouseclick"); init (); glutDisplayFunc(display); glutMouseFunc(handle_mouseclick); glutMainLoop(); return 0; /* ANSI C requires main to return int. */ }

範例 /* * hermite.c * This is a simple, introductory OpenGL program. */ #include <GL/glut.h> #include <stdio.h> int window_width = 250, window_height = 250; GLfloat x_coord[3], y_coord[3]; int nPoints = 0; inline GLfloat x_convert (int x) { return x/(float)(window_width-1); } inline GLfloat y_convert (int y) return 1.0 - y /(float)(window_height-1);

void HermiteCurve(int n) { float t, dt, t2, t3, f1, f2, f3, f4; dt = 1.0/n; // t runs from 0 to 1. GLfloat PT0_x = x_coord[1] - x_coord[0]; GLfloat PT0_y = y_coord[1] - y_coord[0]; GLfloat PT1_x = x_coord[2] - x_coord[1]; GLfloat PT1_y = y_coord[2] - y_coord[1]; glBegin(GL_LINE_STRIP); for (t = 0.0; t <= 1.0; t += dt) { t2 = t * t; t3 = t2 * t; // t3 = t * t * t f1 = 2.0*t3 - 3.0*t2 + 1.0; f2 = -2.0*t3 + 3.0*t2; f3 = t3 - 2.0*t2 + t; f4 = t3 - t2; glVertex2f( f1*x_coord[0] + f2*x_coord[2] + f3*PT0_x + f4*PT1_x, f1*y_coord[0] + f2*y_coord[2] + f3*PT0_y + f4*PT1_y ); } glEnd();

void display(void) { glClear (GL_COLOR_BUFFER_BIT); /* clear all pixels */ glColor3f (0.0, 1.0, 0.0); glBegin(GL_LINE_STRIP); for (int i = 0; i < nPoints; i++) { glVertex3f (x_coord[i], y_coord[i], 0.0); } glEnd(); if (nPoints == 3) { glColor3f (1.0, 1.0, 1.0); HermiteCurve(20); glFlush ();

void handle_mouseclick (int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { if (nPoints == 3) nPoints = 0; x_coord[nPoints] = x_convert(x); y_coord[nPoints] = y_convert(y); nPoints++; glutPostRedisplay(); }