当前位置:   article > 正文

《Computer Graphics with OpenGL》计算机图形学读书笔记 03——图形输出图元_computer graphics with open gl

computer graphics with open gl
   这里是《Computer Graphics with OpenGL》英文原版第四版的读书笔记,预计每一章写一篇读书笔记。
   本篇为第三章,介绍图形学和OpenGL中主要的绘图函数和绘制方式。
   我们在绘制场景时,需要描述每个物体的结构及其坐标位置,通常称该功能所需的函数为图形输出图元,或简称为图元。
  • 1
  • 2
  • 3

坐标系

对物体的描述一般包括其位置、颜色、包围盒(每个坐标轴方向上的最小值和最大值)等

屏幕坐标系

通常以屏幕左上角为原点

  • 设置像素点颜色:setPixel(x, y, color);
  • 获取像素点颜色:getPIxel(x, y);

有时会有第三维的坐标值,用来表示物体的深度

绝对坐标和相对坐标

前面所说的坐标表示方法都是绝对坐标,即相对于原点的坐标。在某些时候也可使用相对坐标来表示物体,即每一点使用其相对于上一点的位移来表示

OpenGL中建立二维世界坐标

直接使用上一章中所介绍的函数即可:

glMarixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(xmin, xmax, ymin, ymax);
  • 1
  • 2
  • 3

OpenGL的点绘制函数

在绘制函数中选择参数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();
  • 1
  • 2
  • 3
  • 4
  • 5

其中的点坐标也可以单独定义,即:

int point1[] = {
  50, 100};
int point2[] = {
  75, 150};
int point3[] = {
  100, 200};

glBegin(GL_POINTS);
    glVertex2iv(point1);
    glVertex2iv(point2);
    glVertex2iv(point3);
glEnd();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

还可以使用float等类型或者自定义类型的坐标点。

OpenGL的直线绘制函数

直线绘制根据参数不同可以分为下面三类:

  • GL_LINES:在点序列中两两组队,分别连线,多余的点忽略,如下面的代码块就会绘制1-2,3-4两条线段
glBegin(GL_LINES);
    glVertex2iv(p1);
    glVertex2iv(p2);
    glVertex2iv(p3);
    glVertex2iv(p4);
    glVertex2iv(p5);
glEnd();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • GL_LINE_STRIP:点序列依次连接,收尾不连接,如下面的代码块会绘制1-2,2-3,3-4,4-5四条线段
glBegin(GL_LINE_STRIP);
    glVertex2iv(p1);
    glVertex2iv(p2);
    glVertex2iv(p3);
    glVertex2iv(p4);
    glVertex2iv(p5);
glEnd();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • GL_LINE_LOOP:点序列依次连接,且末尾点连接到开头点,如下面的代码块会绘制1-2,2-3,3-4,4-5,5-1五条线段
glBegin(GL_LINE_LOOP);
    glVertex2iv(p1);
    glVertex2iv(p2);
    glVertex2iv(p3);
    glVertex2iv(p4);
    glVertex2iv(p5);
glEnd();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

OpenGL的曲线绘制函数

这里没有细讲,以后再补充

区域填充图元

通常在上色前要将物体以多边形网格的形式表示。

多面体填充

首先给出一个标准多边形的定义:所有顶点都在同一平面内,各边没有交叉,闭合。若有部分点不在同一平面内,可以将其进行切割。

多边形分类
  • 凸多边形(convex polygon):所有内角≤180°;其内部点位于任意一条边的同一侧;在内部任选两点,其连线不会穿过其边界。
  • 凹多边形(concave polygon):至少一个内角>180°;至少存在一条边的两侧都有其内部点;在内部任选两点的连线可能会穿过其边界。
  • 退化多边形(degenerate polygon):有一些点共线或重复的多边形,或顶点数<3的多边形。

    OpenGL中需要所有的多边形为凸
    
    • 1
辨认凹多边形
  • 边界向量叉积法:计算每相邻两个边界向量的叉积,若全部为同一符号,则为凸多边形;否则为凹多边形。
切割凹多边形
  • 方法一:首先计算多边形每条边的向量,及其相邻两边的叉积,所得叉积的第三维z的值若全为正,则是凸多边形,无需切割;若有z的值为负,则可以沿着这两条边中的一条,对该凹多边形进行切割。切割后重复上述步骤直至子图形全部为凸多边形。
  • 方法二:旋转法。依次将多边形的点放置在原点位置,并将该点的下一点放置在X轴方向上,若下一点的再下一点位于x轴下方,则该多边形为凹多边形,可以沿X轴进行切割;否则,依次更换原点位置的顶点,重复上述步骤。
多边形切割为一系列三角形
  • 凸多边形:任取三个连续顶点作为第一个三角形,然后从顶点序列中去除第二个顶点,再重复上述步骤,直至顶点序列中只余最后三个顶点。
  • 凹多边形:在进行与凸多边形相同操作的同时,要注意每次选择的三个点中,第一个点与第三个点的连线必须在多边形内部。
内部-外部测试

首先介绍内部-外部测试的两种常用方法,注意当图形较为复杂(尤其是各边发生交叉时),两种法则所得的结果可能不同:
- 奇数-偶数法则(Odd-Even Rule):从待测试点到图形外部遥远的一点画线,记录所画线通过的图形边数量。若为奇数,则该点在图形内部;若为偶数,则该点在图形外部。
- 非零环绕数法则(Nonzero Winding-Number Rule):从待测试点到图形外部遥远的一点画线,并将环绕数初始化为0。每通过一条图形边时,判断该图形边的方向。若从右向左,则环绕数加一;若从左向右,则环绕数减一。判断最终的环绕数值,若不为0,则该点在图形内部;若为0,则该点在图形外部。

非零环绕数法则的一些计算方法:
- 叉积法:待测试点到图形外部遥远的一点设为向量u,经过的图形边为向量E,求u×E,结果为正,则边界方向为从右到左,环绕数加一;否则,减一。
- 点积法:求向量u的法线,方向为从P向远点望方向的从右向左,即若

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/589614
推荐阅读
相关标签
  

闽ICP备14008679号