翼度科技»论坛 编程开发 python 查看内容

Python 旋转立方体的实现示例

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
效果图



运行环境

python版本:
  1. python3.x
复制代码
依赖包:
  1. $ pip install pygame
  2. $ pip install numpy
复制代码
完整代码
  1. import numpy as np  # 导入 NumPy 库,用于数值计算和处理多维数组
  2. import pygame  # 导入 Pygame 库,用于游戏开发和图形界面设计

  3. # 定义屏幕的宽度和高度
  4. WIDTH = 800
  5. HEIGHT = 800

  6. # 定义颜色常量
  7. BLACK = (0, 0, 0)  # 黑色
  8. WHITE = (255, 255, 255)  # 白色


  9. class Cube:
  10.     """
  11.     表示一个立方体。
  12.     """

  13.     def __init__(self, pos: np.ndarray, a: float) -> None:
  14.         """
  15.         初始化立方体。
  16.         :param pos: 立方体的中心位置,是一个包含三个元素的 NumPy 数组。
  17.         :param a: 立方体的边长。
  18.         """
  19.         self.pos = pos  # 立方体的中心位置
  20.         self.angle = np.pi / 4  # 立方体的旋转角度,初始化为 45 度
  21.         self.center_offset = np.array([-a / 2, -a / 2, -a / 2])  # 立方体顶点到中心的偏移量
  22.         self.edges = np.array([  # 立方体的边,是一个包含 12 条边的数组
  23.             # 前脸的四条边
  24.             np.array([np.array([0, 0, 0]), np.array([a, 0, 0])]),
  25.             np.array([np.array([a, 0, 0]), np.array([a, a, 0])]),
  26.             np.array([np.array([a, a, 0]), np.array([0, a, 0])]),
  27.             np.array([np.array([0, a, 0]), np.array([0, 0, 0])]),
  28.             # 右脸的四条边
  29.             np.array([np.array([0, 0, 0]), np.array([0, 0, a])]),
  30.             np.array([np.array([a, a, 0]), np.array([a, a, a])]),
  31.             np.array([np.array([a, 0, 0]), np.array([a, 0, a])]),
  32.             np.array([np.array([0, a, 0]), np.array([0, a, a])]),
  33.             # 上脸的四条边
  34.             np.array([np.array([0, 0, a]), np.array([a, 0, a])]),
  35.             np.array([np.array([a, 0, a]), np.array([a, a, a])]),
  36.             np.array([np.array([a, a, a]), np.array([0, a, a])]),
  37.             np.array([np.array([0, a, a]), np.array([0, 0, a])]),
  38.         ])

  39.     def draw(self, screen: pygame.surface.Surface, rotation_rate: float) -> None:
  40.         """
  41.         在屏幕上绘制立方体。
  42.         :param screen: 要绘制立方体的 Pygame 屏幕对象。
  43.         :param rotation_rate: 立方体的旋转速率,用于控制立方体旋转的速度。
  44.         """
  45.         # 将立方体的边加上中心偏移量,得到实际的顶点位置
  46.         rotated_cube = np.add(self.edges, self.center_offset)

  47.         # 计算绕 X、Y、Z 轴旋转的矩阵
  48.         rotation_matrix_x = np.array([
  49.             [1, 0, 0],
  50.             [0, np.cos(self.angle), -np.sin(self.angle)],
  51.             [0, np.sin(self.angle), np.cos(self.angle)]
  52.         ])
  53.         rotation_matrix_y = np.array([
  54.             [np.cos(self.angle), 0, np.sin(self.angle)],
  55.             [0, 1, 0],
  56.             [-np.sin(self.angle), 0, np.cos(self.angle)]
  57.         ])
  58.         rotation_matrix_z = np.array([
  59.             [np.cos(self.angle), -np.sin(self.angle), 0],
  60.             [np.sin(self.angle), np.cos(self.angle), 0],
  61.             [0, 0, 1],
  62.         ])

  63.         # 对立方体进行旋转
  64.         rotated_cube = np.matmul(rotated_cube, rotation_matrix_x)
  65.         rotated_cube = np.matmul(rotated_cube, rotation_matrix_y)
  66.         rotated_cube = np.matmul(rotated_cube, rotation_matrix_z)

  67.         # 将旋转后的立方体移动到正确的位置
  68.         moved_cube = np.add(self.pos, rotated_cube)

  69.         # 在屏幕上绘制立方体的边
  70.         for edge in moved_cube:
  71.             # 获取边的两个端点的屏幕坐标
  72.             start_pos = edge[0][0:2]
  73.             end_pos = edge[1][0:2]
  74.             # 绘制边
  75.             pygame.draw.line(screen, WHITE, start_pos, end_pos)

  76.         # 更新立方体的旋转角度
  77.         self.angle += rotation_rate


  78. def main():
  79.     """
  80.     主函数,启动 Pygame 并创建旋转的立方体。
  81.     """
  82.     # 初始化 Pygame
  83.     pygame.init()
  84.     # 创建屏幕对象
  85.     screen = pygame.display.set_mode((WIDTH, HEIGHT))
  86.     # 设置窗口标题
  87.     pygame.display.set_caption("旋转立方体 By stormsha")
  88.     # 创建立方体对象,中心位于 (400, 400, 200),边长为 200
  89.     cube = Cube(np.array([400, 400, 200]), 200)

  90.     # 主循环
  91.     running = True
  92.     while running:
  93.         # 处理 Pygame 事件,如关闭窗口等
  94.         for event in pygame.event.get():
  95.             if event.type == pygame.QUIT:
  96.                 running = False

  97.         # 清空屏幕
  98.         screen.fill(BLACK)
  99.         # 绘制立方体
  100.         cube.draw(screen, 0.001)
  101.         # 更新屏幕
  102.         pygame.display.flip()


  103. if __name__ == "__main__":
  104.     # 如果脚本被直接运行,则执行主函数
  105.     main()
