对于一个游戏角色来说,如果衣服、装饰、头发都使用动画而非物理仿真会给玩家很不真实的感觉,从而造成代入感下降、游戏体验下降。为了让这些“预先决定进展是不可能的”元素能获得期望的效果,让它们作物理仿真就成了必不可缺的步骤。

本文将使用PhysX布料技术让头发、衣服具有物理仿真(我这个月效率很低,大概这就是所谓的“瓶颈”?还是说我又“三分钟热度”了?果然还是缺少毅力么…)下图展示了关闭/启用布料仿真的对比:

PhysX_Cloth_OFF_ON

可以很明显的看出区别,左边由于没有启用物理仿真而是服装出现“违和感”,右边则表现出期望的效果。(本来是想做视频教程的,但还是偷懒了…)

注:建议配合《UDN:布料参考指南》《UDN:UE3中的APEX Clothing》阅读本文口味更佳;有关APEX技术的介绍请参见此处,详细信息请访问nvidia APEX

基本操作流程:

  1. 为了使布料仿真正常的执行,您需要分配正确的权重到需要仿真的骨骼上(涉及额外的内容,本文不作介绍);
  2. 在UDK中打开需要仿真的SkeletalMesh,勾选AnimSet编辑器属性面板SkeletalMesh选项卡中的“Force CPUSkinning”;截图 
  3. 在Cloth选项卡中的Cloth Bones添加需要仿真的骨骼名称;截图
  4. 在AnimSet编辑器中进行布料仿真,同时调整Advanced Cloth和Cloth选项卡中的属性,直至需要的效果,保存;
  5. 设置SkeletalMesh的PhysicsAsset,勾选“Has Physics Asset Instance”(可选步骤);截图
  6. 勾选 Enable Cloth Simulation和Cloth Awake On Startup,设置Cloth Wind;截图
  7. 勾选 Block Rigid Body,设置RBCollide With Channels通道,保存。截图

以上是UDN给出的PhysX布料操作流程,但这个流程是以一个放置到世界的SkeletalMeshActor进行描述的,并没有具体说明如何在UnrealScript中启用布料仿真,这可能对初学者造成一些困扰。下面将介绍如何通过UnrealScript在Pawn类中启用角色的PhysX布料物理仿真,这也是本文的重点所在。

直接给出代码:

//以下代码中有关布料的属性均已加注释//...省略代码... defaultproperties { Begin Object Class=SkeletalMeshComponent Name=BodySkeletalMeshComponent//创建骨架网格物体组件 SkeletalMesh=SkeletalMesh'BSA_People.BodySkeletalMesh.60054_HongMen_KunF_FBX' PhysicsAsset=PhysicsAsset'BSA_People.BodyPhAsset.00002_StartClothes_KunN_Physics'//赋予物理资源 AnimTreeTemplate=AnimTree'BSA_People.BodyAnimTree.ATK_BladeMaster_Kun_AnimTree' AnimSets(0)=AnimSet'BSA_People.BodyAnimSet.Move_BladeMaster_Kun_AnimSet' AnimSets(1)=AnimSet'BSA_People.BodyAnimSet.SkillStandard_Kun_AnimSet' Scale=2 bHasPhysicsAssetInstance=true //为了使碰撞能够正常的工作,设置bHasPhysicsAssetInstance为True bEnableClothSimulation=True //启用布料仿真 bClothAwakeOnStartup=True //在开始时激活布料 ClothWind=(X=10,Y=20,Z=-50) //设置布料风大小,是一个三维向量,可选 BlockRigidBody=true //阻挡刚体 bCacheAnimSequenceNodes=false AlwaysLoadOnClient=true AlwaysLoadOnServer=true bOwnerNoSee=true CastShadow=true bUpdateSkelWhenNotRendered=false bIgnoreControllersWhenNotRendered=true bUpdateKinematicBonesFromAnimation=true bCastDynamicShadow=true RBChannel=RBCC_Untitled3 RBCollideWithChannels=(Default=True,GameplayPhysics=True,EffectPhysics=TRUE,Cloth=True,BlockingVolume=TRUE,ClothingCollision=TRUE) //RBCollide With Channels通道设置,这里决定哪些actor可以和布料进行交互(碰撞) LightEnvironment=MyBSALightEnvironment bOverrideAttachmentOwnerVisibility=true bAcceptsDynamicDecals=false TickGroup=TG_PreAsyncWork MinDistFactorForKinematicUpdate=0.2 bChartDistanceFactor=true RBDominanceGroup=20 bUseOnePassLightingOnTranslucency=true bPerBoneMotionBlur=true End Object BodySkeletalMesh=BodySkeletalMeshComponent Components.Add(BodySkeletalMeshComponent) Mesh=BodySkeletalMeshComponent //...省略代码... }

只要操作正确,相信您在游戏中将看到布料以物理仿真的方式在运行。

如果您希望头发也在游戏中进行物理仿真,只需要将头发看作布料来操作,方法完全一样,最多需要调整一下cloth或Advanced Cloth选项卡中的属性,以使仿真看起来更加真实。祝您顺利~