赞
踩
这里是《Computer Graphics with OpenGL》英文原版第四版的读书笔记,预计每一章写一篇读书笔记。
本篇为第三章,介绍图形学和OpenGL中主要的绘图函数和绘制方式。
我们在绘制场景时,需要描述每个物体的结构及其坐标位置,通常称该功能所需的函数为图形输出图元,或简称为图元。
对物体的描述一般包括其位置、颜色、包围盒(每个坐标轴方向上的最小值和最大值)等
通常以屏幕左上角为原点
有时会有第三维的坐标值,用来表示物体的深度
前面所说的坐标表示方法都是绝对坐标,即相对于原点的坐标。在某些时候也可使用相对坐标来表示物体,即每一点使用其相对于上一点的位移来表示
直接使用上一章中所介绍的函数即可:
glMarixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(xmin, xmax, ymin, ymax);
在绘制函数中选择参数GL_POINTS,点的坐标数据类型可选i(integer),s(short),f(float),d(double),如果使用向量,还可以在后面加上v(vertex)。下面是几个例子:
glBegin(GL_POINTS):
glVertex2i(50, 100);
glVertex2i(75, 150);
glVertex2i(100, 200);
glEnd();
其中的点坐标也可以单独定义,即:
int point1[] = {
50, 100};
int point2[] = {
75, 150};
int point3[] = {
100, 200};
glBegin(GL_POINTS);
glVertex2iv(point1);
glVertex2iv(point2);
glVertex2iv(point3);
glEnd();
还可以使用float等类型或者自定义类型的坐标点。
直线绘制根据参数不同可以分为下面三类:
glBegin(GL_LINES);
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glEnd();
这里没有细讲,以后再补充
通常在上色前要将物体以多边形网格的形式表示。
首先给出一个标准多边形的定义:所有顶点都在同一平面内,各边没有交叉,闭合。若有部分点不在同一平面内,可以将其进行切割。
退化多边形(degenerate polygon):有一些点共线或重复的多边形,或顶点数<3的多边形。
OpenGL中需要所有的多边形为凸
首先介绍内部-外部测试的两种常用方法,注意当图形较为复杂(尤其是各边发生交叉时),两种法则所得的结果可能不同:
- 奇数-偶数法则(Odd-Even Rule):从待测试点到图形外部遥远的一点画线,记录所画线通过的图形边数量。若为奇数,则该点在图形内部;若为偶数,则该点在图形外部。
- 非零环绕数法则(Nonzero Winding-Number Rule):从待测试点到图形外部遥远的一点画线,并将环绕数初始化为0。每通过一条图形边时,判断该图形边的方向。若从右向左,则环绕数加一;若从左向右,则环绕数减一。判断最终的环绕数值,若不为0,则该点在图形内部;若为0,则该点在图形外部。
非零环绕数法则的一些计算方法:
- 叉积法:待测试点到图形外部遥远的一点设为向量u,经过的图形边为向量E,求u×E,结果为正,则边界方向为从右到左,环绕数加一;否则,减一。
- 点积法:求向量u的法线,方向为从P向远点望方向的从右向左,即若
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。