Python 3D立方体 支持拖拽旋转

基于pygame 进行编写,支持拖拽各种不同的角度。
闲话少说直接上代码:
预览图:
在这里插入图片描述
代码:

# @Time    : 2024/12/11 13:37
# @Create By  : 不承认菜鸡的菜鸡
# @File    : rotatable_cube.py
# @Description : Interactive 3D Rotating Cube with Numbered Faces

import pygame
from pygame.locals import *
import math

pygame.init()

width, height = 800, 600
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("3D Rotatable Cube")


vertices = [
    [100, 100, -100],
    [100, -100, -100],
    [-100, -100, -100],
    [-100, 100, -100],
    [100, 100, 100],
    [100, -100, 100],
    [-100, -100, 100],
    [-100, 100, 100]
]
edges = [
    (0, 1), (1, 2), (2, 3), (3, 0),
    (4, 5), (5, 6), (6, 7), (7, 4),
    (0, 4), (1, 5), (2, 6), (3, 7)
]
faces = [
    (0, 1, 2, 3),
    (4, 5, 6, 7),
    (0, 4, 5, 1),
    (3, 7, 6, 2),
    (0, 3, 7, 4),
    (1, 2, 6, 5)
]
face_numbers = [1, 2, 3, 4, 5, 6]

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

def rotate_x(vertex, angle):
    x, y, z = vertex
    rad = math.radians(angle)
    cos_theta = math.cos(rad)
    sin_theta = math.sin(rad)
    y_new = y * cos_theta - z * sin_theta
    z_new = y * sin_theta + z * cos_theta
    return [x, y_new, z_new]

def rotate_y(vertex, angle):
    x, y, z = vertex
    rad = math.radians(angle)
    cos_theta = math.cos(rad)
    sin_theta = math.sin(rad)
    x_new = x * cos_theta + z * sin_theta
    z_new = -x * sin_theta + z * cos_theta
    return [x_new, y, z_new]

def rotate_z(vertex, angle):
    x, y, z = vertex
    rad = math.radians(angle)
    cos_theta = math.cos(rad)
    sin_theta = math.sin(rad)
    x_new = x * cos_theta - y * sin_theta
    y_new = x * sin_theta + y * cos_theta
    return [x_new, y_new, z]


def project(vertex):
    factor = 400 / (400 + vertex[2])
    x = vertex[0] * factor + width // 2
    y = vertex[1] * factor + height // 2
    return [x, y]


def render_faces_with_numbers(rotated_vertices):
    font = pygame.font.SysFont(None, 36)
    for i, face in enumerate(faces):
        point_list = [project(rotated_vertices[vertex]) for vertex in face]
        pygame.draw.polygon(screen, WHITE, point_list, 1)

        center_x = sum(point[0] for point in point_list) / len(point_list)
        center_y = sum(point[1] for point in point_list) / len(point_list)

        number_surface = font.render(str(face_numbers[i]), True, WHITE)
        screen.blit(number_surface, (center_x - number_surface.get_width() / 2, center_y - number_surface.get_height() / 2))


running = True
rotation_x = 0
rotation_y = 0
mouse_down = False
last_mouse_x, last_mouse_y = 0, 0

while running:
    screen.fill(BLACK)
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
        elif event.type == MOUSEBUTTONDOWN:
            if event.button == 1:
                mouse_down = True
                last_mouse_x, last_mouse_y = event.pos
        elif event.type == MOUSEBUTTONUP:
            if event.button == 1:
                mouse_down = False
        elif event.type == MOUSEMOTION and mouse_down:
            mouse_x, mouse_y = event.pos
            dx = mouse_x - last_mouse_x
            dy = mouse_y - last_mouse_y
            rotation_x += dy * 0.5
            rotation_y += dx * 0.5
            last_mouse_x, last_mouse_y = mouse_x, mouse_y

    rotated_vertices = []
    for vertex in vertices:
        rotated = rotate_x(vertex, rotation_x)
        rotated = rotate_y(rotated, rotation_y)
        rotated_vertices.append(rotated)

    render_faces_with_numbers(rotated_vertices)

    pygame.display.flip()

pygame.quit()
VTK入门实战:从零搭建C++ 3D可视化管线绘制立方体 在科学计算与工程仿真领域,数据可视化是理解复杂信息的关键技术。其核心原理在于将抽象数据通过图形学方法映射为直观的视觉图像,从而揭示数据的内在模式与规律。VTK(Visualization Toolkit)作为一套功能强大的开源可视化系统,通过其独特的管线(Pipeline)架构,高效地实现了从数据到图像的全流程管理,在医学影像、计算流体力学等领域具有极高的技术价值。管线机制将数据源、映射器、执行器等组件串联,形成清晰的数据处理流水线,是构建复杂可视化应用的基础框架。本文将以C++环境下的立方体绘制为例,详细 阅读详情

