news 2026/9/10 16:24:34

Bevy 迁移指南:`bevy_shape` 从 `bevy_math` 中拆分,几何体原语的导入路径与 trait 变更全解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Bevy 迁移指南:`bevy_shape` 从 `bevy_math` 中拆分,几何体原语的导入路径与 trait 变更全解

Bevy 迁移指南:bevy_shapebevy_math中拆分,几何体原语的导入路径与 trait 变更全解

【免费下载链接】bevyA refreshingly simple>项目地址: https://gitcode.com/GitHub_Trending/be/bevy

本指南对应 Bevy 官方迁移文档 bevy_shape.md(Pull Request #25302)。新版 Bevy 将原先集中在bevy_math中的几何原语(geometric primitives)及相关 trait 拆分为独立 cratebevy_shape,这意味着直接依赖bevy_math并从中导入CircleCuboid等类型的代码需要迁移到新的导入路径。阅读本文后,你将清楚掌握哪些类型与 trait 发生了搬迁、新导入路径长什么样、Cargo.toml如何调整,以及为什么大量使用bevy::prelude::*的代码可能无需任何改动。

一、迁移背景:为什么要从bevy_math中拆出bevy_shape

在拆分之前,Bevy 的几何体原语(如二维的CircleRectangleTriangle2d,三维的SphereCuboidCapsule3d等)以及围绕它们的一系列 trait(Primitive2d/Primitive3dBounded2d/Bounded3dShapeSample等)都存放在bevy_mathcrate 的primitives模块之下。

拆分之后,bevy_shape成为一个以“几何体原语”为核心的独立 crate。这一点从它的包描述可以得到印证:bevy_shape在 Cargo.toml 中自称 "Provides primitive shape data definitions for Bevy Engine",并且是一个#![no_std]友好的 crate(见 lib.rs),只依赖bevy_mathbevy_reflectrandserde等少数底层库。

从源码布局看,bevy_shape的内部结构相当清晰,基本是按功能域组织的:

  • dim2.rs:全部 2D 原语(CircleArc2dEllipseRectanglePolygonRegularPolygonCapsule2dTriangle2dAnnulus等);
  • dim3.rs:全部 3D 原语(SphereCuboidCylinderConeCapsule3dTorusExtrusion<T>等);
  • bounding/:包围体相关 trait 与实现(Aabb2d/Aabb3dBoundingCircle/BoundingSphere、射线与包围体求交等);
  • sampling/:形状表面/内部随机采样(ShapeSampleUniformMeshSampler);
  • inset.rs:形状等距内缩(Inset);
  • 其他独立文件如 half_space.rs、ray.rs、view_frustum.rs。

参考 dim2.rs 中对Circle的定义可以看出,新 crate 中的原语与原先的 API 风格保持一致:字段公开(如radius: f32)、提供new构造函数、实现Primitive2d标记 trait,并附带area()perimeter()等测量方法——类型本身的用法没有变化,变化的是它们“住在哪个模块、从哪里导入”

二、发生了什么变化:类型与 trait 的迁移清单

1. 所有原语从bevy_math::primitives::*迁出

文档明确指出:

所有bevy_math::primitives::*现在都暴露在bevy_shape的顶层(bevy_shape::*)或bevy_shape::prelude::*中。

换句话说,原先需要写bevy_math::primitives::Circlebevy_math::primitives::Cuboid的代码,现在需要改为bevy_shape::Circlebevy_shape::Cuboid(或直接使用 prelude)。而bevy_math本身已经不再包含primitives模块——在 bevy_math/src/lib.rs 中我们已经看不到primitives的踪迹,它现在专注于向量、矩阵、四元数、方向类型(Dir2/Dir3)、Rot2Isometry2d/Isometry3dAspectRatio等纯数学类型。

作为补充背景:原本 2D 几何体位于bevy_math::primitives::dim2、3D 位于bevy_math::primitives::dim3,如今这种二三维分层被完整保留在bevy_shape的内部模块中,只是在公开 API 上被扁平化重导出(见 lib.rs),使bevy_shape::Circle这样的顶层路径可以直接可用。

2. 从bevy_math迁入bevy_shape的 trait 完整列表

文档给出了需要特别注意的 8 个 trait:

Trait说明仓库内定义位置
Primitive2d/Primitive3d标记 2D/3D 几何原语的 marker traitlib.rs
Bounded2d/Bounded3d让形状生成包围体(AabbBoundingCircle/BoundingSphere)的抽象bounding/bounded2d/mod.rs、bounding/bounded3d/mod.rs
BoundingVolume/IntersectsVolume包围体通用抽象与体积相交测试抽象bounding/mod.rs、bounding/mod.rs
ToRing把可内缩的 2D 原语转成圆环Ringdim2.rs
Inset原语沿边等距内缩、用于生成轮廓/空心形状inset.rs
ShapeSample在形状内部或边界上均匀随机采样sampling/shape_sampling.rs

这里可以顺带澄清文档未展开的两组 trait 的具体职责,方便你在迁移时对照自己的使用场景:

  • 包围体体系Bounded2d/Bounded3d为形状提供生成包围体的能力,生成结果(Aabb2dBoundingCircleAabb3dBoundingSphere)是实现了BoundingVolume的具体类型;而IntersectsVolume抽象的是“某个体积/测试与另一个包围体是否相交”的判断,可用于射线检测、重叠判定、视锥剔除等。从 bounding/mod.rs 的模块文档可以确认这套四 trait 体系的定位。
  • 内缩与圆环Inset::inset会把形状沿边内缩一定距离,ToRing::to_ring在此基础上生成一个“外轮廓 + 指定厚度”的Ring,常用于描边类渲染(详见 inset.rs 的文档注释)。

3. 一个顺带的“惊喜”变化:包围体 trait 进入了 prelude

文档特别提醒:Bounded2dBounded3dBoundingVolumeIntersectsVolume这四个 trait现在也被加入了 prelude,而此前并非如此。也就是说,如果你的代码里存在下面这类“为了能用方法而显式导入 trait”的语句:

use bevy_math::bounding::{Bounded2d, BoundingVolume};

迁移后可以先检查这些use是否已经多余,若仍在使用旧路径则必须更新(新路径见下表)。如果已经通过bevy::prelude::*bevy_shape::prelude::*导入了 prelude,这些显式导入通常可以直接删除。

三、迁移路径速查:新旧导入对照

综合官方迁移文档与仓库源码,最常见的路径变化如下(旧路径 → 新路径):

// 旧写法(bevy_math 时代) use bevy_math::primitives::{Circle, Cuboid, Capsule3d}; use bevy_math::primitives::dim2::Rectangle; use bevy_math::bounding::{Bounded2d, Aabb2d}; // 新写法(bevy_shape 时代) use bevy_shape::{Circle, Cuboid, Capsule3d, Rectangle}; use bevy_shape::bounding::{Bounded2d, Aabb2d};

bevy_shape的 prelude 内容可以看 lib.rs 的实现:它把全部模块一次性重导出,包括Measured2d/Measured3dWindingOrderbounding::*dim2::*dim3::*half_space::*inset::*Ray2d/Ray3d,以及受 feature 控制的sampling::ShapeSamplepolygon::*。因此对大多数用户而言,一句use bevy_shape::prelude::*;就能覆盖全部需求。

四、三分钟完成迁移:具体操作步骤

步骤 1:判断自己是否需要改动

官方迁移文档给了一个非常实用的判定标准:

如果你使用的是bevy::prelude::*(即引擎全局 prelude),那么基本不需要做任何修改,因为上述所有内容仍然被包含在全局 prelude 中。

这一论断可以在源码中得到验证:在 crates/bevy_internal/src/prelude.rs 中,Bevy 的全局 prelude 组合了各 crate 的 prelude,其中明确包含shape::prelude::*;而 crates/bevy_internal/src/lib.rs#L91 则将bevy_shape以模块shape的形式重导出为bevy::shape。因此:

  • 通过bevy引擎依赖使用、且习惯写use bevy::prelude::*;bevy::shape::Circle的代码 →无需任何改动
  • 直接依赖bevy_math、并从bevy_math::primitives::*导入几何类型 / 从bevy_math导入上述 trait 的代码 →需要迁移

步骤 2:调整 Cargo.toml,加入bevy_shape依赖

对直接依赖bevy_math的库或工程,文档建议“现在可能需要把bevy_shape加为依赖,并从那里导入所需结构”。参照仓库内 bevy_shape/Cargo.toml 的元数据(版本0.20.0-dev,edition2024),可以这样声明:

[dependencies] bevy_math = "0.20" bevy_shape = "0.20"

如果你只需要形状定义而不需要随机采样,甚至可以按需裁剪默认 feature。bevy_shape提供的 feature 如下(对应 Cargo.toml):

Feature作用说明
default默认开启["rand", "std"]包含随机采样与标准库支持
std标准库支持同时会开启allocbevy_math/std
alloc无 std 环境下的堆分配支持依赖bevy_math/alloc
rand启用ShapeSample形状采样引入randrand_distr,为no_std保留扩展性
serialize为原语派生serde序列化依赖bevy_math/serialize
bevy_reflect为原语派生反射能力需要先开启alloc

在引擎内如何聚合使用这些 feature,可以参考 crates/bevy_internal/Cargo.toml 与 crates/bevy_internal/Cargo.toml 中对bevy_shape/serializebevy_shape/std的转发声明。

步骤 3:批量替换导入语句

把形如下面的旧导入整体替换到新路径即可(这里以直接使用 crate 名、不使用全局 prelude 的场景为例):

// 迁移前 use bevy_math::primitives::{Circle, RegularPolygon, Capsule3d, Cone}; use bevy_math::bounding::{Aabb3d, BoundingSphere}; // 迁移后 use bevy_shape::prelude::*; // 或按需逐个导入: // use bevy_shape::{Circle, RegularPolygon, Capsule3d, Cone}; // use bevy_shape::bounding::{Aabb3d, BoundingSphere};

步骤 4:复查已显式导入的包围体 trait

如第二节所述,Bounded2dBounded3dBoundingVolumeIntersectsVolume已进入 prelude。迁移时顺手检查:若你的use列表里有这四个 trait 的显式导入,且周围代码已经使用了bevy::prelude::*bevy_shape::prelude::*,可以尝试删除这些多余导入,交由编译器确认。

五、迁移后你仍然拥有的能力(附源码佐证)

拆分并没有削弱任何功能,迁移完成后你依然可以从新家获得全部原有能力。以几个常见用法为例,这些代码在迁移后依然有效(只需换掉导入路径):

① 构造几何体并求测量值——Circle实现了Measured2d,可直接计算面积与周长:

use bevy_shape::prelude::*; use bevy_math::Vec2; let circle = Circle::new(2.0); assert_eq!(circle.area(), std::f32::consts::PI * 4.0); assert_eq!(circle.perimeter(), std::f32::consts::PI * 4.0);

参考实现见 dim2.rs。

② 生成包围体并做包含测试——Bounded2d已进入 prelude,Rectangle::aabb_2dCuboid::aabb_3d等由各原语实现:

use bevy_shape::prelude::*; use bevy_math::{Vec2, Vec3}; let rect = Rectangle::new(4.0, 2.0); let aabb = rect.aabb_2d(Isometry2d::IDENTITY); assert!(aabb.contains(&Aabb2d::new(Vec2::ZERO, Vec2::new(1.0, 0.5))));

实现层面可参考 bounding/mod.rs 中BoundingVolume::contains等方法的 trait 契约。

③ 内缩与描边——Inset/ToRing迁移后照常可用,例如把三角形向内缩 0.1 个单位、或把一个圆转成带厚度的Ring(实现见 inset.rs 与 dim2.rs 中Ring的定义)。

④ 形状内随机采样(需开启randfeature)——ShapeSample可用于粒子系统等场景在形状内部均匀撒点(见 sampling/shape_sampling.rs)。

六、本次迁移的注意事项与边界

最后汇总几条容易被忽略的要点:

  1. bevy::shape路径依旧可用bevy_shape通过 crates/bevy_internal/src/lib.rs#L91 以pub use bevy_shape as shape;挂在bevy下,因此像bevy::shape::Circle这类写法在引擎内依旧成立,只是底层 crate 归属变成了bevy_shape
  2. 二三维原语分层习惯被保留:尽管公开路径扁平化了,但文档中提到"origin is (0, 0) for 2D primitives and (0, 0, 0) for 3D primitives"的坐标系约定在 lib.rs 中继续沿用,维度语义没有改变。
  3. 无 std / 少依赖环境友好bevy_shape#![no_std]crate,采样、序列化、反射等功能都通过 feature 门控,这在引擎走向更广平台(包括嵌入式、WASM 等受限环境)的背景下是一个有意的架构调整。
  4. 改动是否影响现有代码以预导入为准:是否“零改动”取决于你用的是引擎级bevy::prelude还是直接依赖bevy_math/bevy_shape,前者无需动作,后者按上文表格替换导入即可。

按照上述清单操作,一次原本涉及大量文件、容易出错的“类型搬家”迁移,可以被压缩到十几分钟内完成:先确认自己的依赖层级,再更新Cargo.toml,最后用新的bevy_shape路径批量替换旧导入,即可让代码库平稳跟上 Bevy 对几何原语归属的新划分。

【免费下载链接】bevyA refreshingly simple>项目地址: https://gitcode.com/GitHub_Trending/be/bevy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 16:24:32

CANN/GE算子执行接口

aclopExecWithHandle 【免费下载链接】ge GE&#xff08;Graph Engine&#xff09;是面向昇腾的图编译器和执行器&#xff0c;提供了计算图优化、多流并行、内存复用和模型下沉等技术手段&#xff0c;加速模型执行效率&#xff0c;减少模型内存占用。 GE 提供对 PyTorch、Tenso…

作者头像 李华
网站建设 2026/9/10 16:24:06

CANN/ge图引擎ToString函数

ToString 【免费下载链接】ge GE&#xff08;Graph Engine&#xff09;是面向昇腾的图编译器和执行器&#xff0c;提供了计算图优化、多流并行、内存复用和模型下沉等技术手段&#xff0c;加速模型执行效率&#xff0c;减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的…

作者头像 李华
网站建设 2026/9/10 16:24:00

Spring Boot与Selenium自动化测试实践指南

1. Spring Boot与Selenium自动化测试的黄金组合 在当今快节奏的软件开发环境中&#xff0c;自动化测试已经成为保障产品质量不可或缺的一环。作为一名长期奋战在一线的Java开发者&#xff0c;我发现将Spring Boot与Selenium结合使用&#xff0c;能够构建出既稳定又高效的自动化…

作者头像 李华
网站建设 2026/9/10 16:22:40

从SVM到DNN:社交媒体性格分析中的特征工程与模型设计

简介&#xff1a;这套资源是一份基于深度神经网络&#xff08;DNN&#xff09;的社交媒体用户性格分析完整项目&#xff0c;面向人工智能、深度学习方向的研究者与开发者&#xff0c;适合用于NLP文本分类、用户画像及性格预测等场景。包内实现了从数据爬取、预处理、特征构建到…

作者头像 李华
网站建设 2026/9/10 16:22:27

武汉老旧洗衣机维修保养,欧米到家专业师傅检查设备老化、安全隐患及运行状态

前言洗衣机是现代家庭使用频率较高的家电之一&#xff0c;长期运行后容易出现不脱水、不排水、不进水、漏水、异响、无法启动、显示故障代码等问题。尤其武汉地区家庭使用洗衣机频率较高&#xff0c;面对设备突然故障时&#xff0c;选择专业、规范的维修服务非常重要。欧米到家…

作者头像 李华
网站建设 2026/9/10 16:21:32

微信小程序绘画学习平台开发实践与优化

1. 项目概述&#xff1a;绘画学习平台的微信小程序实现这个绘画学习平台管理系统是我去年带队完成的一个教育类小程序项目&#xff0c;核心目标是为零基础绘画爱好者提供一个从入门到进阶的完整学习路径。不同于市面上单纯的视频教学平台&#xff0c;我们特别强化了三个关键功能…

作者头像 李华