一.Mesh组件与物理之间的关系
关于UE物理的基本使用,官方文档以及我之前的文档已经做了较为详细的介绍。( 官方文档链接,UE4蓝图碰撞检测解析,UE4碰撞规则详解(2016.7.12更新))
这里主要是从代码方面,简单分析一下UE4里面的物理是如何使用与生效的,StaticMesh以及SkeletalMesh对应的物理都是如何产生与作用的。第三部分会涉及到一些PhyX引擎的内容,简单谈谈UE与PhysX间的交互。
首先,在游戏中常见的带有物理的物体一般有5种,胶囊体一类、静态网格物体StaticMesh、骨骼网格物体SkeletalMesh、Landscape地形以及PhysicsVolume(BrushComponent)。这5种类型本质上产生物理的规则都大同小异,为了方便我们只针对StaticMesh与SkeletalMesh来总结。
对于直接放在场景的石块等,通常是通过3D建模软件导入到引擎中的资产。导入到引擎资源文件夹后就石块模型就以UStaticMesh类存在于引擎中,从资源文件夹拖到场景中后场景中的该对象就变成了StaticMeshActor。对于带动画表现的玩家模型,是通过3D建模软件导入的带骨骼信息的资产。导入到引擎资源文件夹后就以USkeletalMesh类存在于引擎中,从资源文件夹拖到场景中后场景中的该对象就变成了SkeletalMeshActor。当然,单独把没有任何处理的SkeletalMeshActor放在场景中看起来就如一个StaticMeshActor一样,没有任何动画,也可能没有任何物理。
由于UE4提倡组件式的开发,Actor身上的很多特性都是通过组件提供的,所以物理数据都是挂在组件上的而不是Actor上。任何Actor上面都可以挂上N多个组件,因此一个玩家身上就可以有多个UStaticMeshCompnent与USkeletalMeshCompnent(一般还有一个胶囊体作为根组件)。举个简单的例子,玩家自身的模型是一个USkeletalMeshCompnent,然后身上的衣服装备就可以用一个UStaticMeshCompnent来表示。二者最大的差别就是SkeletalMesh可以产生动画。为了表现的更精确,他的每一个骨骼都可以产生对应的物理,而随着动画的变化他自身的每个骨骼物理也就需要跟随动画而改变,所以相比StaticMesh要复杂不少。
对于一个静态网格物体StaticMesh,他的物理一般在建模软件里面就应该创建好,导入到编辑器时UE就会根据导入的数据创建物理信息,当然UE4本身也提供了物理碰撞的创建,如图1-1所示。不过无论哪种做法,本质上都是在编辑器里给UStaticMeshComponent构建一个UBodySetup,在开始游戏的时候在创建运行时的基本物理数据UBodyInstance。
图1-1 UE编辑器添加碰撞
(UBodySetup与UBodyInstance:我个人理解UBodySetup就是一个静态的物理数据,一般在在游戏运行前就已经构建好了[当然,你在游戏运行时创建也没什么问题]。你可以理解为一个类,编译以后就存在了。而UBodyInstance是一个在游戏时真正起作用的物理数据,可以理解为通过这个类创建的对象,运行时才真正出现。通过一个UBodySetup是可以创建出多个UBodyInstance的)
而对于骨骼网格物体SkeletalMesh,由于数据比较多,他的物理数据存储在PhysicsAsset里面。在游戏运行的时候,SkeletalMeshComponent会读取物理资产里面的数据UBodySetup随后再通过UBodySetup给角色创建对应的基本物理数据UBodyInstance。再进一步深入就是NVIDA的PhysX物理引擎了(当然你也可以采用BOX2D物理引擎),这篇文档后面会有简单的讲解。
(UE4里面除了SkeletalMeshComponent.cpp以外还有SkeletalMeshComponentPhysics.cpp,PhysAnim.cpp用来专门处理SkeletalMeshComponent物理相关的逻辑)
图1-2 物理资产
下面的图片描述了Mesh、 Component与物理基本类的基本关系