相关推荐

3D旋转相册设计与实现:送给女友的浪漫编程礼物

3D旋转相册的核心在于将二维图像置于三维空间中,通过坐标变换与投影模型实现视觉上的立体旋转效果。系统通常基于笛卡尔三维坐标系构建场景,采用透视投影模拟人眼观察方式,使远处图片缩小、近处放大,增强空间纵深感。图片在环形或球面布局中的位置由极角和半径决定,通过三角函数计算其 $ (x, y, z) $ 坐标。用户交互如鼠标拖拽会更新相机视角或物体旋转角度,触发实时重绘。该架构为后续图像排列与动画控制提供了数学与视觉基础。对于艺术化需求,可让图片沿任意曲线排列。

weixin_35706067的博客 725

使用Python和OpenGL实现3D立方体的交互式显示

本文将介绍如何使用PythonPygame和OpenGL创建一个可交互的3D立方体。这个立方体支持旋转、缩放等操作,是理解3D图形编程的良好入门示例。(0,1,2,3), # 后面(3,2,7,6), # 左面(6,7,5,4), # 前面(4,5,1,0), # 右面(1,5,7,2), # 上面(4,0,3,6) # 下面这个示例展示了如何使用Python和OpenGL创建一个基础的3D图形应用。OpenGL的基本使用3D图形的矩阵变换用户输入处理实时渲染循环的实现。

exlink2012的专栏 1961

Python之画一个3d的魔方可以自由转动

Python之画一个3d的魔方可以自由转动

PlutoZuo的博客 1459

Python 设置三维图形鼠标拖动旋转的方法

Python绘制的三维图,如何做到用鼠标自由拖动旋转,下面这三种方法一定有一款适合你。

qq_58168857的博客 5607

Python 旋转立方体的实现示例

在上面的代码中,我们使用pygame的event.get函数获取事件,并判断是否为关闭窗口事件。到此这篇关于Python 旋转立方体的实现示例的文章就介绍到这了,更多相关Python 旋转立方体内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持。在上面的代码中,我们使用NumPy的matmul函数进行矩阵乘法,以实现立方体旋转。然后,我们使用pygame的draw.line函数在屏幕上绘制立方体的边。在上面的代码中,我们定义了立方体的12条边,包括前脸、右脸和上脸的边。

Oona_01的博客 391

Face3D.ai Pro代码实例:扩展Gradio界面,支持拖拽调整3D模型旋转/缩放/光照

本文介绍了如何在星图GPU平台上自动化部署🎭 Face3D.ai Pro镜像,并扩展其Gradio界面以支持拖拽交互功能。用户可通过直观的拖拽操作实时调整3D人脸模型的旋转、缩放和光照效果,显著提升3D模型的可视化展示与交互体验,适用于数字人创建、虚拟试妆等3D内容生成场景。

weixin_35516624的博客 783

Python数据可视化进阶】:为什么你的3D图不能自由旋转

解决Matplotlib 3D图表无法交互旋转的难题,本文深入解析交互旋转设置方法,适用于数据可视化、科研绘图等场景。通过启用交互后端和调整视角参数,实现图表自由旋转与动态展示,提升可视化体验。实用技巧值得收藏。

FastSolve的博客 913

多维聚合本质:数据立方体中的切片、切块与旋转

多维聚合是BI分析与报表开发的核心能力,其底层逻辑并非简单GROUP BY,而是基于数据立方体(Data Cube)的空间操作。理解切片(Slicing)、切块(Dicing)、旋转(Pivoting)等关键操作,有助于突破SQL窗口函数、Pandas分层索引、DAX度量建模及OLAP引擎(如ClickHouse)在高维分析中的性能瓶颈与语义歧义。掌握这些技术价值,可显著提升销售看板、用户留存交叉分析、财务多维报表等典型场景的准确性与响应速度,避免因维度误用导致的同比错误、口径不一致与凌晨CPU飙升等问题。

ithome 383

Viser核心概念解析:掌握Python 3D可视化的5个关键要素

Viser是一个基于Web的Python 3D可视化库,它让开发者能够轻松创建交互式3D场景和用户界面。本文将深入解析Viser的5个核心概念,帮助你快速掌握这个强大工具的使用方法。 ## 1. Viser服务器:构建3D可视化的基础 Viser的核心是服务器组件,它负责管理3D场景、处理客户端连接和协调数据传输。通过创建`ViserServer`实例,你可以启动一个Web服务器,该服务器能够

gitblog_00509的博客 1017

还在手动调整3D视图?掌握这4个技巧,立即实现自动旋转交互!

轻松实现Matplotlib 3D图表动态展示,本文详解交互旋转设置技巧。涵盖鼠标控制、视角自动旋转、动画集成与性能优化,适用于科研绘图与数据可视化场景。提升图表可读性与用户体验,值得收藏。

FuncFun的博客 969

