高级计算机图形学

Similar documents
高级计算机图形学

高级计算机图形学

高级计算机图形学

高级计算机图形学

C 1

CC213

C/C++ - 文件IO

FY.DOC

新版 明解C++入門編

untitled

untitled

Microsoft Word - 实用案例.doc

C++ 程式設計

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

untitled

PowerPoint Presentation

epub 33-8

C/C++语言 - C/C++数据

新・明解C言語入門編『索引』

Photoshop CS6 艺术设计案例教程 ( 第二版 ) 1.1 Photoshop 的应用领域 Photoshop,,, Photoshop Photoshop 的用途 Photoshop CIS ( ) ( ) 案例展现 ~ 1

untitled

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

chap07.key

Java

全国计算机技术与软件专业技术资格(水平)考试

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

C C

C

全国计算机技术与软件专业技术资格(水平)考试

Microsoft PowerPoint - cg_ch02_01

obj-c_4.key

mvc

7 南 水 北 调 东 线 第 一 期 工 程 三 阳 河 潼 河 宝 应 站 工 程 设 计 江 苏 省 水 利 勘 测 设 计 研 究 院 有 限 公 陆 小 伟, 顾 美 娟, 张 仁 田, 王 钧, 焦 建 华, 张 艺, 朱 正 伟, 杨 俊 敬, 徐 文 俊, 张 娟, 钱 祖 宾, 汤







BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

ebook39-5

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

第3章.doc

Microsoft PowerPoint - OpenGL简介.ppt [兼容模式]

C/C++程序设计 - 字符串与格式化输入/输出

C/C++语言 - 分支结构

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

