PhysX SDK物理引擎开发包使用及获取c++源码教程

简介:

官方网站:

www.nvidia.cn

df248a24412283f4b794035416c6eb412f6e2305

github获取c++版本physx代码流程

第一步 注册账号:

https://developer.nvidia.com/physx-sdk

672569e8511e67a544bb259ef9e0f94ec2be982a

第二步:

f2381fb0683c65ba0b1e924954b6132fc8f5b49a

等待官方审核,正常会在第二天就可以再官网添加的GitHub账号下有

49547d9a53c4e9d23e16feb9c2357638ece8b518

社区/PhysX-3.3版本:

https://github.com/Golangltd/PhysX-3.3

社区/PhysX-3.4版本:

https://github.com/Golangltd/PhysX-3.4

AGEIA的PhysX处理器是世界上首款物理模拟处理器 (PPU), 该处理器将解除中央处理器进行物理模拟的负担。PhysX PPU 的设计构架基于顶点的多线程操作,允许游戏开发人员进行精确、流畅和动画创作和运动模拟,例如毛发、布料、液体、流体等。本文介绍了如何利用PhysX SDK物理引擎开发包来实现我们仿真的效果。

AGEIA的PhysX处理器是世界上首款物理模拟处理器 (PPU), 该处理器将解除中央处理器进行物理模拟的负担。PhysX PPU 的设计构架基于顶点的多线程操作,允许游戏开发人员进行精确、流畅和动画创作和运动模拟,例如毛发、布料、液体、流体等。目前 AGEIA 的PhysX处理器是世界上第一款也是唯一一款专注于物理算法处理器的产品.

利用PhysX SDK物理引擎开发包来实现我们仿真的效果时,一般需要以下几个步骤:

(1) PrintControls();

(2) InitGlut(argc, argv);

(3) InitNx();

(4) glutMainLoop();

(5) ReleaseNx();

其中最为主要的函数是InitNx(),也既是初始化PhysX,创建一个PhysX SDK实例以及建立我们的场景。下面具体分析各个函数的作用。

一.PrintControls();

显而易见,利用该函数的目的是在告诉玩家该如何进行操作。操作的按键可根据自己的喜好进行设置。

二.InitGlut(argc, argv);

PhysX是OpenGL上开发的,所以在初始化PhysX实例之前,必须建立一个OpenGL的框架。

①. glutInit(&argc, argv) 用来初始化GLUT,并且处理任意的命令行变量

②. glutInitWindowSize(int width, int size) 指定了窗口以像素为单位的尺寸

③. glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH) 建立一个带有双缓存、RGB颜色模型和很大缓存的窗口

④. glutCreateWindow(char* string) 创建一个具有OpenGL创建的窗口,string为该窗口的窗口名

⑤. glutSetWindow()

⑥. glutDisplayFunc(RenderCallback) 渲染


1ProcessCameraKeys();
2
3 SetupCamera();
4
5 if (gScene && !bPause)
6
7 {
8
9 GetPhysicsResults();

ProcessInputs();根据选择的对象,给该对象施加前后、上下、左右不同方向的力,然后调用对象的方法addForce,产生不同的物理效果

StartPhysics();

}

// Display scene

RenderActors(bShadows);

调用函数DrawActor(NxActor* actor)将场景中的物体渲染出来,实在是在DrawActor(NxActor* actor)函数中根据物体形状调用不同形状的绘画函数将物体渲染出来的。在渲染的过程中,利用显示列表绘制不同形状的物体。在PhysX中,物体形状分为以下几种:NX_SHAPE_PLANE(面板状), NX_SHAPE_BOX(盒子状), NX_SHAPE_ SPHERE(球形状), NX_SHAPE_CAPSULE(胶囊状), NX_SHAPE_CONVEX(凸多边形状), NX_SHAPE_MESH(网状状)。

当bShadows为true时,渲染物体的阴影;为false时就不绘制