复制代码
实现思路

使用Pygame和NumPy创建旋转立方体
在这篇文章中,我们将详细介绍如何使用Python的Pygame库和NumPy库创建一个旋转的立方体。我们将逐步讲解代码的实现思路,并解释关键部分的作用。

1. 导入库和定义常量

首先,我们需要导入所需的库,包括NumPy和Pygame。NumPy库用于数值计算和处理多维数组,而Pygame库用于游戏开发和图形界面设计。
  1. import numpy as np  # 导入 NumPy 库,用于数值计算和处理多维数组
  2. import pygame  # 导入 Pygame 库,用于游戏开发和图形界面设计

  3. # 定义屏幕的宽度和高度
  4. WIDTH = 800
  5. HEIGHT = 800

  6. # 定义颜色常量
  7. BLACK = (0, 0, 0)  # 黑色
  8. WHITE = (255, 255, 255)  # 白色
复制代码
2. 创建Cube类

接下来,我们创建一个名为Cube的类,用于表示立方体。在Cube类的构造函数中,我们初始化立方体的中心位置、旋转角度和边长。
  1. class Cube:
  2.     """
  3.     表示一个立方体。
  4.     """

  5.     def __init__(self, pos: np.ndarray, a: float) -> None:
  6.         """
  7.         初始化立方体。
  8.         :param pos: 立方体的中心位置,是一个包含三个元素的 NumPy 数组。
  9.         :param a: 立方体的边长。
  10.         """
  11.         self.pos = pos  # 立方体的中心位置
  12.         self.angle = np.pi / 4  # 立方体的旋转角度,初始化为 45 度
  13.         self.center_offset = np.array([-a / 2, -a / 2, -a / 2])  # 立方体顶点到中心的偏移量
  14.         self.edges = np.array([  # 立方体的边,是一个包含 12 条边的数组
  15.             # 前脸的四条边
  16.             np.array([np.array([0, 0, 0]), np.array([a, 0, 0])]),
  17.             np.array([np.array([a, 0, 0]), np.array([a, a, 0])]),
  18.             np.array([np.array([a, a, 0]), np.array([0, a, 0])]),
  19.             np.array([np.array([0, a, 0]), np.array([0, 0, 0])]),
  20.             # 右脸的四条边
  21.             np.array([np.array([0, 0, 0]), np.array([0, 0, a])]),
  22.             np.array([np.array([a, a, 0]), np.array([a, a, a])]),
  23.             np.array([np.array([a, 0, 0]), np.array([a, 0, a])]),
  24.             np.array([np.array([0, a, 0]), np.array([0, a, a])]),
  25.             # 上脸的四条边
  26.             np.array([np.array([0, 0, a]), np.array([a, 0, a])]),
  27.             np.array([np.array([a, 0, a]), np.array([a, a, a])]),
  28.             np.array([np.array([a, a, a]), np.array([0, a, a])]),
  29.             np.array([np.array([0, a, a]), np.array([0, 0, a])]),
  30.         ])
复制代码
在上面的代码中,我们定义了立方体的12条边,包括前脸、右脸和上脸的边。每条边由两个顶点组成,使用NumPy的数组表示。

3. 实现Cube类的draw方法