fvalue = (pdata[y][i] + pdata[y][i + 1]) / 2; pdata[y][nhalfw + i] -= fvalue; fvalue = (pdata[y][nhalfw - 1] + pdata[y][nhalfw - 2]) / 2; pdata[y][nwi

在挑选合适的 SDK 的时候需要注意, 标准 windows 平台应用选择 FBX SDK VS2015,windows 应用商店和全平台通用的不用考虑 windows 全平台通用的应用是 windows10 新推出的功能, 可以打通 windows phone windows s

Microsoft PowerPoint - chapter09.ppt

C语言的应用.PDF

概述

C/C++ - 数组与指针

OpenGL三维图形编程

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

3. 給 定 一 整 數 陣 列 a[0] a[1] a[99] 且 a[k]=3k+1, 以 value=100 呼 叫 以 下 兩 函 式, 假 設 函 式 f1 及 f2 之 while 迴 圈 主 體 分 別 執 行 n1 與 n2 次 (i.e, 計 算 if 敘 述 執 行 次 數, 不

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

山东建筑大学学分制管理规定(试行)

海 南 冯 琳 峰 海 南 省 锅 炉 压 力 容 器 与 特 种 设 备 检 验 所 海 南 省 定 安 县 白 蒙 路 47 号 信 XC 内 蒙 古 冯 磊 赤 峰 市 特 种 设 备 检 验 所 内 蒙 古 赤 峰 市 红 山 区 八 里 铺 油 库 路

C/C++ 语言 - 循环

Microsoft Word - 01.DOC

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft Word - ch04三校.doc

OpenGL Render

untitled

untitled

_汪_文前新ok[3.1].doc

2013 C 1 #include <stdio.h> 2 int main(void) 3 { 4 int cases, i; 5 long long a, b; 6 scanf("%d", &cases); 7 for (i = 0; i < cases; i++) 8 { 9 scanf("%

<4D F736F F D20A6D9A6D7B5E4C159B177AACCB971B8A3BFE9A44AB8CBB86D>

01

c_cpp

概述

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

ebook14-4

nooog

Transcription:

高级计算机图形学 讲授 : 董兰芳研究方向 : 科学计算可视化图形 图像处理模式识别 Telephone:0551-3603484 Email:lfdong@ustc.edu.cn Homepage: http://staff.ustc.edu.cn/~lfdong 中国科学技术大学视觉计算与可视化实验室 1

第三章输入和交互 (2)( 3.8 拾取 3.9 CAD 示例 3.10 建立交互模型 3.11 交互式动画程序 3.12 交互式程序设计 3.13 逻辑运算 2

3.8 拾取 拾取 : 从屏幕显示结果中识别 用户定义的对象 鼠标可以提供位置信息, 根据位置确定对应的对象? 实际操作存在的困难 : Pipeline 图形体系结构是单向的, 很难从二维 屏幕返回到三维世界 离鼠标位置多近可以认为选择了对象? 3

3.8 拾取 OpenGL 绘制模式 GLint glrendermode(glenum mode) -GL_RENDER 正常绘制模式 -GL_FEEDBACK 反馈模式 : -GL_SELECTION 选择模式 GL_SELECTION 模式中使用的函数 : -glselectbuffer() -glinitnames() -glpushname(id) -glpopname() -glloadname(id): 4

3.8 拾取 初始化名称缓冲区 选择模式下的拾取 进入选择模式 绘制场景, 场景中对象有用户指定的标识 重新进入正常绘制模式该操作返回命中次数! 在选择模式中不能进行选取! 在选择模式中改变视图参数 利用 glupickmatrix( ) 检查名称缓冲区的内容 5

3.8 拾取 int main(int argc, char** argv) { glutinit(&argc, argv); glutinitdisplaymode (GLUT_SINGLE GLUT_RGB); glutinitwindowsize (500, 500); glutinitwindowposition (100, 100); glutcreatewindow (argv[0]); init (); glutreshapefunc (reshape); glutdisplayfunc(display); glutmousefunc (mouse); glutkeyboardfunc (keyboard); glutmainloop(); return 0; } 6

3.8 拾取 void mouse(int button, int state, int x, int y) { GLuint selectbuf[size]; GLint hits; GLint viewport[4]; if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { glgetintegerv (GL_VIEWPORT, viewport); glselectbuffer (SIZE, selectbuf); glrendermode(gl_select); glinitnames(); glpushname(0); glmatrixmode (GL_PROJECTION); glpushmatrix (); glloadidentity (); 7

3.8 拾取 /* create 5x5 pixel picking region near cursor location */ glupickmatrix ((GLdouble) x, (GLdouble) (viewport[3] - y), 5.0, 5.0, viewport); gluortho2d (-2.0, 2.0, -2.0, 2.0); drawobjects(gl_select); glmatrixmode (GL_PROJECTION); glpopmatrix (); glflush (); hits = glrendermode (GL_RENDER); processhits (hits, selectbuf); glutpostredisplay(); } } 8

3.8 拾取 void drawobjects(glenum mode) { if(mode == GL_SELECT) glloadname(1); glcolor3f(1.0, 0.0, 0.0); glrectf(-0.5, -0.5, 1.0, 1.0); if(mode == GL_SELECT) glloadname(2); glcolor3f(0.0, 0.0, 1.0); glrectf(-1.0, -1.0, 0.5, 0.5); } 9

3.8 拾取 void processhits (GLint hits, GLuint buffer[]) { unsigned int i, j; GLuint names, *ptr; printf ("hits = %d\n", hits); ptr = (GLuint *) buffer; for (i = 0; i < hits; i++) { /* for each hit */ names = *ptr; ptr+=3; for (j = 0; j < names; j++) { /* for each name */ if(*ptr==1) printf ("red rectangle\n"); else printf ("blue rectangle\n"); ptr++; } printf ( \n ); } } 10

第三章输入和交互 (2)( 3.8 拾取 3.9 CAD 示例 3.10 建立交互模型 3.11 交互式动画程序 3.12 交互式程序设计 3.13 逻辑运算 11

3.9 CAD 示例 CAD 系统的共性 使用多窗口和视口来显示各种信息 建立 删除和保存用户定义的对象的能力 使用菜单 键盘和鼠标的多通道交互操作 示例 :P519 12

3.9 CAD 示例 CAD 系统 新 删 选 移 建 除 择 动 多 多 多 多 边 边 边 边 形 形 形 形 13

3.9 CAD 示例 多边形定义 系统状态 typedef struct polygon { int color; /* color index */ bool used; /* TRUE if polygon exists */ int xmin, xmax, ymin, ymax; /* bounding box */ float xc, yc; /* center of polygon */ int nvertices; /* number of vertices */ int x[max_vertices]; /* vertices */ int y[max_vertices]; } polygon; polygon polygons[max_polygons]; bool picking = FALSE; /* true while picking */ bool moving = FALSE; /* true while moving polygon */ 14

3.9 CAD 示例 int main(int argc, char** argv) { int c_menu; glutinit(&argc,argv); glutinitdisplaymode (GLUT_SINGLE GLUT_RGB); glutinitwindowsize(500, 500); glutcreatewindow("polygon modeler"); glutdisplayfunc(mydisplay); myinit (); // 定义菜单 glutreshapefunc (myreshape); glutmousefunc (mymouse); glutmotionfunc(mymotion); glutmainloop(); 15

定 菜 义 单 3.9 CAD 示例 c_menu = glutcreatemenu(color_menu); glutaddmenuentry("black",0); glutaddmenuentry("red",1); glutaddmenuentry("green",2); glutaddmenuentry("blue",3); glutaddmenuentry("cyan",4); glutaddmenuentry("magenta",5); glutaddmenuentry("yellow",6); glutaddmenuentry("white",7); glutcreatemenu(main_menu); glutaddmenuentry("new polygon", 1); glutaddmenuentry("end polygon", 2); glutaddmenuentry("delete polygon", 3); glutaddmenuentry("move polygon", 4); glutaddmenuentry("quit",5); glutaddsubmenu("colors", c_menu); glutattachmenu(glut_middle_button); 颜色设置菜单回调函数 主菜单回调函数 16

3.9 CAD 示例 菜单回调函数 void main_menu(int index) {inti; switch(index) 创建新多边形 { case(1): { moving = FALSE; for(i=0; i<max_polygons; i++) if(polygons[i].used == FALSE) break; if(i == MAX_POLYGONS) { printf( exceeded maximum number of polygons\n ); exit(0); } polygons[i].color = present_color; polygons[i].used = TRUE; polygons[i].nvertices = 0; in_polygon = i; picking = FALSE; break; } 17

3.9 CAD 示例 case(2): { moving = FALSE; if(in_polygon>=0) 结束新多边形的创建 { polygons[in_polygon].xmax = polygons[in_polygon].xmin = polygons[in_polygon].x[0]; polygons[in_polygon].ymax = polygons[in_polygon].ymin = polygons[in_polygon].y[0]; polygons[in_polygon].xc= polygons[in_polygon].xc/polygons[in_polygon].nvertices; polygons[in_polygon].yc= polygons[in_polygon].yc/polygons[in_polygon].nvertices; } in_polygon = -1; glutpostredisplay(); break; } 18

3.9 CAD 示例 case(3): { picking = TRUE; moving = FALSE; break; } case(4): { moving = TRUE; break; } case(5): /* exit */ { exit(0); break; } } } 设置系统状态为拾取多边形 设置系统状态为移动多边形 19

增加新多边形 3.9 CAD 示例 鼠标回调函数 void mymouse(int btn, int state, int x, int y) {inti,j; y = wh-y; if(btn==glut_left_button && state==glut_down &&!picking&&!moving) { moving = FALSE; if(in_polygon>=0) { if(polygons[in_polygon].nvertices == MAX_VERTICES) { printf("exceeds maximum number vertices\n"); exit(0); } i = polygons[in_polygon].nvertices; 存储新多 polygons[in_polygon].x[i] = x; 边形的顶 polygons[in_polygon].y[i] = y; 点坐标 polygons[in_polygon].nvertices++; } } 20

3.9 CAD 示例 删除多边形 if(btn==glut_left_button && state==glut_down &&picking&&!moving) { /* delete polygon */ picking = FALSE; moving = FALSE; j = pick_polygon(x,y); if(j >= 0) { polygons[j].used = FALSE; in_polygon = -1; glutpostredisplay(); } } } 21

3.9 CAD 示例 void mymotion(int x, int y) 鼠标移动的回 { float dx, dy; 调函数 int i,j; if(moving) 判断被拾 { y = wh -y; 取的多边 j = pick_polygon(x, y); 形 if(j<0) { printf( not in a polygon\n ); return; } dx = x - polygons[j].xc; dy = y - polygons[j].yc; 移动拾取 for(i = 0; i< polygons[j].nvertices; i++) 的多边形 { polygons[j].x[i] += dx; polygons[j].y[i] += dy; } polygons[j].xc += dx; polygons[j].yc += dy; if(dx>0) polygons[j].xmax += dx; else polygons[j].xmin += dx; if(dy>0) polygons[j].ymax += dy; else polygons[j].ymin += dy; glutpostredisplay(); } } 22

3.9 CAD 示例 被拾取的多边形的索引 int pick_polygon(int x, int y) 号判断 { int i; for(i=0; i<max_polygons; i++) { if(polygons[i].used) 点在某多边形 if((x>=polygons[i].xmin)&&(x<=polygons[i].xmax)&& 包围盒内部 (y>=polygons[i].ymin)&&(y<polygons[i].ymax)) { in_polygon = i; moving = TRUE; return(i); } printf("not in a polygon\n"); return(-1); } } 23

第三章输入和交互 (2)( 3.8 拾取 3.9 CAD 示例 3.10 建立交互模型 3.11 交互式动画程序 3.12 交互式程序设计 3.13 逻辑运算 24

3.10 建立交互模型 void square(float x0,float y0) { glbegin(gl_quad); glvertex2f(x0-1.0,y0-1.0); glvertex2f(x0+1.0,y0-1.0); (x0,y0) glvertex2f(x0+1.0,y0+1.0); glvertex2f(x0-1.0,y0-1.0); glend(); } typedef struct object { int type; float x,y; float color[3]; } object; object tabie[100]; 25

3.10 建立交互模型 建立汽车的模型 创建车厢的列表 创建车轮的列表 glnewlist( CAR, GL_COMPILE ); glcalllist( CHASSIS ); gltranslatef( ); glcalllist( WHEEL ); gltranslatef( ); glcalllist( WHEEL ); glendlist(); 26

第三章输入和交互 (2)( 3.8 拾取 3.9 CAD 示例 3.10 建立交互模型 3.11 交互式动画程序 3.12 交互式程序设计 3.13 逻辑运算 27

3.11 交互式动画程序 x=cosθ y=sinθ 以圆心为中心的正方形 void display() { glclear(gl_color_buffer_bit); glbegin() thetar=theta/(3.14159/180); glvertex2f(cos(thetar),sin(thetar)); glvertex2f(-sin(thetar),cos(thetar)); glvertex2f(-cos(thetar),-sin(thetar)); glvertex2f(sin(thetar),-cos(thetar)); glend(); } 28

3.11 交互式动画程序 空闲回调函数 glutidlefunc(idle); void idle() { Theta+=2; If (theta>=360.0) theta-=360.0; glutpostredisplay(); } void mouse(int button,int state,int x,int y) { If (button=glut_left_button&& state==glut_down) glutidlefunc(idle); If (button=glut_middle_button&& state==glut_down) glutidlefunc(null); } 29

3.11 交互式动画程序 当通过显示回调函数重新绘制显示结果时, 通常会使用 glclear() 清除整个窗口, 然后再绘制已发生了变化的显示结果 单缓冲区存在的问题 帧缓冲区中的信息在显示器上的显示结果出现了错位, 图形系统可以同时向显存中写入内容和从中读出内容, 从而我们会看到部分非自然信号 30

3.11 交互式动画程序 双缓冲区 : 应用两个颜色缓冲区 - 前缓冲区 : 显示它的内容, 但不向它写入内容 - 后缓冲区 : 写入内容, 不显示 双缓冲区使用过程 : - 在 main() 中请求使用双缓存 glutinitdisplaymode(glut_rgb GLUT_DOUBLE) - 在显示回调函数结束之前, 交换两个缓冲区 void display() { glclear(gl_color_buffer_bit ); // 绘制图形 glutswapbuffers();} 31

3.11 交互式动画程序 使用定时器 : timer_fun c 的参数 gluttimerfunc(int delay, void(*timer_func)(int), int value) int n=60; gluttimerfunc(100,mytimer,n); mytimer (int v) { glutpostredisplay(); gluttimerfunc(1000/n,mytimer,v); } 32

第三章输入和交互 (2)( 3.8 拾取 3.9 CAD 示例 3.10 建立交互模型 3.11 交互式动画程序 3.12 交互式程序设计 3.13 逻辑运算 33

3.12 交互式程序设计 性能良好的交互式程序的特点 平滑的显示效果 能够使用各种交互设备控制屏幕上图像显示 能够使用各种方法输入信息和显示信息 界面友好, 易于使用和学习 对用户的操作具有反馈能力 对用户的误操作具有容忍性 设计既要考虑人的视觉特性也要考虑人的运动神经特性 34

3.12 交互式程序设计 工具包 构件和帧缓存 35

第三章输入和交互 (2)( 3.8 拾取 3.9 CAD 示例 3.10 建立交互模型 3.11 交互式动画程序 3.12 交互式程序设计 3.13 逻辑运算 36

3.13 逻辑运算 缓存都是离散的内存块, 由其空间分辨率 n*m 和每个像 素的位数 ( 深度 )k 确定 把缓冲区 k 个平面中的任一个称为位平面 (bitplane), 空间中特定位置处的 k 个元素构成一个像素 (pixel), 因此一个像素既可以是一个字节, 也可以是一个整数, 甚至是一个浮点数, 具体与所用的缓存以及信息的存放格式有关 37

3.13 逻辑运算 应用程序通过 OpenGL 函数把信息传送到帧缓存, 或者从帧缓存中获取信息 当应用程序读写像素时, 数据不仅要在内存与 图形卡里的帧缓存之间传输, 而且还要重新调整这些数据的格式, 使之与帧缓存匹配 38

3.13 逻辑运算 颜色缓存内容要被输出到显示设备上 在双缓存中, 颜色缓存由两个缓存组成, 分别用于读与写, 称为前缓存与后缓存 颜色缓存 k 确定可以表示的颜色的多少, 通常在 RGB 模式中为 24 位, 在 RGBA 模式中为 32 位 深度缓冲区的 k 值确定深度的分辨率, 通常是 32 位, 这样与浮点数或整数的精度匹配 39

3.13 逻辑运算 写入操作的模型和读写内存不同, 位块传送操作有 多种写入方式, 在写入源像素前可读出目标缓存中的像素 像素逻辑运算源像素 : s 目标像素 : d 写入的目标像素 : d d = f(s, d) 其中 s = 0 或 1, d = 0 or 1 40

3.13 逻辑运算 源像素与目标像素逐位结合在一起, 有 16 种 可选的函数 ( 表格中的每列为一种 ) XOR 叠加位平面 41

第三章输入和交互 (2)( 3.8 拾取 3.9 CAD 示例 3.10 建立交互模型 3.11 交互式动画程序 3.12 交互式程序设计 3.13 逻辑运算 42

第三章输入和交互 (2)( 在三维 Siepinski 镂垫的系统中增加菜单功能, 可以使用选择的菜单项, 设定拾取的三角形的颜色 43