PhysX 物理引擎研究(一)源码编译

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://linsh-tech.blog.csdn.net/article/details/94173345

前言

Unity 3D 中的物理引擎分为 2D 引擎和 3D 引擎两部分,其中 2D 引擎使用的 Erin Catto 写的是 Box2D,而 3D 引擎使用的的 NVIDIA 的 PhysX,在 Unity Editor 中打开 HelpAbout Unty 可以看到 "Physics powered by PhysX. (c) 2011 NVIDIA Corporation." 的字样。

Unity 历史 PhysX 版本

  • 2005 年,Unity 1.0 就使用 PhysX 作为物理引擎

  • 2010 年,Unity 3.0 版本将 PhysX 版本从 2.6 升级到 2.8

  • 2014 年,Unity 5.0 版本将 PhysX 版本从 2.x 升级到 3.3

       参考:UpgradeGuide5-Physics

  • Unity 2018.3 版本开始,Unity 将 PhysX 版本从 3.3.1 升级到 3.4.2

    主要提升了稳定性和性能,且增加了多世界支持

    参考:UpgradeGuide20183

  • Unity 2019.1 又加入了 Physics Debugger 工具

    用于可视化检查场景中几何图形的碰撞器,通过 Window > Analysis > Physics Debugger 打开

    参考:Physics Debug Visualization

 

PhysX 简介

PhysX 是 NVIDIA 旗下的物理加速技术,利用 GPU 的处理能力来执行复杂的物理效果计算,利用 CUDA 技术,由显示核心加速运算。

目前支持的平台有:Windows 、Linux 、Android ARM 、mac OS 和 iOS 。

Github 源码:在 NVIDIAGameWorks 官方的 Github 仓库中有两份源码:

