1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
# _*_ coding: utf-8 -*-
# version 2.7.13
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
import sys
from PIL import Image
class OpenGLWindow:
# 初始化
def __init__(self, width=640, height=480, title='PyOpenGL'):
# 传递命令行参数
glutInit(sys.argv)
# 设置显示模式
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
# 设置窗口大小
glutInitWindowSize(width, height)
# 创建窗口
self.window = glutCreateWindow(title)
# 设置场景绘制函数
glutDisplayFunc(self.Draw)
# 设置空闲时场景绘制函数
glutIdleFunc(self.Draw)
# 调用OpenGL初始化函数
self.InitGL(width, height)
self.x = 0.2
self.y = 0.2
self.z = 0.2
# 绘制场景
def Draw(self):
# 清除屏幕和深度缓存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
# 重置观察矩阵
glLoadIdentity()
# 移动位置
glTranslatef(0.0, 0.0, -5.0)
# 绕x轴旋转
glRotate(self.x, 1.0, 0.0, 0.0)
# 绕y轴旋转
glRotate(self.y, 0.0, 1.0, 0.0)
# 绕z轴旋转
glRotate(self.z, 0.0, 0.0, 1.0)
# 绘制立方体
glBegin(GL_QUADS)
# 对前面进行贴图
glTexCoord2f(0.0, 0.0)
glVertex3f(-1.0, -1.0, 1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(1.0, -1.0, 1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(1.0, 1.0, 1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(-1.0, 1.0, 1.0)
# 对后面进行贴图
glTexCoord2f(1.0, 0.0)
glVertex3f(-1.0, -1.0, -1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(-1.0, 1.0, -1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(1.0, 1.0, -1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(1.0, -1.0, -1.0)
# 对顶面进行贴图
glTexCoord2f(0.0, 1.0)
glVertex3f(-1.0, 1.0, -1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(-1.0, 1.0, 1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(1.0, 1.0, 1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(1.0, 1.0, -1.0)
# 对底面进行贴图
glTexCoord2f(1.0, 1.0)
glVertex3f(-1.0, -1.0, -1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(1.0, -1.0, -1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(1.0, -1.0, 1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(-1.0, -1.0, 1.0)
# 对右侧面进行贴图
glTexCoord2f(1.0, 0.0)
glVertex3f(1.0, -1.0, -1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(1.0, 1.0, -1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(1.0, 1.0, 1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(1.0, -1.0, 1.0)
# 对左侧面进行贴图
glTexCoord2f(0.0, 0.0)
glVertex3f(-1.0, -1.0, -1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(-1.0, -1.0, 1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(-1.0, 1.0, 1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(-1.0, 1.0, -1.0)
# 结束绘制
glEnd()
# 交换缓存
glutSwapBuffers()
# 旋转角度增加
self.x = self.x + 0.2
self.y = self.y + 0.2
self.z = self.z + 0.2
# OpenGL初始化函数
def InitGL(self, width, height):
# 载入纹理
self.LoadTextures()
# 允许纹理映射
glEnable(GL_TEXTURE_2D)
# 设置为黑色背景
glClearColor(0.0, 0.0, 0.0, 0.0)
# 设置深度缓存
glClearDepth(1.0)
# 设置深度测试类型
glDepthFunc(GL_LESS)
# 允许深度测试
glEnable(GL_DEPTH_TEST)
# 启动平滑阴影
glShadeModel(GL_SMOOTH)
# 设置观察矩阵
glMatrixMode(GL_PROJECTION)
# 重置观察矩阵
glLoadIdentity()
# 设置屏幕宽高比
gluPerspective(45.0, float(width) / float(height), 0.1, 100.0)
# 设置观察矩阵
glMatrixMode(GL_MODELVIEW)
def LoadTextures(self): # 载入纹理图片
# 打开图片
image = Image.open('jonatan-pie-226805.jpg')
# 图像宽度
width = image.size[0]
# 图像高度
height = image.size[0]
# 转换图像
image = image.tobytes('raw', 'RGBX', 0, -1)
# 创建纹理
glBindTexture(GL_TEXTURE_2D, glGenTextures(1))
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height,
0, GL_RGBA, GL_UNSIGNED_BYTE, image)
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
def MainLoop(self):
# 进入消息循环
glutMainLoop()
# 创建窗口
window = OpenGLWindow()
# 进入消息循环
window.MainLoop()
|