问题四、如何解决模型轴配置问题
问题描述:
举一个简单的例子
资产位置:
- 未装配叉车:
Samples>Rigging>Forklift>forklift_b_unrigged_cm.usd
- 装配叉车:
Samples>Rigging>Forklift>forklift_b_rigged_cm.usd
用openfile打开为配置的forklift_b_unrigged_cm.usd
文件
## 1 识别关节
装配机器人的第一步是识别机器人上的关节,包括驱动关节和非驱动关节。关节决定了所有网格组件的组织方式,识别关节类型及其自由度 (DOF) 是确保机器人装配后按预期运动的关键。
对于叉车来说一共有7个关节:
- 叉车前方有4个较小的滚轮。它们具有非驱动的旋转关节,每个关节都有一个绕单轴旋转的自由度。
- 当叉车的叉子上下移动以拾取堆放的物体时,叉子相对于叉车主体具有线性运动,这意味着叉子和主体之间有一个线性驱动关节。
- 后端较大的车轮负责推动叉车并使其转向。与该车轮相关的驱动有两个:
- 旋转接头使车轮绕其中心轴旋转,从而提供向前和向后的运动。
- 车轮和叉车车身之间的旋转接头,提供叉车的转动。
2 层次结构配置
初始状态查看右侧树结构处于完全被打乱的情况:
我们将这些mesh归类,放到几个大节点中,方便理解及移动。
分别建立名为body
、lift
、back_wheel
、back_wheel_swivel
、roller_front_right
、roller_back_left
、roller_back_right
、roller_front_left
8个大的Xform
类型的节点。每个节点包含的mesh如下:
-
body
:Looks
节点到SM_Forklift_BodyGlass_B01_01
节点的所有Mesh -
lift
:Looks
节点之前的所有Mesh -
back_wheel
:SM_Forklift_BackWheel_B01_01
-
back_wheel_swivel
:SM_Forklift_BackWheelbase_B01_01
-
roller_front_right
:SM_Forklift_LeadWheelsFrontRight_B01_01
-
roller_back_left
:SM_Forklift_LeadWheelsBackLeft_B01_01
-
roller_back_right
:SM_Forklift_LeadWheelsBackRight_B01_01
-
roller_front_left
:SM_Forklift_LeadWheelsFrontLeft_B01_01
重点:
-
Translate
- 表示物体相对于其父级坐标系的位置偏移。
- 例如:若父级坐标系原点在 (0,0,0),Translate=(1,0,0) 表示物体位于父级坐标系的 (1,0,0) 处。
-
Translate:pivot
- 定义物体的 局部变换中心(Pivot),即旋转、缩放的基准点。
- 例如:若 Translate:pivot=(0,0,1),物体将绕其局部坐标的 (0,0,1) 点旋转。
-
Xform 的作用
- Xform 是一个变换节点,可以组合多个变换操作(平移、旋转、缩放)。
- 通过创建新的 Xform 并设置其变换,可以重新定义物体的坐标系层级。
所以假设车轮网格(Mesh)的初始属性为:
Translate = T = (x1, y1, z1)Translate:pivot = P = (x2, y2, z2)
步骤 1:合并 Translate 和 Translate:pivot 到新 Xform
新建一个 Xform,其变换应设为 T + P,即:
new_Xform.transform = T + P = (x1+x2, y1+y2, z1+z2)
步骤 2:重置车轮网格的 Translate
将车轮网格的 Translate 设为 -P(即 Translate:pivot 的逆):
mesh.Translate = -P = (-x2, -y2, -z2)
这一步的目的是 抵消 Translate:pivot 的影响,确保车轮几何体的顶点坐标相对于新 Xform 的原点正确。
注:第一步完成后实际上会发现Xform下的网格位置变化,第二步之后网格又回到原来的位置,这样建立joint的时候xform下的所有mesh网格会根据Xform的坐标进行旋转。