Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1130|回复: 5

pygame+opengl 3D 显示

[复制链接]

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
发表于 2023-5-28 20:23:16 | 显示全部楼层 |阅读模式
显示一个线条立方体
  1. import pygame
  2. from pygame.locals import *
  3. from OpenGL.GL import *
  4. from OpenGL.GLU import *

  5. vertices=( (1, -1, -1),
  6.     (1, 1, -1),
  7.     (-1, 1, -1),
  8.     (-1, -1, -1),
  9.     (1, -1, 1),
  10.     (1, 1, 1),
  11.     (-1, -1, 1),
  12.     (-1, 1, 1))
  13. ##define 12 edges for the body
  14. edges = ((0,1),(0,3), (0,4), (2,1), (2,3), (2,7),
  15.          (6,3), (6,4), (6,7), (5,1),(5,4), (5,7) )
  16. ##define function to draw the cube
  17. def Cube():
  18.     glBegin(GL_LINES)  #只会选择两点绘图
  19.     for edge in edges:
  20.         for vertex in edge:
  21.             glVertex3fv(vertices[vertex])
  22.     glEnd()
  23. ##Define main function to draw a window for the openGL
  24. def main():
  25.     pygame.init() #初始化所有 PyGame 模块
  26.     display=(600,600) #定义固定的窗口大小
  27.     pygame.display.set_mode(display,DOUBLEBUF | OPENGL)
  28.     #将使用 OpenGL 进行双缓冲
  29.     gluPerspective(45,(display[0] / display[1]),0.1,50.0)
  30.     #定义透视投影矩阵
  31.     glTranslatef(0.0,0.0,-5)
  32.     i = 0;
  33.     while True:
  34.         for event in pygame.event.get():
  35.             if event.type == pygame.QUIT:
  36.                 pygame.quit()
  37.                 quit()
  38.         glTranslatef(0.0, 0.0, -1)
  39.         glRotatef(45,1,1,1)
  40.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)#清除缓存
  41.         Cube()#绘制立方体
  42.         pygame.display.flip()
  43.         pygame.time.wait(100)
  44. main()
复制代码
回复

使用道具 举报

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
 楼主| 发表于 2023-5-28 20:32:50 | 显示全部楼层
旋转的立方体(这个旋转,上面的不转)
  1. import pygame
  2. from pygame.locals import *

  3. from OpenGL.GL import *
  4. from OpenGL.GLU import *


  5. verticies = (
  6.     (1, -1, -1),
  7.     (1, 1, -1),
  8.     (-1, 1, -1),
  9.     (-1, -1, -1),
  10.     (1,  -1, 1),
  11.     (1, 1, 1),
  12.     (-1, -1, 1),
  13.     (-1, 1, 1)
  14.     )


  15. edges = (
  16.     (0,1),
  17.     (0,3),
  18.     (0,4),
  19.     (2,1),
  20.     (2,3),
  21.     (2,7),
  22.     (6,3),
  23.     (6,4),
  24.     (6,7),
  25.     (5,1),
  26.     (5,4),
  27.     (5,7)
  28.     )


  29. def Cube():
  30.     glColor3f(0.0, 1.0, 1.0)
  31.     glPolygonMode(GL_FRONT, GL_FILL)
  32.     glPolygonMode(GL_BACK, GL_FILL)
  33.       # 设置两面均为顶点绘制方式

  34.     glBegin(GL_LINES)                          #glBegin和glEnd()是绘图的必备函数
  35.     for edge in edges:
  36.         for vertex in edge:
  37.             glVertex3fv(verticies[vertex])     #这个函数就是连点,这个函数执行两次画一条线,两点确定一条直线,参数为三维的坐标
  38.     glVertex3f(0,-1,0)           #这个函数执行两次画一条线
  39.     glVertex3f(0,0,-1)
  40.     glEnd()




  41. def main():
  42.     pygame.init()                              #pygame的一些初始化不用管
  43.     display = (800,600)
  44.     pygame.display.set_mode(display, DOUBLEBUF|OPENGL)


  45.     gluPerspective(450,(display[0]/display[1]), 0.5, 50.0) #http://www.gimoo.net/t/1507/559a3e6f82d63.html
  46.     #参数1是视窗相对于我们眼睛的视角
  47.     #参数2是物体显示的长宽比,和窗口长宽比相同就行
  48.     #参数3和4是z轴近和远的裁剪面的距离,物体在这个之外就看不到
  49.     glTranslatef(0.0,0.0, -5) #Z轴就是我们眼睛到屏幕方向的轴,负是远,正是近,其实就是让物体相对与屏幕在XYZ各方向移动几个距离


  50.     while True:
  51.         for event in pygame.event.get():
  52.             if event.type == pygame.QUIT:   #退出事件响应
  53.                 pygame.quit()
  54.                 quit()

  55.         glRotatef(1, 1, 1, 1)
  56.         #参数1是旋转的速度,
  57.         #参数2是x, y and z的一个坐标,表示从(0,0,0)点到(x,y,z)这条线为轴进行旋转
  58.         glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) #用来删除就得画面,清空画布
  59.         Cube()                                           #创建模型
  60.         pygame.display.flip()                            #显示画面
  61.         pygame.time.wait(10)                             #10ms刷新一次


  62. main()
复制代码
回复

使用道具 举报

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
 楼主| 发表于 2023-5-28 20:46:27 | 显示全部楼层
开始glEnd没加括号,也不报错,也不旋转,折腾了半天
回复

使用道具 举报

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
 楼主| 发表于 2023-5-28 20:53:34 | 显示全部楼层
void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);
该 函数定义一个视图 矩阵,并与当前矩阵相乘。
第一组eyex, eyey,eyez 相机在世界坐标的位置
第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置
第三组upx,upy,upz 相机向上的方向在世界坐标中的方向
你把相机想象成为你自己的脑袋:
第一组数据就是脑袋的位置
第二组数据就是眼睛看的物体的位置
第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)。
————————————————
版权声明:本文为CSDN博主「IvanLJF」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ivan_ljf/article/details/8764737
回复

使用道具 举报

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
 楼主| 发表于 2023-5-28 21:08:14 | 显示全部楼层
回复

使用道具 举报

391

主题

1222

帖子

3902

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3902
 楼主| 发表于 2023-5-28 23:47:47 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-4-13 06:06 , Processed in 0.039593 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表