物理编辑器
1. 作用及简介
物理编辑器有以下两个作用:
一是编辑柔体相关属性,如模拟布料、头发等动态物理,对应的是cth文件。
二是编辑骨骼模型的骨骼刚体属性,如骨骼上的刚体、约束等,对应的是phy文件。
之所以在物理编辑器中支持这两项功能,是因为柔体和刚体都是基于物理模拟实现的。这两者对属性的编辑和对应资源文件的加载大不相同,后续会分别详细介绍。
2. 打开方式
物理编辑器打开方式有以下三种方式:
- 在主场景编辑器的资产面板中选中mdl文件,右键选择“编辑柔体”(Edit soft body)打开物理编辑器,此时可以用来编辑布料、头发等效果,关于cth文件的生成后续进行详细介绍。
当打开一个已经绑定了柔体资源的mdl文件时,物理编辑器会显示出可编辑的属性。关于属性的具体含义介绍参考柔体相关属性说明。
若选中的mdl文件未绑定柔体资源,此时右键选择“编辑柔体”打开的物理编辑器仅包含一个模型Actor,属性面板为空,如下图所示。
- 除此之外,还可以通过“窗口”—“物理编辑器”打开物理编辑器,此时场景为空。可以通过菜单栏的“文件”—“打开”选项打开一个mdl文件或phy文件。
- 还可以通过双击主场景编辑器资产面板的phy文件打开物理编辑器,此时物理编辑器用于编辑刚体相关属性。关于phy资源的创建后续进行详细介绍。
3. 菜单栏
物理编辑器的菜单栏跟模型编辑器的菜单栏类似,包含文件、编辑、设置和帮助四项。
3.1. 文件菜单(File)
物理编辑器的文件菜单有三项功能:打开、保存和关闭,分别对应不同的快捷键。
- 打开(Open):是指打开一个mdl文件或phy文件。
- 保存(Save):是指将编辑完成的柔体信息或刚体信息分别保存到对应的文件,柔体信息保存到cth文件,刚体信息保存到phy资源。
- 关闭(Close):清空当前子编辑器,恢复空场景状态。
3.2. 编辑菜单(Edit)
编辑菜单有四项功能:撤销、重做、定位当前Actor和显示地板。具体作用可参见模型编辑器的编辑菜单介绍。
3.3. 设置菜单(Setting)
设置菜单与模型编辑器的设置菜单一致,具体可参见上述模型编辑器的相关介绍。
3.4. 帮助菜单(Help)
提示当前子编辑器的版本信息。
4. 工具栏
物理编辑器的工具栏分为基本操作按钮和拾取变换操作按钮两部分,这两部分的作用在模型编辑器部分已经介绍,故在此不再重复赘述。
5. 主视口窗口
主视口窗口用于显示模型动画效果、柔体效果、刚体模拟效果等。左上角显示帧率。相机位置和旋转等。
6. 柔体资源文件的使用说明
6.1. 柔体资产文件的生成
当前物理编辑器支持的柔体资源文件格式是cth。若要得到cth文件,首先需要用建模工具(如3ds Max)为普通模型制作柔体模型并导出后缀为.apx的文件,然后将apx文件拖拽到主场景编辑器的资产面板,在弹出的对话框中勾选“模型物理”,点击确定即可生成。
工作流如下:
注意事项:关于如何在建模工具中制作柔体效果,请参见《柔体模型制作及使用说明》。CubeEditor编辑器只支持由apx文件或apb文件转化生成cth文件,不支持新建cth文件。
6.2. 柔体资产文件与模型的绑定
通过apx文件生成了cth文件,就可以通过物理编辑器进行相关资源绑定,绑定成功之后,对应的mesh就拥有了柔体属性,可以模拟衣服抖动、头发飘动的效果等。
需要注意的是,一个模型可以绑定一个或多个cth文件,至于一个模型需要绑定几个cth文件,及cth文件关联哪些mesh,是由建模人员在建模过程中决定的。
以女孩模型(girl)为例,在物理编辑器中为其绑定girl.cth文件用于模拟头发飘动的效果,对比绑定柔体资源与未绑定柔体资源两者之间的效果。
通过上面两幅图片对比,绑定了布料文件的女孩模型,其头发不但跟随动画运动,还会受到重力作用而下垂,效果更自然。
6.3. 柔体相关属性说明
为模型绑定柔体文件之后,可以在物理编辑器中修改相关属性,一般分为两大模块:Skin和动画(如果当前模型对应的mdl文件所在的文件夹下存在seq文件)。
6.3.1. 动画属性
如果当前模型对应的mdl文件所在的文件夹下存在seq文件,在配置面板中才会存在这一属性;否则不存在此属性。动画属性只用于当前子编辑器的预览,并不会被保存。
6.3.2. 参数详解
配置信息属性的参数均是用来编辑布料效果的,下面将一一介绍其作用,如果有解释不清楚的部分,也可以参考UE4文档的相关Config介绍。
- 竖直拉伸力约束——VerticleStretchConfig
此属性用于模拟竖直拉伸力(沿重力方向)的约束数据,包含下面四个子属性:- 约束强度(Stiffness):约束节点间的约束强度。
- 约束强度缩放因子(StiffnessScale):约束强度缩放因子。
- 拉伸最大限制(Limit):此约束可以拉伸多远的限制。
- 压缩最大限制(CompressionLimit):此约束可以压缩多少的限制。
- 水平拉伸力约束——HorizontalStretchConfig
此属性用于模拟水平拉伸力(垂直于重力方向)的约束数据,包含下面四个子属性:- 约束强度(Stiffness):约束节点间的约束强度。
- 约束强度缩放因子(StiffnessScale):约束强度缩放因子。
- 拉伸最大限制(Limit):此约束可以拉伸多远的限制。
- 压缩最大限制(CompressionLimit):此约束可以压缩多少的限制。
- 弯曲力约束——BendingStretchConfig
此属性用于模拟弯曲力的约束数据,同样包含四个子属性:- 约束强度(Stiffness):约束节点间的约束强度。
- 约束强度缩放因子(StiffnessScale):约束强度缩放因子。
- 拉伸最大限制(Limit):此约束可以拉伸多远的限制。
- 压缩最大限制(CompressionLimit):此约束可以压缩多少的限制。
- 对角线上力的约束——ShearingStretchConfig
此属性用于模拟对角线上力的约束数据,同样包含四个子属性:- 约束强度(Stiffness):约束节点间的约束强度。
- 约束强度缩放因子(StiffnessScale):约束强度缩放因子。
- 拉伸最大限制(Limit):此约束可以拉伸多远的限制。
- 压缩最大限制(CompressionLimit):此约束可以压缩多少的限制。
- 自碰撞强度——SelfCollisionStiffness
此属性表示自碰撞的刚度,定义粒子碰撞时分离冲量的强度。当两个粒子之间的距离小于设定的自碰撞距离时(也就是小于SelfCollisionThickness),自碰撞刚度控制着两者之间的排斥程度。 - 阻尼系数——Damping
此属性表示阻尼系数,用来降低布料顶点之间的相对速度。此值越大,布料看起来就越“粘稠”。 - 摩擦系数——Friction
此属性表示碰撞表面的摩擦系数,也就是在表面滑动时移除的速度量。 - 阻力系数——Drag
此属性表示三个轴的阻力系数。此编辑器中通过设置Drag参数,可以同时设置线性阻力系数和角阻力系数。 - 惯性缩放因子——InertiaScale
此属性表示惯性缩放因子。此编辑器中通过设置InertiaScale参数,可同时设置线性加速度缩放参数和角加速度缩放参数。 - 解码器频率——SolverFrequency
此属性代表解算器的频率,即每秒模拟计算的频率。此值越小,布料越有弹性。 - 刚体频率——StiffnessFrequency
此属性表示刚度频率,刚度频率控制所有变化率参数的幂律非线性变化(拉伸刚度,剪切刚度,弯曲刚度,系绳刚度,自碰撞刚度,运动约束刚度,阻尼系数,线性和角阻力系数等)。不建议布料绑定后更改此参数。 - 质量缩放系数——MassScale
此属性表示质量缩放系数。 - 自碰撞距离——SelfCollisionThickness
此属性表示自碰撞的距离,模拟布料的厚度。自身碰撞可以在布料的任意顶点之间进行碰撞测试,每个顶点以半径为SelfCollisionThickness的球体表示。此值越大,减少了布料自缠绕的问题,同时也会阻止布料起皱。 - 绳索约束——Tether
此属性用于避免重力或快速运动下的拉伸的系绳约束,此约束通过限制粒子移动的距离来防止拉伸,包含两个子属性:- 约束强度(TetherStiffness):表示绳索约束的约束强度。
- 限制因子(TetherLimit):约束长度限制因子。
7. 静态网格模型的物理资源的使用
7.1. 静态网格模型物理资源文件的生成
静态网格模型(StaticMeshActor)绑定的物理资源文件是phy格式文件,这种情况下,phy资源不能通过物理编辑器编辑物理参数,也不能在CubeEditor编辑器中重新创建应用到静态网格模型的phy资源文件。
应用于静态网格模型的phy资源文件与cth文件类似,也是通过建模工具添加编辑刚体属性,在模型导入过程中,勾选“模型物理”自动生成phy文件,生成过程(刚体大小等信息)中会使用引擎中默认的规则。
7.2. 静态网格模型的物理资源绑定
以basketball资源为例,将mdl文件拖入到主场景来创建一个StaticMeshActor(静态网格Actor),选中当前Actor,查看属性面板的物理信息,默认情况下,不绑定任何刚体资源。
通过点击按钮或者按钮为当前模型指定物理资源(phy文件),此处指定basketball.phy文件,此时物理属性如下:(一个静态网格模型只能绑定一个phy文件)
7.3. 静态网格模型的物理属性说明
目前编辑器中对静态网格模型的物理属性有如下几种:
- 刚体资源路径(PhysiccalAssetPath):表示指定的phy资源路径。
- 刚体类型(RigidType):目前支持静态(Static)和动态(Dynamic)两种。静态类型刚体不会移动,只会影响其他刚体,自身不会被影响;动态刚体会随着重力下落,撞到其他物体上,可能被其他物体推动。
- 是否启用重力(Enable Gravity):表示当前刚体是否被重力影响。
- 静摩擦系数(StaticFriction):刚体表面的静摩擦系数,取值范围为[0,3.402823466e+38F]。
- 动摩擦系数(DynamicFriction):刚体表面的动摩擦系数,取值范围为[0,3.402823466e+38F]。
- 弹性系数(Restitution):刚体的弹性系数,此值越大弹性越好,取值范围为[0,1]。
注意:在主编辑器的编辑模式下,即便已经指定了刚体资源,也看不到物理模拟的效果。若想查看物理模拟效果,可以点击主编辑器工具栏的预览按钮,此时整个场景才会进行物理模拟。
下图中左侧的三角按钮为预览按钮,右侧的方块按钮为停止预览按钮。可通过SampleProject/ PhysicsRigidBody工程进行实践。
8. 骨骼网格模型的物理资源的使用
骨骼物理的原理是为骨骼模型的骨骼添加物理刚体,并为刚体之间加入约束,通过物理仿真模拟解算出物理刚体每一帧的姿态,将姿态更新到对应的骨头中,驱动模型。
8.1. 骨骼网格模型物理资源文件的生成
骨骼网格模型(AnimationMeshActor)绑定的物理资源文件也是phy格式的文件,不同于静态网格模型,骨骼网格模型的phy文件有如下两种生成方式:
一是在FBX模型所在路径下编写配置文件(txt文件,此文件中指明生成刚体的骨头,每个骨头一行),在CubeEditor编辑器中导入FBX模型时勾选“模型物理”生成phy文件。
以导入dog1模型为例,步骤如下:
- 在dog1.fbx所在目录下编写配置文件dog1.txt,在该文件中指定生成刚体的骨头名称。
- 在CubeEditor编辑器中导入dog1.fbx,导入过程时勾选“模型物理”,会自动根据dog1.txt配置文件的内容为模型生成物理资源文件。
二是在CubeEditor编辑器的资产面板中新建phy资源。选中资产的指定mdl文件,右键选择“创建骨骼物理资源(Create Skeletal PhysicsRes)”,即可创建新的骨骼物理资源文件,也就是phy文件。
右键选择“创建骨骼物理资源(Create Skeletal PhysicsRes)”,弹出一个对话框,如下图所示。
8.2. 骨骼网格模型的phy资源绑定
与静态网格模型类似,骨骼网格模型指定phy文件也是在Actor属性面板的物理信息属性中进行设置,默认不绑定任何物理资源。
此处以dog0资源为例,将dog01.mdl文件拖入到主场景,选中当前当前Actor,在其属性面板中指定物理资源文件。
同样在主场景编辑器的编辑模式下无法查看骨骼网格模型的物理模拟效果,若要查看其物理效果,不仅需要进入预览模式,还需要为当前Actor指定有易于观察的动画。
对比上面两幅图可见,右侧绑定物理资源的图中狗的右耳向下坠落。
8.3. 骨骼物理属性编辑窗口
双击骨骼物理资源打开的物理编辑器窗口不同于编辑柔体属性时打开的物理编辑器的窗口,此窗口主要包含骨架面板、主视口窗口、刚体属性面板和Actor属性面板。
骨架面板用于显示当前骨骼模型的骨架层级,包含骨骼名称、骨骼刚体名称及约束名称。在此可以查看特定骨骼及连接的刚体和约束、编辑刚体、形状和约束。
刚体属性面板用于显示在骨骼面板中选中的刚体属性、刚体形状属性或刚体约束属性。
Actor属性面板用于显示编辑当前Actor(模型)的动画播放属性、渲染参数等。
8.4. 骨骼物理刚体的增删
此处的物理刚体只能添加到模型的骨骼上,一个骨骼暂时只能添加一个刚体。在骨架树上,刚体的后缀名为“_Body”,并且不可二次编辑。在渲染窗口中,绿色的胶囊体代表物理刚体。
8.4.1. 骨骼物理刚体的添加
为骨骼添加刚体只需要在骨架树上选中当前骨骼名称,并且右键选择“创建刚体(CreateBody)”。注意:左侧图标为小人的一行才是骨骼名称。
创建刚体后,会直接在当前骨骼名称下生成一个名称为“同名_Body”的刚体节点及刚体形状节点。目前编辑器中,一个刚体支持一个胶囊形状。
8.4.2. 骨骼物理刚体的删除
从骨架树上选中待删除的刚体名称,右键选择“移除刚体(RemoveBody)”即可。
8.5. 骨骼物理刚体属性详解
目前物理编辑器中支持的刚体属性如下:
- 骨骼名称(Bone name):指明是哪根骨头的刚体,该属性不可编辑。
- 是否启用物理模拟(IsSimulatePhysics):指明该刚体是否开启物理模拟,默认为不开启,该属性可以编辑。
- 线性阻尼系数(LinearDamping):用于控制物理刚体抵抗平移的量,可以使刚体快速稳定下来。
- 角度阻尼系数(AngularDamping):用于控制物理刚体抵抗旋转的量,可以使刚体快速稳定下来。
- 静摩擦系数(StaticFriction):定义了两个刚体不横向移动时,表面之间施加的摩擦力,用于控制物体在该表面上滑动的容易程度,默认为0.5,取值范围为[0,3.402823466e+38F]。
- 动摩擦系数(DynamicFriction):定义了两个刚体相对于彼此移动时,表面之间施加的摩擦力,用于控制物体在该表面上滑动的容易程度,默认为0.5,取值范围为[0,3.402823466e+38F]。
- 弹性系数(Restitution):表示刚体表面的“弹性”,默认为0.5,取值范围为[0,1]。
8.6. 骨骼物理刚体形状属性详解
在骨架树上,刚体节点的子节点中名称包含“_Body_Shape”字符串的节点就是刚体的形状节点,刚体形状是在创建刚体时自动生成的,每个刚体只能包含一个胶囊形状,并且不能移除。
在骨架树上选中刚体形状节点,右侧刚体属性面板上会显示刚体形状的相关属性,如下如所示:
- 胶囊形状半径(CylinderRadius):胶囊体的半径。
- 胶囊形状高度(CylinderHeight):胶囊体的高度。
- 形状中心点(ShapeCenter):胶囊体的中心点坐标。
- 形状旋转(ShapeRotate):胶囊体的朝向。
胶囊形状半径和高度这两个属性可以编辑,如果刚体尺寸过大,可能会造成不合期望的碰撞,可以在这里适当缩小刚体的尺寸。8.7. 骨骼物理约束的增删
约束可以看做两个刚体之间的关节,用于将两个刚体绑定在一起并根据参数进行物理模拟(也可以直接成为关节),物理约束本质上是通过对刚体的各个自由度的移动限制来实现特殊的模拟效果。
在骨架树上,物理约束的名称格式为“当前刚体的骨骼名称:关联刚体的骨骼名称_Constraint”。在渲染窗口中,玫红色的球代表物理约束。
8.7.1. 创建约束
在骨架树上,选择待关联的刚体节点,右键选中“创建约束”,会显示出所有可以关联的其他刚体所属的骨骼名称。注意:一个刚体只能与当前刚体所属骨骼的父骨骼上的刚体创建约束,不能与同级骨骼的刚体或子骨骼的刚体创建约束。
8.7.2. 删除约束
在骨架树上,选择待移除的约束节点,右键选中“移除约束”即可。
8.8. 骨骼物理约束参数详解
约束可以看做两个刚体之间的关节,用于将两个刚体绑定在一起并根据参数进行物理模拟,物理约束本质上是通过对刚体的各个自由度的移动限制来实现特殊的模拟效果。在骨架树上,物理约束的名称格式为“当前刚体的骨骼名称:关联刚体的骨骼名称_Constraint”。
物理约束的属性如下:
- Bone1Name:物理约束关联的第一个刚体所属的骨骼名称。
- Bone2Name:物理约束关联的第二个刚体所属的骨骼名称。
- 关节显示尺寸(ConstraintSize):用于调整关节的尺寸,仅用来渲染,不会影响物理模拟,也不会被保存。
- 关节角度约束(Angular Limits):
- XZ平面最大旋转角(Swing1 Limit Degree):关节在XZ平面的最大旋转角,单位为角度。
- YZ平面最大旋转角(Swing2 Limit Degree):关节在YZ平面的最大旋转角,单位为角度。
- XZ平面上的约束类型(Swing1 Motion):关节在XZ平面上的约束类型,有三种:
- Free:完全自由,上面两个角度不起作用。
- Limited:有限制的,旋转角度约束在上面两个角度之内。
- Locked:锁住的,完全不可旋转,上面两个角度不起作用。
- YZ平面上的约束类型(Swing2 Motion):关节在YZ平面上的约束类型,同样包括Free、Limited和Locked三种类型。
- 约束强度(Stiffness):表示僵硬程度,该值越大,该关节越僵硬。
- 阻尼系数(Damping):表示约束的阻尼系数。
- 弹性系数(Restitution):表示约束的弹性。
- 关节扭曲约束(Twist Limits):
- Z轴上的最大旋转角(TwistLimitDegrees):关节在Z轴上的最大旋转角度,单位为角度。
- Z轴上的约束类型(TwistMotion):关节在Z轴上的约束类型,同样包括Free、Limited和Locked三种类型。
- 约束强度(Stiffness):表示僵硬程度,该值越大,该关节越僵硬。
- 阻尼系数(Damping):表示约束的阻尼系数。
- 弹性系数(Restitution):表示约束的弹性。 关于Swing1、Swing2和Twist约束的解释:以颈部关节为例,肩膀所在方向为X轴,人眼注视方向为Y轴,身体竖直方向为Z轴,那么Swing1即为左右摇头,Swing2即为前后摇头,Twist即为左右扭头。 关于上述所有的参数不清楚的部分,可参考UE4文档的相关介绍。