某个老板忽然有一天想到要画3D图,于是作者遭殃了……
OK,首先需要Python和pyopengl……
然后需要一块支持OpenGL的显卡,我不是开玩笑,我第一个程序夭折就是因为显卡不支持。
《OpenGL编程指南》这本书很值得参考。
- 初始化glut
- 设置显示模式
- 创建窗口
- 要做的事情
- 主循环
首先画一个点:
drawFunc里面显示的是画图的函数。
from OpenGL.GL import *
from OpenGL.GLUT import *
def drawFunc():
glBegin(GL_POINTS)
glVertex2d(0,0)
glEnd()
glFlush()
glutInit()
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA)
glutCreateWindow("second")
glutDisplayFunc(drawFunc)
glClearColor(0.0,0.0,0.0,1.0)
glutMainLoop()
以下代码用手工画了球上的所有点:
- 两个函数drawFunc是用来画图
- get_param是用来抓行为并进行重绘的。
- 我知道用全局变量不大好。这只是试验品。
事实上代码还没完成,但是我要睡觉了。嘿嘿。
import math
from OpenGL.GL import *
from OpenGL.GLUT import *
position=[]
def init():
glClearColor(0.0,0.0,0.0,1.0)
def drawFunc(theta_ref=0,phi_ref=0):
number=0
glClear(GL_COLOR_BUFFER_BIT)
glBegin(GL_POINTS)
r=[1]*1000
for theta in [x/180*math.pi-theta_ref/180*math.pi for x in range(0,360,15)]:
z=r[number]*math.cos(theta)
for phi in [x/180*math.pi-phi_ref/180*math.pi for x in range(0,360,15)]:
x=r[number]*math.sin(theta)*math.cos(phi)
y=r[number]*math.sin(theta)*math.sin(phi)
glVertex3f(x,y,z)
number+=1
glEnd()
glFlush()
def get_param(*arg,**args):
print(globals()['position'])
if len(arg)==4:
if arg[1]==0 and globals()['position']==[]:
globals()['position']=[arg[2],arg[3],arg[2],arg[3]]
else:
globals()['position'][2:]=[arg[2],arg[3]]
if len(arg)==2:
globals()['position'][0]=globals()['position'][0]+arg[0]-globals()['position'][2]
globals()['position'][1]=globals()['position'][1]+arg[1]-globals()['position'][3]
globals()['position'][2]=arg[0]
globals()['position'][3]=arg[1]
drawFunc(globals()['position'][0],globals()['position'][1])
glutInit()
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA)
glutInitWindowSize(400,400)
glutCreateWindow("second")
glutMouseFunc(get_param)
glutMotionFunc(get_param)
glutDisplayFunc(drawFunc)
init()
glutMainLoop()