成为英雄的路
67.97 MB · 2025-10-31
好的,我们继续用《博德之门3》的背景来深入解释这些概念。
我们之前说 IsA Schema 就像角色的“职业”,这个比喻可以更进一步。IsA Schema 分为 具体 (Concrete) 和 抽象 (Abstract) 两种。
这就像《博德之门3》里你可以在创建角色时直接选择的职业:战士 (Fighter) 、法师 (Wizard) 、圣武士 (Paladin) 等。
UsdGeom.Sphere (球体) 或 UsdGeom.Mesh (网格体) 就是具体模式。你可以直接在场景里创建一个球体 (Define a sphere),它就是一个有明确类型的实体。这就像游戏里一些职业的“总称”或“类别”,例如 施法者 (Spellcaster) 或者 武人 (Martial) 。
UsdGeom.PointBased (基于点的几何体) 就是一个抽象模式。你不能直接在场景里创建一个“PointBased”物体。但它是一个非常有用的基类,像 UsdGeom.Mesh (网格体) 和 UsdGeom.BasisCurves (曲线) 这种具体模式都继承自它,因为它们都拥有“点”这个共同属性。小结:
UsdGeom 家族:就像是定义了游戏世界里所有物理实体的模板库,比如角色的模型 (Mesh)、怪物的形状 (Sphere、Cube)。UsdLux 家族:就像是定义了游戏里所有光源的模板库,比如一个“光亮术”法术产生的光源 (SphereLight),或者月光提灯发出的光 (DiskLight)。我们之前说 API Schema 像是“专长”,这个比喻也可以扩展。
API Schema 添加的属性,其命名会带有一个“前缀”,以表明它来自哪个“插件”。
UsdPhysics.RigidBodyAPI 添加的速度属性叫 physics:velocity。夺心魔能力:心灵冲击 或 夺心魔能力:灵能反冲。这个“夺心魔能力:”前缀,就和 physics: 扮演着同样的角色,让你一眼就知道这个属性的来源。API Schema 的应用方式也不同。
Single-Apply (单次应用) : 大多数 API 属于这种,在一个物体上只能应用一次。
UsdPhysics.RigidBodyAPI 就是单次应用的。一个物体要接受物理引擎的计算,你为它应用一次物理属性就够了,没必要应用多次。Multiple-Apply (多次应用) : 这种 API 可以在同一个物体上,用不同的“实例名”应用多次。
博德之D门3类比: 这个最像角色的**“背景标签 (Tags)”** 或 “出身 (Background)” 。一个角色(Prim)可以同时拥有多个背景标签,比如:
背景:博德安人 (Baldurian)背景:贵族 (Noble)背景:竖琴手同盟 (Harpers)USD 例子: Usd.CollectionAPI 是典型的多次应用 API。你可以在一个 Prim 上创建一个名为 armor 的集合(Collection),再创建一个名为 weapons 的集合,用来分别管理不同的子物体。
想象一下游戏里的一个木箱子 (/World/Crate)。
IsA Schema: 它的核心身份是一个 UsdGeom.Cube (具体模式)。它 是 一个立方体。
Python
# 定义它的核心身份
crate = UsdGeom.Cube.Define(stage, "/World/Crate") 
API Schema: 我们想让这个箱子能被炸飞,能从高处掉下来摔碎。它现在只是个静态模型,没有物理特性。于是我们给它应用一个 API Schema。
Python
# 给它添加物理特性(就像给它注入了物理规则)
crate_rb_api = UsdPhysics.RigidBodyAPI.Apply(crate.GetPrim())
# 现在可以设置它的物理属性了,比如初始速度
crate_rb_api.CreateVelocityAttr([0, 0, 10]) # 让它向上飞
现在,这个木箱子(Prim)的核心身份(IsA)是一个立方体,但通过“插件”(API),它获得了和游戏物理引擎互动的能力。当你用一个“雷鸣波”法术轰击它时,游戏引擎会查找它的 physics:velocity 等属性,并据此计算它该如何被炸飞。
总结: IsA Schema 提供了骨架和身份,而 API Schema 则为其添加了血肉和灵魂,让复杂的场景和行为得以实现。
 
                    