3D动态相册

3D动态相册 闲来没事做,就写一下3D拖拽相册吧,图片可自由更换,主要是学习js基础!先来看看效果吧,当然是静态的,可以拖拽,废话少说,上图: 首先当然是要学习布局,不知道布局的话,根本就下不了手!布局就是以中间的DIV为准,随后进行样式的书写,具体布局也说不清楚,希望能看得懂代码吧! CSS样式: *{margin: 0;padding: 0;} body{ background: ...

A_dmin的博客 3995

颠覆级3D模型查看器F3D:极简设计与全平台支持的完美融合

3D设计与开发领域,专业软件的臃肿启动、格式兼容性局限、命令行支持缺失等痛点长期困扰着用户。F3D作为一款**Fast and minimalist 3D viewer**(快速且极简的3D查看器),以轻量架构和跨平台特性重新定义了3D模型查看体验,其核心优势在于毫秒级启动速度、多格式兼容能力和灵活的API扩展接口,完美解决传统工具资源占用高、操作复杂的问题。 ## 3D查看工具选型指南:F3

gitblog_01188的博客 450

PyVista实战:5分钟为你的Jupyter Notebook嵌入可拖拽3D数据切片器

本文详细介绍了如何使用PyVista在Jupyter Notebook中快速嵌入可拖拽3D数据切片器,实现交互式三维可视化。通过PyVista的简洁API,用户无需GUI开发经验即可完成3D模型渲染、切片、裁剪等操作,适用于医学影像、地质勘探等领域的3D数据分析。文章还提供了环境配置、数据加载、交互功能实现及性能优化的完整指南。

weixin_30439067的博客 510

Python打造游戏级3D交互体验:视角控制关键技术突破

掌握Python 3D 视角控制核心技术,轻松实现游戏级交互体验。适用于3D可视化、游戏开发与虚拟仿真场景,基于PyOpenGL与矩阵变换原理,提供流畅的第一人称视角操作方案。代码简洁高效,跨平台兼容,值得收藏并点击了解实现细节。

FuncFun的博客 666

Python+Matplotlib三维绘图实战:教你5分钟生成可旋转3D函数图像(附完整代码)

本文详细介绍了如何使用Python和Matplotlib快速生成可旋转3D函数图像,涵盖基础曲面绘制、交互控制、多图表类型展示及性能优化技巧。通过实战代码演示,帮助读者5分钟内掌握三维可视化技术,提升数据分析和科学计算效率。

ol789012345的博客 85

VTK管线入门:从零开始用C++绘制并着色3D立方体

在科学计算与工程可视化领域,数据可视化是将抽象数据转化为直观图形界面的关键技术。其核心原理在于构建一条从数据源到图形渲染的完整处理管线,通过数据映射、几何转换和视觉编码,将数值信息高效地呈现为三维图形。这一技术对于仿真分析、医学成像和工业设计等领域具有重要价值,能够帮助工程师和研究人员洞察数据内在规律。VTK作为一款强大的可视化工具库,其管线架构完美体现了这一思想。本文以C++环境配置和VTK管线为核心,通过一个经典的“绘制立方体”示例,详细拆解了从数据源创建、映射器设置、演员配置到渲染窗口显示的完整流程,

weixin_34212762的博客 356

3D 魔方模拟器 - 使用 pygame 实现支持鼠标操作、分步教学、公式识别等功能

摘要:本文介绍了一个基于Pygame3D魔方模拟器,支持鼠标操作、分步教学和公式识别等功能。该模拟器实现了完整的3D渲染系统,包括魔方状态管理、坐标变换、光照计算和动画效果。系统提供教学引导功能,能自动识别当前学习阶段并高亮显示目标块,同时支持公式识别和自动求解。用户可通过鼠标滚轮或点击操作旋转魔方各层,并实时查看操作历史和学习进度。程序采用面向对象设计,包含魔方模型、动画系统和UI交互等模块,为魔方爱好者提供了一个直观的学习工具。

wangz76的博客 655

python - 装箱项目/3D Bin Packing problem

本文探讨了Python实现3D装箱问题的自主可控解决方案。目前市场上缺乏免费的开源工具,商业软件年费高达数千至上万美元。作者基于Google OR-Tools开发了一套优化算法,通过消除对称解提升19%-30%性能。方案包含三个核心模块:基础信息输入(集装箱和货物尺寸)、优化算法(使用CP-SAT模型处理装箱约束和朝向约束)以及3D可视化(Plotly实现)。实施案例采用40HQ集装箱(1203×235×269cm)装载4种不同规格的箱子,通过体积排序和逻辑优先级约束显著提升求解效率。该方案为企业提供了经济

htuhxf的博客 1514
上一篇: Kotlin MVVM学习
下一篇: 基于Python的聊天工具(包含客户端和服务端,包含打包成exe可执行应用程序)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值