DrawForce(box, gForceVec, NxVec3(1,1,0));

将物体受力的受力方向渲染出来

⑦. glutReshapeFunc(ReshapeCallback)

设置窗口

⑧. glutIdleFunc(IdleCallback);

⑨. glutKeyboardFunc(KeyboardCallback);

⑩. glutKeyboardUpFunc(KeyboardUpCallback);

⑪. glutSpecialFunc(SpecialCallback);

在此,调用ResetNx(),重新渲染

⑫. glutMouseFunc(MouseCallback);

⑬. glutMotionFunc(MotionCallback);

⑭. MotionCallback(0,0);

三.InitNx() 因为我们需要初始化PhysX SDK实例,并且建立我们需要的场景;所以我们需要设置以下几个变量,并且将它们设置为全局变量


1 NxPhysicsSDK*gPhysicsSDK = NULL;//PhysX SDK实例对象
2
3NxScene*gScene = NULL;//场景对象
4
5NxVec3 gDefaultGravity(0,-9.8,0);

***注意:坐标系的方向指向,在PhysX、OpenGL以及3DMax都有一些不一样,当运行里面的demo的时候就可以体会到。它们的坐标系分别如下:

ea8f9c6e488c311773fc279555cba7288b7520ab

下面就在InitNx()中开始初始化实例以及建立场景.

①. 实例化 physics SDK

gPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION);

初始化完Physics SDK后,只是简单的一个实例。可以通过设置实例的物理参数来充实我们的模拟效果.

gPhysicsSDK->setParameter(NX_SKIN_WIDTH, 0.01);

②. 创建场景


1 NxSceneDesc sceneDesc; //场景表述表对象
2
3 sceneDesc.gravity = gDefaultGravity;
4
5 sceneDesc.broadPhase = NX_BROADPHASE_COHERENT;
6
7 sceneDesc.collisionDetection = true;
8
9 gScene = gPhysicsSDK->createScene(sceneDesc);

在PhysX中,不管是创建场景还是创建各个物体角色时,都是先通过各自对应的描述器(翻译的不是很准确)设置场景和各个物体的物理参数,用来模拟真实的世界环境和物体。建立好表述器后,通过函数createScene(NxSceneDesc)函数就可以建立需要的场景对象。

一般情况下,场景描述器的参数就是设置重力加速度sceneDesc.gravity,是否进行碰撞检测collisionDetection, true为进行,在PhysX SDK中描述器被广泛的应用. 描述器包括所有你创建物体的信息broadphase-coherent是三种碰撞检测中的一种。

1gPhysicsSDK->setParameter(NX_SKIN_WIDTH, 0.01);

当相互碰撞的物体的材质都很软的时候,在现实中就会发现当发生碰撞的时候物体之间就会相互嵌入一部分,在这里我们就可以利用物理参数NX_SKIN_WIDTH,它的默认值为0.05m,该值越大,嵌入的就越多

同时,我们可以对场景中的所有物体创建材质。创建的材质定义了碰撞和物体材料的物理属性。比如反弹系数、静摩擦力、滑动摩擦力等。


1 // Create the default material通过材质索引创建一个材质的对象
2
3 NxMaterial* defaultMaterial = gScene->getMaterialFromIndex(0);
4
5 defaultMaterial->setRestitution(0.5);
6
7 defaultMaterial->setStaticFriction(0.5);
8
9 defaultMaterial->setDynamicFriction(0.5);
10
11
12
13创建物体,以box为例
14
15NxActor* box = CreateBox(NxVec3(5,1,0));
16
17NxActor* CreateBox(const NxVec3& pos)
18
19{
20
21 // Add a single-shape actor to the scene
22
23 NxActorDesc actorDesc;
24
25 NxBodyDesc bodyDesc;
26
27
28
29 // The actor has one shape, a box
30
31 NxBoxShapeDesc boxDesc;
32
33 boxDesc.dimensions.set(0.5,1,0.5);
34
35 actorDesc.shapes.pushBack(&boxDesc);
36
37
38
39 actorDesc.body = &bodyDesc;
40
41 actorDesc.density = 10;
42
43 actorDesc.globalPose.t = pos;
44
45 return gScene->createActor(actorDesc);
46
47}

