You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pygame程序报错:module 'pygame.math'无'Matrix44'属性求助

问题分析

报错的核心原因很明确:pygame.math模块从未提供过Matrix44类,你虽然安装并导入了pyrr库的Matrix44,但代码里依然在错误地调用pygame.math.Matrix44,这和你升级/重装库的操作无关。

解决步骤

你需要完全改用pyrr库的Matrix44实现,同时适配pyrr的API(和你代码里假设的pygame方法有差异):

1. 替换代码中的Matrix44调用

把所有pygame.math.Matrix44替换为直接使用Matrix44(因为已经从pyrr.matrix44导入),同时调整pyrr对应的方法:

  • pyrr中创建透视投影矩阵用create_perspective_projection_matrix函数
  • 创建欧拉角旋转矩阵用from_eulers(注意复数形式)
  • 创建平移矩阵用from_translation

2. 适配Vector3类型转换

pyrr的矩阵方法需要接收pyrr的Vector类型,所以需要把pygame的Vector3转换为pyrr的Vector3。

修改后的完整代码
import pygame
from pyrr import Matrix44, Vector3  # 直接导入pyrr的Vector3
from pygame.math import Vector3 as PygameVector3  # 重命名避免冲突
import math  # 用于角度转弧度

class Camera:
    def __init__(self, position, fov=90):
        self.position = PygameVector3(*position)
        self.rotation = PygameVector3(0, 0, 0)
        self.fov = fov
        self.aspect_ratio = 1.0
        self.near_clip = 0.1
        self.far_clip = 100.0

    def get_projection_matrix(self):
        # 使用pyrr的透视投影矩阵创建函数
        return Matrix44.create_perspective_projection_matrix(
            self.fov, self.aspect_ratio, self.near_clip, self.far_clip
        )

    def get_view_matrix(self):
        # 转换为pyrr的Vector3,pyrr默认使用弧度,这里将角度转换为弧度
        pyrr_rotation = Vector3([
            math.radians(self.rotation.x),
            math.radians(self.rotation.y),
            math.radians(self.rotation.z)
        ])
        rotation = Matrix44.from_eulers(pyrr_rotation)
        # 转换位置为pyrr的Vector3并取反
        pyrr_position = Vector3([self.position.x, self.position.y, self.position.z])
        translation = Matrix44.from_translation(-pyrr_position)
        return rotation @ translation

    def move(self, direction):
        if direction == 'right':
            self.position.x += 1
        elif direction == 'left':
            self.position.x -= 1
        elif direction == 'up':
            self.position.y += 1
        elif direction == 'down':
            self.position.y -= 1
        elif direction == 'forward':
            self.position.z -= 1
        elif direction == 'backward':
            self.position.z += 1

    def rotate(self, axis, angle):
        # 直接存储角度,在生成矩阵时统一转换为弧度
        setattr(self.rotation, axis, getattr(self.rotation, axis) + angle)
关键注意点
  • pyrr的欧拉角默认使用弧度,代码中已经在生成旋转矩阵时将角度转换为弧度,无需修改rotate方法的传参逻辑
  • 若不需要保留pygame的Vector3,可以直接全程使用pyrr的Vector3,减少类型转换步骤

内容的提问来源于stack exchange,提问作者user20983853

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:53:08