PyOpengl学习(四):画心形线以及glOrtho()方法分析

        上篇文章我们已经学习了如何画线,这里我们就来画个心形线吧。


代码如下:

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

PyOpenGLPython的一个OpenGL绑定库,它允许我们使用Python语言来进行OpenGL编程。要出一个三维正方体模型,我们可以使用PyOpenGL的一些函数和方法来实现。 首先,我们需要导入PyOpenGL库和其他必要的库: ```python from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * ``` 然后,我们可以定义一个绘制正方体的函数: ```python def draw_cube(): glBegin(GL_QUADS) # 绘制正方体的六个面 # 前面 glColor3f(1.0, 0.0, 0.0) # 设置颜色为红色 glVertex3f(-1.0, -1.0, 1.0) glVertex3f(1.0, -1.0, 1.0) glVertex3f(1.0, 1.0, 1.0) glVertex3f(-1.0, 1.0, 1.0) # 后面 glColor3f(0.0, 1.0, 0.0) # 设置颜色为绿色 glVertex3f(-1.0, -1.0, -1.0) glVertex3f(1.0, -1.0, -1.0) glVertex3f(1.0, 1.0, -1.0) glVertex3f(-1.0, 1.0, -1.0) # 左面 glColor3f(0.0, 0.0, 1.0) # 设置颜色为蓝色 glVertex3f(-1.0, -1.0, -1.0) glVertex3f(-1.0, -1.0, 1.0) glVertex3f(-1.0, 1.0, 1.0) glVertex3f(-1.0, 1.0, -1.0) # 右面 glColor3f(1.0, 1.0, 0.0) # 设置颜色为黄色 glVertex3f(1.0, -1.0, -1.0) glVertex3f(1.0, -1.0, 1.0) glVertex3f(1.0, 1.0, 1.0) glVertex3f(1.0, 1.0, -1.0) # 上面 glColor3f(1.0, 0.0, 1.0) # 设置颜色为紫色 glVertex3f(-1.0, 1.0, -1.0) glVertex3f(1.0, 1.0, -1.0) glVertex3f(1.0, 1.0, 1.0) glVertex3f(-1.0, 1.0, 1.0) # 下面 glColor3f(0.0, 1.0, 1.0) # 设置颜色为青色 glVertex3f(-1.0, -1.0, -1.0) glVertex3f(1.0, -1.0, -1.0) glVertex3f(1.0, -1.0, 1.0) glVertex3f(-1.0, -1.0, 1.0) glEnd() ``` 接下来,我们可以定义一个绘制函数,用于设置OpenGL的一些参数和调用绘制正方体的函数: ```python def draw(): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glLoadIdentity() # 设置相机位置和朝向 gluLookAt(3, 3, 3, 0, 0, 0, 0, 1, 0) # 绘制正方体 draw_cube() glutSwapBuffers() ``` 最后,我们可以在主函数中初始化OpenGL并启动主循环: ```python def main(): glutInit() glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowSize(500, 500) glutCreateWindow(b"3D Cube") glEnable(GL_DEPTH_TEST) glutDisplayFunc(draw) glutMainLoop() if __name__ == "__main__": main() ``` 这样,当你运行这段代码时,就会弹出一个窗口显示一个旋转的三维正方体模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值