使用python openGL加载显示一个STL文件并可以通过鼠标放大缩小
时间: 2024-02-23 07:59:02 浏览: 243
下面是一个使用Python和PyOpenGL加载和显示STL文件的示例,并支持通过鼠标滚轮进行放大和缩小:
```Python
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from stl import mesh
# STL文件路径
FILE_PATH = 'example.stl'
# 定义窗口大小和初始缩放比例
WINDOW_SIZE = (800, 600)
SCALE_FACTOR = 1.0
# 读取STL文件并创建网格对象
mesh_data = mesh.Mesh.from_file(FILE_PATH)
mesh_normals = mesh_data.normals
mesh_vertices = mesh_data.vectors.reshape(-1, 3)
mesh_center = mesh_data.center
# 定义鼠标滚轮回调函数
def on_mouse_wheel(button, direction, x, y):
global SCALE_FACTOR
if direction > 0:
SCALE_FACTOR += 0.1
else:
SCALE_FACTOR -= 0.1
glutPostRedisplay()
# 定义窗口绘制函数
def on_draw():
# 清空屏幕
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
# 设置投影矩阵和模型视图矩阵
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(-1.0 * SCALE_FACTOR, 1.0 * SCALE_FACTOR,
-1.0 * SCALE_FACTOR, 1.0 * SCALE_FACTOR,
-1.0 * SCALE_FACTOR, 1.0 * SCALE_FACTOR)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
# 设置光照和材质
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glLightfv(GL_LIGHT0, GL_POSITION, [1.0, 1.0, 1.0])
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, [0.8, 0.8, 0.8])
# 将网格对象绘制为三角形面片
glBegin(GL_TRIANGLES)
for i in range(len(mesh_vertices)):
glNormal3fv(mesh_normals[i])
glVertex3fv(mesh_vertices[i] - mesh_center)
glEnd()
# 刷新窗口
glutSwapBuffers()
# 初始化OpenGL环境和窗口
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(WINDOW_SIZE[0], WINDOW_SIZE[1])
glutInitWindowPosition(100, 100)
glutCreateWindow('STL Viewer')
# 设置鼠标滚轮回调函数
glutMouseWheelFunc(on_mouse_wheel)
# 设置绘制函数和窗口大小回调函数
glutDisplayFunc(on_draw)
glutReshapeFunc(lambda w, h: glViewport(0, 0, w, h))
# 启动主循环
glutMainLoop()
```
注意,在上述示例代码中,我们使用了 `stl` 模块来读取STL文件并创建网格对象。同时,我们使用了 PyOpenGL 库来进行OpenGL渲染。在窗口绘制函数中,我们使用了 `glBegin()` 和 `glEnd()` 函数来绘制三角形面片,并设置了光照和材质。在窗口大小回调函数中,我们使用了 `glOrtho()` 函数来设置投影矩阵和模型视图矩阵。最后,我们启动了主循环来等待用户交互事件。