Python功能制作之3D方块

介绍

用python写一个黑窗口,窗口里面有一个白色的3D方块,左键按下后移动可以旋转以各个视角来看方块。

当然有需要的话,可以自己在代码中去更改颜色,直接通过RBG的参数进行更改即可。

做了两个函数:init初始化draw_cube绘制方块

如果需要旋转,将清空缓冲上面的 **# glRotatef(1, 1, 1, 1)**取消注释即可。

这个函数的作用主要是刷新的帧率,比如填写120,就可以感觉到游戏里面卡顿的感觉了

需要安装的库

在终端执行:

pip install pygame

pip install PyOpenGL

源码:

python 复制代码
import pygame
from OpenGL.GL import *
from OpenGL.GLU import *

# 初始化Pygame和OpenGL
def init():
    # 初始化Pygame库
    pygame.init()
    # 创建窗口800*600
    display = (800, 600)
    # 设置显示模式为OpenGl,并创建双缓冲的窗口对象
    pygame.display.set_mode(display, pygame.DOUBLEBUF | pygame.OPENGL)
    # 设置透视投影 45是视角的夹角,(display[0] / display[1])是窗口的宽高比,0.1是离裁剪的最近距离,50是裁剪的最远距离
    gluPerspective(45, (display[0] / display[1]), 0.1, 50.0)
    # 是xyz轴的平移量,z轴平移5
    glTranslatef(0.0, 0.0, -5)

# 绘制白色的3D正方体
def draw_cube():
    glBegin(GL_QUADS)
    # 设置颜色RGB
    glColor3f(1.0, 1.0, 1.0)
    """设置正方体的6个面的点"""
    glVertex3f(1.0, -1.0, -1.0)
    glVertex3f(1.0, 1.0, -1.0)
    glVertex3f(-1.0, 1.0, -1.0)
    glVertex3f(-1.0, -1.0, -1.0)

    glVertex3f(1.0, -1.0, 1.0)
    glVertex3f(1.0, 1.0, 1.0)
    glVertex3f(-1.0, 1.0, 1.0)
    glVertex3f(-1.0, -1.0, 1.0)

    glVertex3f(1.0, -1.0, -1.0)
    glVertex3f(1.0, 1.0, -1.0)
    glVertex3f(1.0, 1.0, 1.0)
    glVertex3f(1.0, -1.0, 1.0)

    glVertex3f(-1.0, -1.0, -1.0)
    glVertex3f(-1.0, 1.0, -1.0)
    glVertex3f(-1.0, 1.0, 1.0)
    glVertex3f(-1.0, -1.0, 1.0)

    glVertex3f(1.0, 1.0, -1.0)
    glVertex3f(1.0, 1.0, 1.0)
    glVertex3f(-1.0, 1.0, 1.0)
    glVertex3f(-1.0, 1.0, -1.0)

    glVertex3f(1.0, -1.0, -1.0)
    glVertex3f(1.0, -1.0, 1.0)
    glVertex3f(-1.0, -1.0, 1.0)
    glVertex3f(-1.0, -1.0, -1.0)
    glEnd()

# 主循环
def main():
    init()
    running = True
    rotate = False
    last_mouse_pos = (0, 0)

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
                rotate = True
                last_mouse_pos = pygame.mouse.get_pos()
            elif event.type == pygame.MOUSEBUTTONUP and event.button == 1:
                rotate = False

        # glRotatef(1, 1, 1, 1)  # 每帧旋转1度
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # 清空银色缓冲去和深度缓冲去,准备下一帧渲染
        draw_cube() # 重新绘制
        pygame.display.flip() # 渲染结果显示屏幕
        pygame.time.wait(10) # 等待10毫秒,控制每帧的渲染速度,通过参数调整帧率-->数值越大,越有游戏卡了的感觉

        if rotate:
            cur_mouse_pos = pygame.mouse.get_pos()
            diff_x = cur_mouse_pos[0] - last_mouse_pos[0]
            diff_y = cur_mouse_pos[1] - last_mouse_pos[1]
            glRotatef(diff_y * 0.1, 1, 0, 0)  # 根据鼠标纵向移动旋转y轴
            glRotatef(diff_x * 0.1, 0, 1, 0)  # 根据鼠标横向移动旋转x轴
            last_mouse_pos = cur_mouse_pos

    pygame.quit()

if __name__ == '__main__':
    main()

效果:

相关推荐
学测绘的小杨4 小时前
CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包
python
zzzzzz31010 小时前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐11 小时前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
兵慌码乱1 天前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot1 天前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海1 天前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱1 天前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽1 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码2 天前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
nujnewnehc2 天前
不会 py, 用 ai 写了个游戏辅助的感受
人工智能·游戏