Array王锐大神力作:osg与PhysX结合系列内容——第1节 PhysX核心功能及基本程序结构介绍

〖Array王锐大神力作〗osg与PhysX结合系列内容——PhysX核心功能及基本程序结构介绍

本节内容

下载和编译PhysX

介绍

  • PhysX比较经典的版本是3.3和3.4版本,其中3.4版本至今仍然保持一些细节和补丁的更新
  • PhysX 4已经于2018年左右发布,不过因为库结构差异较大,本文暂时并没有更新到4版本
  • PhysX 5已经在宣传过程中(包含了柔体,布料,流体等诸多新内容),未来如果继续保持开源,那么也许我们会直接跳到5版本的支持
  • PhysX 3/4的本体之外,还通过APEX库来实现布料,破碎等系统的支持,但是因为APEX库过于复杂晦涩,相关资料也很少,本文不会主动对它进行研究

步骤

  • 首先在NVIDIA Developer Center注册
  • 然后登录:https://github.com/NVIDIAGameWorks/PhysX/tree/3.4
  • 直接下载或者签出代码,然后进入:PhysX_3.4\\Source\\compiler\\vc15win64(假设为VS15版本,64位系统;其它系统可以选择compileer下其它的子文件夹)
  • 打开PhysX.sln解决方案,选中右侧所有的工程,右键点击属性->C/C+±>代码生成->运行库,修改为/MD(release)或者/MDd(debug),这是为了和OSG依赖库对应
    在这里插入图片描述

PhysX的核心功能

  • 刚体物理(Rigid Body Dynamics):
    实际固体的理想化模型,即在受力后其大小、形状和内部各点相对位置都保持不变的物体。在任何力的作用下,体积和形状都不发生改变的物体。这也是游戏物理引擎最常见的一类对象。
  • 角色控制器(Character
    Controllers):游戏中的角色互动操作,连续碰撞检测(CCD),运动和跳跃操作,Kinematic运动学控制等。
  • 场景查询(Scene
    Query):对物理场景进行交集测试并反馈单个或者多个查询结果,支持射线求交(raycast),形状扫掠(sweep)和覆盖区域(overlap)三种求交测试的方式。
  • 车辆动力学(Vehicle
    Dynamics):四轮和六轮车辆的仿真模拟,包括底盘和轮子的物理运动控制,手动挡/自动挡控制,悬挂系统模拟等。
  • 关节系统(Joints):两个物理刚体之间的连接和相互运动关系,典型的关节系统例如门闩,铰链,或者人体关节等。

自学参考资料
https://docs.nvidia.com/gameworks/content/gameworkslibrary/physx/guide/Manual/Index.html

PhysX的基本程序结构

初始化过程:

  • 创建PxFoundation对象:该对象用于构建PhysX中的基本元素,分配和管理内存空间等。
  • 构建PxPhysics对象:该对象即PhysX的核心管理器,用于创建各种物理组件,以及关联PVD(可视化调试工具)等。
  • 构建PxCooking对象:用于自动“烘焙”生成几何体对应的物理碰撞体(例如凸包/hull),并管理相关数据。复杂几何形体的物理碰撞体通常是简单的,以便保证物理运算的效率。
  • 加载扩展库对象:PhysX中采用模块化的方式加载一些非系统核心的组件,例如粒子,高度图,布料等,加载扩展库对象可以在运行时将这些模块加载到系统中使用。

场景核心元素:

  • PxScene:物理场景的定义。
  • PxActor:角色节点基类,最常用的例如PxRigidActor,即刚体角色。
  • PxShape:角色的形状定义基类,即角色的物理碰撞体(立方体,球,胶囊体,凸包,三角网格等)。
  • PxMaterial:角色形状的物理材质,例如它的摩擦力等属性设置。

PxRigidActor的派生类:

  • PxRigidStatic:静态刚体
  • PxRigidBody:动力学刚体
  • PxRigidDynamic

主循环:

  • PxScene::simulate()仿真运行当前场景
  • PxScene::fetchResults()获取仿真运行的结果并记录到具体对象中

系统销毁过程:

  • PxPhysics::release()
  • PxFoundation::release()

PhysX与OSG结合的方式

紧耦合的方式:

  • 将物理角色类与OSG的Transform类合并,产生一个新的PhysicsNode类;
  • 根据它的子节点几何体信息构建对应的物理碰撞体,注册到物理场景中并仿真运行;
  • 仿真结果在当前帧的图形frame()中被关联到Transform,并改变物体的空间位置姿态。

松耦合的方式:

  • 物理角色类与OSG场景节点分别创建和分别管理;
  • 建立一个UpdateCallback,负责将物理角色的仿真结果传递给OSG节点;
  • PhysX对象负责物理仿真,OSG对象负责结果显示,两者泾渭分明。

考虑到非侵入式的场景结构设计,本文推荐松耦合的方式来实现两者的结合。对于OSG的场景结构不会有本质上的影响。最重要的是,把OSG当作一个可扩展也可调换的渲染的组件来使用,而不是一切以一个渲染引擎为核心去设计程序结构。

基本对象的转换:osg::Matrix <-> PxMat44 <-> PxTransform,osg::Vec3 <-> PxVec3

下载和编译osgPhysX

  • 工程地址:https://github.com/xarray/osgPhysX.git
  • 基本依赖:OpenSceneGraph 3.x,PhysX 3.4
  • 运行环境:Windows x86/x64。核心代码是可以移植到其它系统环境的(Win/Linux/OSX/Android),不过部分内部依赖库(例如OIS和DInput)可能需要重新编译或者替换。
  • PhysX编译后的结果自动保存在根目录PhysX_3.4的Include,Lib,Bin子目录中,通过CMake中的PHYSX_SDK_ROOT来设置根目录位置,通过PHYSX_LIBPATH_PREFIX来设置编译时所用的环境(本文用的是vc15win64)。
  • 编译和INSTALL完成后,将PhysX_3.4/Bin/vc15win64中的dll库拷贝到运行目录中,然后可以测试示例程序效果。

这个工程大约是7年前建立的,当时只是为了个人爱好,没有做任何的宣传推广;不过结构上是比较合理的,当时用的是PhysX 3.2/3.3版本,和3.4版本的变化不大。
这一次让它重现天日,并且制定了比较详细的后续开发和教程计划,也是希望能够进一步挖掘发现OSG和PhysX的价值,能够为有需要的朋友所用。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片