我们创建一个角色参与者box,它的类型为NxActor*。建立该对象的时候需要设置它的描述器,然后利用函数createActor(NxActorDesc actorDesc)将该对象加入场景中。每一个对象又有和自己形状相对应的描述器。利用它设置对象的物理参数。boxDesc该描述器描述了该盒子的长、宽、高分别为0.5,初始化的位置以及该盒子的密度。

③. 创建完所有的物体对象时,调用UpdateTime()得到从上一帧渲染到现在经过的时间

④. 当创建的场景成功,利用函数StartPhysics()开始它的第一帧模拟。


1 void StartPhysics()
2
3{
4
5 // Update the time step
6
7 NxReal deltaTime = UpdateTime();
8
9
10
11 // Start collision and dynamics for delta time since the last frame
12
13 gScene->simulate(deltaTime);
14
15 gScene->flushStream();
16
17}
18
19simulate(deltaTime)是PhysX 解决物理学的关键
20
21 flushStream()对时间步进行仿真

四.glutMainLoop()

程序将一直停留在glutMainLoop()中,直到用户自己结束。当场景一旦被渲染后,在每次设置下一场景时,RenderCallback()回调函数将被调用

五.ReleaseNx()

删除场景中所有的物体对象以及场景本身


原文发布时间为:2018-06-24

本文作者:cserli

本文来自云栖社区合作伙伴“Golang语言社区”,了解相关信息可以关注“Golang语言社区”。

相关文章
|
9月前
|
C++
基本二叉树与排序二叉树(C++源码)
本程序实现二叉树基本操作与二叉排序树应用。支持前序建树、四种遍历、求深度、叶子数、第K层节点数及查找功能;并实现二叉排序树的构建、中序输出与查找比较次数统计,分析不同插入顺序对树形态和查找效率的影响。
|
10月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
920 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
402 2
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
1113 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
人工智能 自然语言处理 开发工具
HarmonyOS NEXT~鸿蒙开发能力:HarmonyOS SDK AI 全解析
本文深入解析HarmonyOS SDK中的AI功能集,涵盖分布式AI引擎、核心组件(NLP、计算机视觉等)及智能决策能力。通过代码示例与开发实践指南,帮助开发者掌握环境配置、性能调优及多场景应用(智能家居、移动办公等)。同时探讨性能优化策略与未来演进方向,助力构建高效分布式智能应用。
1399 9
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
1026 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
API 开发工具 Android开发
【01】完整开发即构美颜sdk的uni官方uts插件—让所有开发者可以直接使用即构美颜sdk的能力-优雅草卓伊凡
【01】完整开发即构美颜sdk的uni官方uts插件—让所有开发者可以直接使用即构美颜sdk的能力-优雅草卓伊凡
794 23
【01】完整开发即构美颜sdk的uni官方uts插件—让所有开发者可以直接使用即构美颜sdk的能力-优雅草卓伊凡
|
前端开发 JavaScript 开发工具
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
1090 5
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
存储 开发工具 开发者
揭秘 Microsoft.Docker.SDK:让容器开发更轻松的强大工具揭秘
随着云计算和容器技术的快速发展,`Docker` 已经成为容器化技术的事实标准。`Microsoft` 作为 `Docker` 的主要支持者和参与者,推出了 `Microsoft.Docker.SDK`,旨在帮助开发者更轻松地进行容器开发。本文将深入揭秘 Microsoft.Docker.SDK 的功能、使用方法以及它在容器开发中的应用。
421 13
|
JavaScript 编译器 开发工具
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
861 2
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