接下来,我们实现Cube类的draw方法,用于在屏幕上绘制立方体。在draw方法中,我们首先将立方体的边加上中心偏移量,得到实际的顶点位置。然后,我们计算绕X、Y、Z轴旋转的矩阵,并对立方体进行旋转。最后,我们将旋转后的立方体移动到正确的位置,并在屏幕上绘制立方体的边。
  1. def draw(self, screen: pygame.surface.Surface, rotation_rate: float) -> None:
  2.         """
  3.         在屏幕上绘制立方体。
  4.         :param screen: 要绘制立方体的 Pygame 屏幕对象。
  5.         :param rotation_rate: 立方体的旋转速率,用于控制立方体旋转的速度。
  6.         """
  7.         # 将立方体的边加上中心偏移量,得到实际的顶点位置
  8.         rotated_cube = np.add(self.edges, self.center_offset)

  9.         # 计算绕 X、Y、Z 轴旋转的矩阵
  10.         rotation_matrix_x = np.array([
  11.             [1, 0, 0],
  12.             [0, np.cos(self.angle), -np.sin(self.angle)],
  13.             [0, np.sin(self.angle), np.cos(self.angle)]
  14.         ])
  15.         rotation_matrix_y = np.array([
  16.             [np.cos(self.angle), 0, np.sin(self.angle)],
  17.             [0, 1, 0],
  18.             [-np.sin(self.angle), 0, np.cos(self.angle)]
  19.         ])
  20.         rotation_matrix_z = np.array([
  21.             [np.cos(self.angle), -np.sin(self.angle), 0],
  22.             [np.sin(self.angle), np.cos(self.angle), 0],
  23.             [0, 0, 1],
  24.         ])

  25.         # 对立方体进行旋转
  26.         rotated_cube = np.matmul(rotated_cube, rotation_matrix_x)
  27.         rotated_cube = np.matmul(rotated_cube, rotation_matrix_y)
  28.         rotated_cube = np.matmul(rotated_cube, rotation_matrix_z)

  29.         # 将旋转后的立方体移动到正确的位置
  30.         moved_cube = np.add(self.pos, rotated_cube)

  31.         # 在屏幕上绘制立方体的边
  32.         for edge in moved_cube:
  33.             # 获取边的两个端点的屏幕坐标
  34.             start_pos = edge[0][0:2]
  35.             end_pos = edge[1][0:2]
  36.             # 绘制边
  37.             pygame.draw.line(screen, WHITE, start_pos, end_pos)

  38.         # 更新立方体的旋转角度
  39.         self.angle += rotation_rate
复制代码
在上面的代码中,我们使用NumPy的matmul函数进行矩阵乘法,以实现立方体的旋转。然后,我们使用pygame的draw.line函数在屏幕上绘制立方体的边。

4. 实现主函数

最后,我们实现主函数main,用于启动Pygame并创建旋转的立方体。在主函数中,我们首先初始化Pygame,并创建屏幕对象。然后,我们创建一个Cube对象,并进入主循环。在主循环中,我们处理Pygame事件,清空屏幕,绘制立方体,并更新屏幕。
  1. def main():
  2.     """
  3.     主函数,启动 Pygame 并创建旋转的立方体。
  4.     """
  5.     # 初始化 Pygame
  6.     pygame.init()
  7.     # 创建屏幕对象
  8.     screen = pygame.display.set_mode((WIDTH, HEIGHT))
  9.     # 设置窗口标题
  10.     pygame.display.set_caption("旋转立方体 By stormsha")
  11.     # 创建立方体对象,中心位于 (400, 400, 200),边长为 200
  12.     cube = Cube(np.array([400, 400, 200]), 200)

  13.     # 主循环
  14.     running = True
  15.     while running:
  16.         # 处理 Pygame 事件,如关闭窗口等
  17.         for event in pygame.event.get():
  18.             if event.type == pygame.QUIT:
  19.                 running = False

  20.         # 清空屏幕
  21.         screen.fill(BLACK)
  22.         # 绘制立方体
  23.         cube.draw(screen, 0.001)
  24.         # 更新屏幕
  25.         pygame.display.flip()

  26. if __name__ == "__main__":
  27.     # 如果脚本被直接运行,则执行主函数
  28.     main()
复制代码
在上面的代码中,我们使用pygame的event.get函数获取事件,并判断是否为关闭窗口事件。如果是关闭窗口事件,则退出主循环。然后,我们使用screen.fill函数清空屏幕,并使用cube.draw函数绘制立方体。最后,我们使用pygame的display.flip函数更新屏幕。
到此这篇关于Python 旋转立方体的实现示例的文章就介绍到这了,更多相关Python 旋转立方体内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/python/321002hb0.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具