Transform 与坐标系统
第二部分把 ECS 的地图画完了:数据怎么放、逻辑怎么跑、消息怎么传。但到目前为止,这个世界基本是一张看不见的表——除了第 2 章那个来回晃的方块,我们一直靠 println! 观察它。从本章开始进入第三部分:让世界有一个看得见的样子。
看得见的第一步不是画画,而是回答三个更基本的问题:一个东西在哪儿、朝向哪儿、多大个儿。在 Bevy 里,这三个问题由同一个组件回答——Transform(变换——实体的位置、旋转与缩放)。第 2 章你已经改写过它的 translation 让方块动起来;本章把它连同背后的整套坐标观念一次讲透:
- 坐标系约定——
(300, 0)到底是哪儿:原点在哪、哪边是右、哪边是上、z 轴去了哪; - Vec2 与 Vec3——位置与“箭头”的数学,长度、距离、归一化、点积;
- Transform 三件套——
translation、rotation、scale的构造与每帧修改; - 旋转与朝向——
Quat、2D 专用的Rot2,以及保证归一化的方向类型Dir2/Dir3; - GlobalTransform 与传播——第 9 章预告的“车一动、全车人跟着动”在此兑现:子实体的
Transform是相对父亲的局部坐标,引擎每帧沿树把它累乘成世界坐标; - 几何原语——
Rect、Circle、Annulus这些纯数学形状,先当工具用,后面的章节它们还会变成看得见的网格。
这些内容对应两个官方 crate:bevy_transform 与 bevy_math。后者的向量与四元数类型来自 glam 库,Bevy 原样转出——所以你在本章学到的数学 API,在任何用 glam 的 Rust 项目里都通用。
本章的舞台是青石镇天文馆。机械师老盖接了一份订单:造一台太阳系仪——太阳居中自转,行星各按各的轨道公转,月亮绕着地球转,还有一颗彗星扫过穹顶。观测员小满负责盯着仪器报数。从把太阳钉到正中央的第一颗螺丝开始,这台机器会逐节成形;造完它,Transform 的全部本领也就到手了。