Python + Ursina设计3D小游戏

Python + Ursina设计3D小游戏

Ursina:一个基于Panda3D的Python游戏引擎,简化了3D游戏开发。

Ursina本身:约5-15 MB。安装Ursina时,pip会自动安装其依赖,包括Panda3D、pygame、numpy等。这些依赖库加起来可能会占用几百MB的磁盘空间。但具体占用空间大小取决于你的系统以及是否已经安装了一些依赖。与传统游戏引擎相比还是比较小的。显著优点是简单易学,Ursina的API设计非常直观,适合初学者快速上手3D游戏开发。可以跨平台,即可在Windows、Mac、Linux上运行。但不适合大型或高性能游戏。

ursina/ 5-15 MB

panda3d/ 200-300 MB

pygame/ 5-10 MB

numpy/ 50-100 MB

其他依赖(psutil等) 10-20 MB

Ursina官方文档和示例:https://www.ursinaengine.org/

安装ursina的命令:pip install ursina

若安装了多个python版本,X.Y代表Python版本,多余的部分舍弃如3.8.1取3.8,3.10.5取3.10,即只取第二个点前的部分。仅安装了一个python版本不需要。还可以使用镜像加速

py -3.12 -m pip install ursina -i https://pypi.tuna.tsinghua.edu.cn/simple

【Python第三方模块(库、包)安装、卸载与查看及常见问题解决 https://blog.csdn.net/cnds123/article/details/104393385 】

一个Ursina程序通常包括以下步骤:

  1. 导入Ursina库
  2. 创建一个应用实例
  3. 定义游戏中的实体(Entity)
  4. 编写更新逻辑
  5. 运行应用

核心概念

实体(Entity):游戏中的基本对象,可以是3D模型、UI元素等。

模型(Model):3D几何体,如立方体、球体等,也可以加载外部模型文件。

纹理(Texture):贴在模型表面的图片。

颜色(Color):可以用RGB或HSL定义。

变换(Transform):位置(position)、旋转(rotation)、缩放(scale)。

场景(Scene):管理实体和光照等。

着色器(Shader):可以编写自定义GLSL着色器。

动画(Animation):使用内置的动画系统。

粒子系统(ParticleSystem):创建粒子效果。

声音(Audio):播放背景音乐和音效。

坐标系

Ursina使用标准的3D计算机图形坐标系,与Unity一致:

  • X 轴:右(+)/ 左(-)------水平方向
  • Y 轴:上(+)/ 下(-)------垂直方向
  • Z 轴:前(+)/ 后(-)------深度方向

在3D场景中,通常将X-Z平面视为地面,Y轴表示高度。这种坐标系设计让游戏开发更加直观:向前移动时增加Z值,向上跳跃时增加Y值。

参见下图:

【三维坐标系统总结表

系统 X 轴方向 Y 轴方向 Z 轴方向
Ursina 右(+ )/ 左(- ) 上(+ )/ 下(- ) 前(+ )/ 后(- )
Unity 右(+ )/ 左(- ) 上(+ )/ 下(- ) 前(+ )/ 后(- )
Blender 右(+ )/ 左(- ) 前(+ )/ 后(- ) 上(+ )/ 下(- )
OpenGL 右(+ )/ 左(- ) 上(+ )/ 下(- ) 后(+ )/ 前(- )
Unreal Engine 前(+ )/ 后(- ) 右(+ )/ 左(- ) 上(+ )/ 下(- )

】

以下是一个使用Ursina创建简单3D场景------一个旋转的立方体的示例代码:

python 复制代码
from ursina import *

app = Ursina()

# 创建一个立方体
cube = Entity(model='cube', color=color.orange, scale=(2,2,2), texture='white_cube')

# 创建一个摄像机,并设置其位置
camera.position = (0, 0, -10)

# 旋转立方体的函数
def update():
    cube.rotation_y += 1    # 绕Y轴(垂直轴)旋转,实现水平旋转效果
    cube.rotation_x += 0.5  # 绕X轴(水平轴)旋转,实现前后翻滚效果

# 添加键盘控制示例
def input(key):
    if key == 'space':
        cube.color = color.random_color()  # 随机颜色
    if key == 'r':
        cube.rotation = (0, 0, 0)  # 重置旋转

app.run()

运行效果:

待续

相关推荐
小小张说故事3 分钟前
Python 的 dict 为什么插入顺序不会乱?拆开 3.6 的紧凑布局:indices 与 entries 两张表
python
椰萝Yerosius4 分钟前
严正声明 | 博主已正式放弃CSDN作为博客平台
python
Sapphire~12 分钟前
odoo-095 视图的重写规则(全部重写还是部分改写)
开发语言·javascript·ecmascript
利威尔xu13 分钟前
Go GMP 调度器 10 个高频追问:3 个线上故障让 P99 从 80ms 飙到 2s、10 万 goroutine 泄漏
开发语言·后端·面试·性能优化·golang
中电金信19 分钟前
从业务调优到分层缓存:DeepSeek V4 Flash的PPU实践
java·开发语言
肖永威20 分钟前
python版微电网仿真工具的前端托管选型:从http.server到FastAPI StaticFiles
前端·python·http·fastapi
梦影_22 分钟前
MySQL进阶教程(二)—— 储存过程与触发器(下)
开发语言·数据库·后端·sql·mysql·oracle·数据库开发
lg_cool_28 分钟前
Python 代码打包
开发语言·python
木雷坞31 分钟前
PHP两项9.2分漏洞:Docker容器更新与版本核验教程
开发语言·docker·php
2601_9628857239 分钟前
如何用 Python 做 MACD 金叉全市场选股?
开发语言·python