输出图元


图形软件包中用于描述各种图形元素的函数称为 图形输出原语,或简称为 图元。描述对象几何要素的输出图元一般称为 几何图元

OpenGL中指定二维世界坐标系统

可利用gluOtho2D命令设定一个二维笛卡尔坐标系。该函数的变量是指定显示图形的x和y坐标范围的四个值。由于gluOtho2D函数指定正交投影,因此也要确定坐标值放进了OpenGL投影矩阵中。此外,我们可以将世界坐标范围设定前的投影矩阵定义为一个单位矩阵。这样可保证坐标值不会受以前设置的投影矩阵的影响。因此,可通过下列语句定义屏幕显示窗口的坐标系统:

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluOrtho2D(xmin,xmax,ymin,ymax)

如此,显示的窗口被指定为其左下角位于坐标(xmin,ymin)处,右上角位于坐标(xmax,ymax)处。
随后可使用gluOrtho2D语句描述的坐标系统来指定一个或多个要显示的图元。如果一个图元的坐标系范围完全在显示窗口的坐标范围内,则该图元将完整地显示出来。否则,仅仅在显示窗口坐标范围内的图元被显示。同样,在建立图形的几何描述时,所有OpenGL图元的位置必须用gluOrtho2D函数定义的坐标系统中的绝对坐标给出。

OpenGL画点函数

要描述一个点的几何要素,只需在世界坐标系中制定一个位置。然后该坐标系位置和场景中已有的其他几何描述一起被传递给观察子程序。除非制定其他属性值,OpenGL图元按默认的大小和颜色来显示。默认的图元颜色是白色,而默认的点大小等于单一屏幕像素大小。
使用下面的函数指定一个点位置的坐标值:
glVertex* ()
这里的星号表示该函数要有后缀码。这些后缀码用于指明空间维数、坐标值变量的数据类型和可能的向量形式坐标描述。在glBegin函数和glEnd函数之间必须插入对glVertex函数的调用。
glBegin函数的变量用于指定要显示的输出图元的类型,而glEnd函数没有变量。对于点的绘制,glBegin函数的变量是符号常量GL_POINTS。因此,一个点位置的OpenGL描述形式是:

glBegin(GL_POINTS)
glVertex* ()
glEnd()

OpenGL中的坐标位置可以有二维、三维或四维。glVertex的后缀为2,3,4表示其坐标位置的维数。四维描述意味着齐次坐标表示。由于OpenGL将二维作为三维的特殊情况来处理,任意(x,y)坐标描述等同于三维坐标描述(x,y,0)。此外,OpenGL在内部用四维坐标表示顶点,因此上面的描述等同于四维坐标(x,y,0,1)。
需要指出在坐标的数值描述中使用什么数据结构。这由glVertex函数的第二个后缀来完成。用于指定数值数据类型的后缀是:i(整数)、s(短整数)、f(浮点数)和d(双精度浮点数)。
最后,glVertex中可以使用显式的坐标值或引入矩阵形式坐标位置的单个变量。如果使用矩阵形式坐标位置,则需要第三个后缀码:v(“向量”)
下面为一个点绘制的例子:

from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import *

def point():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(0.0,0.4,0.2)     #点的颜色为绿色
    glBegin(GL_POINTS)
    glVertex2i(50,100)
    glVertex2i(75,150)
    glVertex2i(100,200)
    glEnd()
    glFlush()

def init():
    glClearColor(1.0,1.0,1.0,0.0)
    glMatrixMode(GL_PROJECTION)
    gluOrtho2D(0.0,150.0,0.0,250.0)

if __name__=="__main__":
    glutInit()
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB)
    glutInitWindowPosition(50,100)
    glutInitWindowSize(400,300)
    glutCreateWindow(u'Point')

    init()
    glutDisplayFunc(point)
    glutMainLoop()

运行后,结果如下图所示:
点的绘制
也可定义点的坐标值以矩阵的形式描述。在Python中,可采用元组和列表的形式。绘制程序如下:

def point():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(0.0,0.4,0.2)
    point1=[50,100]
    point2=(75,100)
    point3=[100,200]
    glBegin(GL_POINTS)
    glVertex2iv(point1)
    glVertex2iv(point2)
    glVertex2iv(point3)
    glEnd()
    glFlush()

OpenGL画线函数

在OpenGL中,和选择一个点位置一样,使用glVertex函数选择单个端点的坐标位置。有三个OpenGL符号常量可以用于指定如何把这一串端点位置连接成一组直线段。默认情况下,每一符号常量显示白色实线。
(1)GL_LINES可连接每一对相邻端点而得到一组直线段。通常,由于OpenGL仅在线段共享一个顶点时承认其相连;交叉但不共享顶点的线段则不被承认其相连。如果只描述了一个端点则什么也不会显示,如果列出的端点数为奇数则最后一个端点不被处理。
(2)GL_LINE_STRIP可以获得折线。此时,显示从第一个端点到最后一个端点之间一组首尾相连的线段。如果不列出至少两个坐标位置,则什么也不显示。
(3)GL_LINE_LOOP生成封闭折线。将最后一个端点与第一个端点相连接。如下是一个绘制五角星的程序:

from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import *
points=[[80,80],[20,20],[40,120],[70,20],[10,80]]


def star():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(0.0,0.4,0.2)     #线的颜色为绿色
    glBegin(GL_LINE_LOOP)
    for point in points:
        glVertex2iv(point)
    glEnd()
    glFlush()

def init():
    glClearColor(1.0,1.0,1.0,0.0)
    glMatrixMode(GL_PROJECTION)
    gluOrtho2D(0.0,150.0,0.0,150.0)

if __name__=="__main__":
    glutInit()
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB)
    glutInitWindowPosition(50,100)
    glutInitWindowSize(400,300)
    glutCreateWindow(u'Stat')

    init()
    glutDisplayFunc(star)
    glutMainLoop()

结果如图所示:
绘制五角星

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值