openglpython3d重构_python+opengl显示三维模型小程序

本文介绍了如何使用Python的PyOpenGL库进行3D图形的初步开发,包括安装PyOpenGL,解决可能的错误,以及展示3D模型的简单示例,如显示旋转的茶壶模型、绘制点线抛物线和模拟转动时钟。
摘要由CSDN通过智能技术生成

一、安装和初步使用

1、安装PyOpenGL

已经安装python的系统会自动安装pip,所以只需要一句pip命令就可以安装opengl了,命令如下:

pip install PyOpenGL PyOpenGL_accelerate

2.安装报错

————————————————————————————————————————————

暂未发现错误,以下未验证:

然后在python 中import相关功能,运行后会出现错误

OpenGL.error.NullFunctionError: Attempt to call an undefined function glutInit, check for bool(glutInit) before calling

或者:

SyntaxError: multiple statements found while compiling a single statement

可能是缺少相关dll文件,可以在这里下载到     http://pan.baidu.com/s/1dFhC8G5

拷到你建立的工程目录下,就是你写的程序的目录下就可以了。

——————————————————————————————————————————————

3.一个demo

运行下面的程序

# -*- coding:utf-8 -*-

# Author:WYC

from OpenGL.GL import *

from OpenGL.GLU import *

from OpenGL.GLUT import *

def drawFunc():

#清楚之前画面

glClear(GL_COLOR_BUFFER_BIT)

glRotatef(0.1, 0,5,0)

#(角度,x,y,z)

glutWireTeapot(0.5)

#刷新显示

glFlush()

#使用glut初始化OpenGL

glutInit()

#显示模式:GLUT_SINGLE无缓冲直接显示|GLUT_RGBA采用RGB(A非alpha)

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)

#窗口位置及大小-生成

glutInitWindowPosition(0,0)

glutInitWindowSize(400,400)

glutCreateWindow(b"first")

#调用函数绘制图像

glutDisplayFunc(drawFunc)

glutIdleFunc(drawFunc)

#主循环

glutMainLoop()

就应该能够显示茶壶模型了

二、简单使用例子

1.点线抛物线

from OpenGL.GL import *

from OpenGL.GLU import *

from OpenGL.GLUT import *

from numpy import *

import sys

def init():

glClearColor(1.0,1.0,1.0,1.0)

gluOrtho2D(-5.0,5.0,-5.0,5.0)

def plotfunc():

glClear(GL_COLOR_BUFFER_BIT)

glColor3f(1.0,0.2,0.6)

glPointSize(3.0)

glBegin(GL_POINTS)

for x in arange(-5.0,5.0,0.1):#from -5.0 to 5.0 plus 0.1 every time

y=x*x

glVertex2f(x,y)

glEnd()

glFlush()

def main():

glutInit(sys.argv)

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB)

glutInitWindowPosition(50,100)

glutInitWindowSize(400,400)

glutCreateWindow("Function Plotter")

glutDisplayFunc(plotfunc)

init()

glutMainLoop()

main()

2.转动时钟

from OpenGL.GL import *

from OpenGL.GLU import *

from OpenGL.GLUT import *

import math

import time

h = 0

m = 0

s = 0

def Draw():

PI = 3.1415926

R = 0.5

TR = R - 0.05

glClear(GL_COLOR_BUFFER_BIT)

glLineWidth(5)

glBegin(GL_LINE_LOOP)

for i in range(100):

glVertex2f(R * math.cos(2 * PI / 100 * i), R * math.sin(2 * PI / 100 * i))

glEnd()

glLineWidth(2)

for i in range(100):

glBegin(GL_LINES)

glVertex2f(TR * math.sin(2 * PI / 12 * i), TR * math.cos(2 * PI / 12 * i))

glVertex2f(R * math.sin(2 * PI / 12 * i), R * math.cos(2 * PI / 12 * i))

glEnd()

glLineWidth(1)

h_Length = 0.2

m_Length = 0.3

s_Length = 0.4

count = 60.0

s_Angle = s / count

count *= 60

m_Angle = (m * 60 + s) / count

count *= 12

h_Angle = (h * 60 * 60 + m * 60 + s) / count

glLineWidth(1)

glBegin(GL_LINES)

glVertex2f(0.0, 0.0)

glVertex2f(s_Length * math.sin(2 * PI * s_Angle), s_Length * math.cos(2 * PI * s_Angle))

glEnd()

glLineWidth(5)

glBegin(GL_LINES)

glVertex2f(0.0, 0.0)

glVertex2f(h_Length * math.sin(2 * PI * h_Angle), h_Length * math.cos(2 * PI * h_Angle))

glEnd()

glLineWidth(3)

glBegin(GL_LINES)

glVertex2f(0.0, 0.0)

glVertex2f(m_Length * math.sin(2 * PI * m_Angle), m_Length * math.cos(2 * PI * m_Angle))

glEnd()

glLineWidth(1)

glBegin(GL_POLYGON)

for i in range(100):

glVertex2f(0.03 * math.cos(2 * PI / 100 * i), 0.03 * math.sin(2 * PI / 100 * i));

glEnd()

glFlush()

def Update():

global h, m, s

t = time.localtime(time.time())

h = int(time.strftime('%H', t))

m = int(time.strftime('%M', t))

s = int(time.strftime('%S', t))

glutPostRedisplay()

glutInit()

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)

glutInitWindowSize(400, 400)

glutCreateWindow("My clock")

glutDisplayFunc(Draw)

glutIdleFunc(Update)

glutMainLoop()

参考文档:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值