目前主流的已集成了 PhysX 的游戏引擎有:Unity 3D 、Unreal Engine 3/4 等。(数据来源 phyxinfo

更多 PhysX 的资讯可以查看官方网站 physxinfo.comphysx 总览

 

下载 PhysX 源码

从 Github 上下载 PhysX 4.0 源码:

$ git clone https://github.com/NVIDIAGameWorks/PhysX.git

工程有点大,大概 1.26G 左右,当然也可以直接下载 release 版本的压缩包:PhysX-4.0.0.zip ,然后解压

下载完毕,工程目录如下:

├─ PhysX
│  ├─ externals
│  ├─ kaplademo
│  └─ physx
│  └─ pxshared

下面是将 PhysX 引入我们自己的工程中的步骤,大致参考了 PhysXSetup.pdf

 

安装 DirectX SDK

假如只是想编译得到 SDK 的核心库,则不必安装此 SDK ,因为此 SDK 只在源码中的示例中被使用,即源码中提供的一个 demo 工程。符合要求的版本:Microsoft DirectX SDK 2010 年 6 月份及之后的版本,直接下载 DirectX SDK 9.29.1962 June 2010 ,然后双击进行安装即可,似乎只能装在 C 盘,其他盘装不了。

然而,我在安装 DirectX 的过程中出现了 Error Code:s1023 导致安装失败。

原因分析:

DirectX 安装过程中会顺便安装 Microsoft Visual C++ 2010 x86 Redistributable - 1010.0.30319 组件,而电脑中已经存在比此版本更高的 C++ Redistributable ,我在控制面板看了一下,由于我安装了 VS 2010 、VS 2015 和 VS 2017 ,并且都安装了 C++ 支持相关的 SDK,因此我电脑中 C++ Redistributable 的版本也有很多个:

看起来简直是噩梦,但其实跨大版本是不会冲突的。

解决方案:

因此只需要先卸载 Microsoft Visual C++ 2010 x86 Redistributable - 1010.0.40219 即可,包括 x64 和 x86。然后,再重新安装 DirectX 。

其实回退版本影响并不大,当然,假如还希望安装被卸载掉的 C++ 组件,可以从 Microsoft Visual C++ 2010 Service Pack 1 Redistributable Package MFC Security Update 下载安装。

更多 C++ Redistributable 版本可以在这里下载: Visual C++ Redistributable Packages and Related Registry Entries

 

SDK 编译源码

根据 官方文档 readme_windows 指出的编译要求:

  • CMake 3.12 或以上版本

  • Python 2.7.6 版本

这里我使用的是 CMake 3.13.0-r3 和 Python 2.7.9 ,具体编译步骤如下:

  • 进入工程的 physx 目录,运行 generate_projects.bat 来生成 VS 解决方案,可以进入编译选择界面:

    E:\C++\libs\PhysX-4.0.0\physx>exit /b 0
    Preset parameter required, available presets:
    (0) android <--- Android-19, armeabi-v7a with NEON PhysX SDK
    (1) vc12win32 <--- VC12 Win32 PhysX general settings
    (2) vc12win64 <--- VC12 Win64 PhysX general settings
    (3) vc14win32 <--- VC14 Win32 PhysX general settings
    (4) vc14win64 <--- VC14 Win64 PhysX general settings
    (5) vc15win32 <--- VC15 Win32 PhysX general settings
    (6) vc15win64 <--- VC15 Win64 PhysX general settings
    Enter preset number:

    除了第一个 android 版本外,其余的都是 windows 平台下使用的,vc 版本对于 VS 编译器版本大致关系如下:

    Visual Studio 2013 : vc12 
    Visual Studio 2015 : vc14 
    Visual Studio 2017 : vc15

    这里我选择 6 ,则生成的工程用 VS 2017 打开,编译生成用 64 位的库。

  • 工程生成成功后,在 physx/compiler 目录下会多出一个 vc15win64 的目录:

    假如当前已安装了 VS2017 ,直接双击打开 PhysXSDK.sln 文件 。

     

  • 编译全部:

    然后依次选择菜单:调试 > 开始执行

    结果出现 3 个错误:

    58>------ 已启动生成: 项目: ALL_BUILD, 配置: debug x64 ------
    58>Building Custom Rule E:/C++/libs/PhysX-4.0.0/physx/compiler/public/CMakeLists.txt
    58>CMake does not need to re-run because E:/C++/libs/PhysX-4.0.0/physx/compiler/vc15win64/CMakeFiles/generate.stamp is up-to-date.
    ========== 生成: 成功 55 个,失败 3 个,最新 0 个,跳过 0 个 ==========

    查看输出日志,3 个错误分别是:

    29>已完成生成项目“SamplePlatform.vcxproj”的操作 - 失败。
    ...
    30>已完成生成项目“SampleRenderer.vcxproj”的操作 - 失败。
    ...
    44>已完成生成项目“Samples.vcxproj”的操作 - 失败。
    ...

    而导致失败的原因是:

    : fatal error C1083: 无法打开包括文件: “d3dx9.h”: No such file or directory

    这是因为源码中的 demo 依赖 DirectX SDK ,解决步骤如下:

    解决方案资源管理器 中分别选择报错的三个工程:SamplePlatformSampleRendererSamples右键 > 属性

    • 设置 include 目录

      C/C++ > 常规 > 附加头文件 ,进入编辑状态然后添加 DirectX SDK 安装目录中的 include 目录: C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include

    • 设置 lib 目录

      库管理器 > 常规 >附加库目录Samples 不是静态链接库,因此是 链接 > 常规 >附加库目录 ),进入编辑状态,添加目录 DirectX SDK 安装目录中的 Lib目录:C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib

    完成上述配置后,重新生成,输出如下表示编译完成了:

    59>------ 已跳过全部重新生成: 项目: INSTALL, 配置: release x64 ------
    59>没有为此解决方案配置选中要生成的项目 
    ========== 全部重新生成: 成功 58 个,失败 0 个,跳过 1 个 ==========

 

运行示例

physx\bin\win.x86_64.vc141.mt\debug 目录下会生成很多 .exe 文件,这些都是官方提供的示例,可以直接双击运行。例如 Samples_64.exe 运行结果:

 

参考

展开阅读全文

没有更多推荐了,返回首页