上篇文章我们已经学习了如何画线,这里我们就来画个心形线吧。
代码如下:
import math
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
def drawHeart():
glColor3f(0.0, 1.0, 0.0)
glLineWidth(2)
glBegin(GL_LINE_STRIP)
for i in range(180, 361 + 180):
sit = i * 2 * math.pi / 360
x = 16 * math.pow(math.sin(sit), 3)
y = (13 * math.cos(sit) - 5 * math.cos(2 * sit) - 2 * math.cos(3 * sit) - math.cos(4 * sit))
glVertex3f(x,y,0)
glEnd()
def drawFunc():
glClearColor(0.0, 0.0, 0.0, 0.0)
glClear(GL_COLOR_BUFFER_BIT)
# 改变投影矩阵
glOrtho(-17.0, 17.0, -18.0, 17.0, -1.0, 1.0)
drawHeart()
glFlush()
if __name__ == '__main__':
glutInit()
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
glutInitWindowSize(400, 400)
# 参数为b类型而不是string。我查资料时,很多网上代码未指出导致报错。
glutCreateWindow(b"i love u")
glutDisplayFunc(drawFunc)
# glutIdleFunc(drawFunc)
glutMainLoop()
学习了前面章节的童鞋肯定能看懂这些代码。至于坐标的产生是根据心形线公式
这里我重点讲解一下glOrtho()方法。
glOrtho是创建一个正交平行的视景体。 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况。比如,常用的工程中的制图等。需要比较精确的显示。 而作为它的对立情况, glFrustum则产生一个透视投影。这是一种模拟真是生活中,人们视野观测物体的真实情况。例如:观察两条平行的火车到,在过了很远之后,这两条铁轨是会相交于一处的。还有,离眼睛近的物体看起来大一些,远的物体看起来小一些。
glOrtho(left, right, bottom, top, near, far), left表示视景体左面的坐标,right表示右面的坐标,bottom表示下面的,top表示上面的。这个函数简单理解起来,就是一个物体摆在那里,你怎么去截取他。这里,我们先抛开glViewport函数不看。先单独理解glOrtho的功能。 假设有一个球体,半径为1,圆心在(0, 0, 0),那么,我们设定glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽高都是3的框框把这个球体整个都装了进来。 如果设定glOrtho(0.0, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽是1.5, 高是3的框框把整个球体的右面装进来;如果设定glOrtho(0.0, 1.5, 0.0, 1.5, -10, 10);就表示用一个宽和高都是1.5的框框把球体的右上角装了进来。
参考:http://www.cnblogs.com/yxnchinahlj/archive/2010/10/30/1865298.html