`
javababy1
  • 浏览: 1245445 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

PhysX官方手册翻译(Character Controller)

阅读更多

Character Controller

Character Controller – Creation

创建一个角色控制器,第一步要做的事情是决定边界体。就目前来说,PhysX只支持立方体(NxBoxController)和胶囊(NxCapsulesController)。

第二,创建一个控制器管理器(controller manager)。如:

NxControllerManager* gManager = NxCreateControllerManager(myAllocator);

注意:控制器管理器是单件(同一时间只存在一个实例)。

第三、创建一个角色控制器。如:

NxScene* scene;

NxCapsuleControllerDesc desc;

<填充控制器描述符>

NxController* cpController = gManager->createController(scene,desc);

当你不需要控制器管理器的时候,应该释放它。

NxReleaseControllerManager( gManager);

注意:以前的类名“ControllerManager”现在也有效,但是不建议使用,并且它将在下一个版本被取消掉。

Character Controller - Update

每一贞都可以调用以下函数来移动角色。

NxController::move(constNxVec3& disp,

NxU32 activeGroups,

NxF32 minDist,

NxU32& collisionFlags,

NxF32 sharpness=<chmetcnv w:st="on" unitname="F" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0">1.0f</chmetcnv>,

const NxGroupsMask* groupsMask=NULL);

Disp 位移向量

activeGroups 碰撞组掩码

minDist:最小距离,角色的位移低于这个值将不发生位移。

collisionFlags:碰撞检测类型掩码

sharpness:锐度?

groupsMask?

Graphics Update

在每一贞里,可以通过角色控制器的position信息来保持外观模型的位置同步。一个控制器从来都不管旋转的事。因此也只能得到位置相关的信息。如:

const NxVec3& NxController::getPosition() const;

把这个信息传递给你的世界坐标矩阵,然后去渲染,这样你的角色位置就是经过碰撞检测修正过的,并且表现出更加平滑的移动。

Character Controller - Volume

角色使用的边界体只限于PhysX提供的标准几何体。

目前只支持2种不同的形状:

AABB:轴对齐的边界盒。由一个position和一个extents向量定义。这个盒子不会随着角色的旋转而旋转,始终是与世界的XYZ 3个轴对齐的。

Capsule:胶囊。由一个position, 一个 height 一个 radius定义。(2个球+1个圆柱)。它可以获得更加平滑的移动,但是也会稍微多花些CPU时间。

注意:在版本2.3之前,有一个 球型控制器 NxSphereController,但是自从有了胶囊,它就被抛弃了。

注意:两种控制器都使用 Sweep API ,这就意味着并不是所有的可碰撞的形状都可以用于角色运动,只有那些可以被扫描的形状才能用于角色运动的判定。

角色碰撞体周围有一层被定义为“皮肤”,它被用来决定是否与其他形状有接触。皮肤的厚度由用户定义。如果为了Debug而显示角色碰撞体,别忘了还有个皮肤的概念。

AABB相关变量:

NxControllerDesc::position

NxControllerDesc::skinWidth

NxBoxControllerDesc::extents

Capsule相关变量

NxControllerDesc::position

NxControllerDesc::skinWidth

NxCapsuleControllerDesc::radius

NxCapsuleControllerDesc::height

关于AABB的一些解释:

皮肤:外表面

Extents:内表面

Character Controller - Auto-Stepping

如果没有自动上台阶(跨越障碍)的功能,地面上一个非常小的台阶都会阻挡角色的移动。显然这不自然,因为如果台阶不是很高的话,我们可以轻松的走上去才对。但是台阶太高了的话,就不应该走上去。这个界定值由以下变量给出:

NxControllerDesc::stepOffset

为了实现自动上台阶,PhysX需要知道“上”的方向。当前PhysX只支持3个轴向向量:

NX_X ( 1, 0, 0 )

NX_Y ( 0, 1, 0 )

NX_Z ( 0, 0, 1 )

相关的变量为:

NxControllerDesc::upDirection

Character Controller - Walkable Parts

默认情况下,角色可以走到任何地方。不过在现实世界总是有限制存在。因此,“不允许在角度很大的多边形上走”的限制就有存在的必要。只要用户给出角度界定,PhysX就可以自动的把多边形分为“可以在上面行走的”和“不可以在上面行走的”。将来可能把检测级别推到三角面级别的精确度。

可以通过以下变量来设置界定值:

NxControllerDesc::slopeLimit

它是角度的cos。下面的代码规定了只有小于45度的多边形上才可以行走:

slopeLimit = cosf( NxMath::degToRad(<chmetcnv w:st="on" unitname="F" sourcevalue="45" hasspace="False" negative="False" numbertype="1" tcsc="0">45.0F</chmetcnv>));

如果值设置为<chmetcnv w:st="on" unitname="F" sourcevalue="0" hasspace="False" negative="False" numbertype="1" tcsc="0"><span lang="EN-US"><font face="Times New Roman">0.0f</font></span></chmetcnv>,该特性就自动关闭(那样的话,角色哪都能走了)

这个特性并不总是需要的。一个更加普遍的做法是关掉这个特性,然后使用看不见的墙来限制角色的运动范围。

Character Controller - Volume Update

有时候实时的改变角色碰撞体的大小非常有用。比如如果你的角色可以蹲下,那么如果可以把碰撞体的高度减少的话,就可以移动到之前不能去的地方了

角色控制库支持动态更新碰撞体。但是如果不经过检测就直接改变碰撞体大小,很可能会使碰撞体在设置完之后与其他几何体相交或重叠。为了避免这种情况,首先应该调用PhysX为此准备的一些API来进行测试,保证碰撞体有足够的空间来更改大小,只有通过这些API检测之后,才对碰撞体进行更新。

AABB相关的函数:

bool NxBoxController::setExtents( const NxVec3& extents) = 0;

跟胶囊相关的函数:

bool NxCapsuleController::setRadius(NxF32 radius) = 0;

bool NxCapsuleController::setHeight(NxF32 radius) = 0;

相关的检测函数:

bool NxScene::checkOverlapSphere();

bool NxScene::checkOverlapAABB();

bool NxScene::checkOverlapCapsule();

Character Controller - Callbacks

当控制器发生一些事件的时候,可以设置回调函数。(比如当一个角色撞到了一个形状,或者另外一个角色)

当一个角色碰撞了另外一个形状,可以得到以下信息:

1、 当前控制器

2、 被碰撞的形状

3、 碰撞点

4、 碰撞点的法向量

5、 一个特征码(比如三角形序号)

6、 额外的运动数据。

这些信息可以应用于游戏的其他方面,比如播放音效、渲染细节、应用作用力或者别的什么。

注意:现在还不是所有的信息都可以得到,这取决于角色撞上了什么样的形状。最终会支持所有的形状。

当一个角色碰撞了另外一个角色,比如一个角色撞到了一个NPC,可以得到以下信息:

1、一对控制器

Character Interactions

在游戏中,根据回调函数中返回的不同的动作编号,会产生不用的行为。例如PhysX要是觉得角色足够强壮,那他就可以推动某些箱子。

现在支持的动作编号如下:

NX_ACTION_NONE => 不允许物理(角色推不动对象)

NX_ACTION_PUSH => 允许物理(角色推的动对象)

如果给接触点一个作用力,物理引擎就会模拟出自然的推动过程,听起来是非常Cool的。不过这个特性对游戏来说可能会起反作用。边界体的形状是人为控制的,但是你不希望因为从Box控制器切换到Capsule控制器而导致了推动的效果发生变化。推动的效果应该游戏说了算。因此通常比较好的办法是在回调函数中给接触点一个作用力,而不是完全交给物理引擎去计算。另外如果是个胶囊的话,也很难推动一个盒子,因为你几乎不可能对着盒子的中间,推动盒子就会使盒子旋转,虽然你可能只是想把盒子沿直线推一点点。

注意:NX_ACTION_PUSH 当前还没有实现,例子中的效果是使用碰撞时提供的信息来实现的。

Character Controller - Hidden Kinematic Actors

角色控制库 为每个角色创建了一个隐藏的运动学Actor。有时候这就是引起Actors数量混乱的原因。因此可能得到一个错误的Actor数量,或者在查询Actor的时候,返回了一个未知的Actor

当角色控制器处理角色移动的时候,也会同步这个Actor

可以通过以下函数得到这个Actor

NxActor* NxController::getActor() const;

不过,应该避免直接操作这个Actor,这会导致问题。不过只是读取信息则没有问题。

Character Controller - Time Stepping

NxCharacter 库里对Actor的操作跟普通的Actor没什么区别。精确的讲,他们使用相同的时间片策略(定长/变长)。当使用定长时间片策略时,会造成一些麻烦。因为NxController总是使用变长时间片策略(大多数情况下,是每贞的间隔)。因此在这种情况下NxController对象并不会跟Actor对象总是精确的同步。

分享到:
评论

相关推荐

    physx3.2手册

    《PhysX 3.2 手册》是针对NVIDIA的PhysX物理引擎的一个详尽指南,该引擎广泛应用于游戏开发和其他实时三维交互应用中。本手册分为两个主要部分,即"PhysXGuide.chm"和"PhysXAPI.chm",涵盖了PhysX 3.2.4版本的所有...

    [PhysX] PhysX 物理建模 学习教程 (英文版)Learning Physics Modeling with PhysX.pdf

    本教程是关于如何使用PhysX物理引擎进行物理建模的学习资源。PhysX是NVIDIA开发的一套用于计算机游戏和其他应用程序中物理模拟的硬件加速API,它支持广泛的物理模拟任务,包括碰撞检测、刚体动力学、软体动力学、...

    visual mfc opengl physx c++

    标题 "visual mfc opengl physx c++" 描述了一个基于Microsoft Foundation Classes (MFC)、OpenGL图形库和NVIDIA的PhysX物理引擎的C++项目。这个项目旨在展示如何在Visual C++环境下,整合这三种技术来创建一个3D...

    PhysX-9.13.1220-SystemSoftware

    PhysX 是 NVIDIA 推出的一款高性能物理运算引擎,主要用于游戏和其他实时三维图形应用中的物理模拟。这个"PhysX-9.13.1220-SystemSoftware"是PhysX的系统软件组件,包含了运行PhysX驱动和支持所需的基础架构。 在...

    PhysX直接运行DEMO

    PhysX是一款由NVIDIA开发的物理模拟引擎,广泛应用于游戏开发和其他实时三维图形渲染场景,为虚拟世界带来更真实的物理效果。"PhysX直接运行DEMO"是指包含了一系列可以直接执行的示例程序,用于展示PhysX引擎的功能...

    nVidia Physx SDK 2.8.4

    《深入理解nVidia PhysX SDK 2.8.4:构建实时三维物理模拟系统》 nVidia PhysX SDK 2.8.4是一款由nVidia公司开发的高性能物理引擎,它专为实现复杂、逼真的实时三维物理模拟而设计。在游戏开发、虚拟现实应用以及...

    ALI213-PhysX

    《ALI213-PhysX》是一款由ALI213团队分享的PhysX物理引擎软件包。PhysX是NVIDIA公司推出的一款强大的实时三维物理运算引擎,它为游戏开发者提供了一套高效的物理模拟解决方案,使游戏中的物体运动、碰撞、破坏效果...

    PhysX_9.10.0513

    PhysX 是 NVIDIA 推出的一款物理运算引擎,用于在计算机游戏中实现逼真的物理效果,如物体碰撞、重力、动态运动等。PhysX_9.10.0513 版本是该引擎的一个较早版本,发布于2010年5月13日。这个版本可能对一些旧游戏...

    PhysX: PhysX Visual Debugger (PVD)

    The PhysX Visual Debugger (PVD) provides a graphical view of the PhysX scene and includes various tools to inspect and visualize variables of every PhysX object. Additionally it can also record and ...

    PhysX.Net 0.12 for NVIDIA PhysX 2.8.4.5

    PhysX.Net 0.12 是一款针对NVIDIA PhysX 2.8.4.5版本的.NET封装库,它为.NET开发者提供了便利的接口,用于在游戏或模拟环境中实现复杂的物理效果。这款库特别强调了与XNA 4.0框架的兼容性,为XNA游戏开发带来强大的...

    Learning Physics Modeling with PhysX

    《Physics Modeling with PhysX》是一本专注于利用PhysX引擎进行物理建模的学习教程。PhysX是由NVIDIA开发的一款强大的实时物理模拟系统,广泛应用于游戏开发、视觉特效制作以及虚拟现实等场景。本教程以英文版呈现...

    OSG + PhysX物理引擎示例代码

    PhysX是NVIDIA公司开发的一个强大的物理引擎,用于模拟真实世界的物理行为,如碰撞检测、刚体动力学等。将OSG与PhysX结合,可以创建出更加逼真的3D环境和交互体验。 在"OSG + PhysX物理引擎示例代码"中,我们可以...

    PhysX物理引擎实例

    PhysX物理引擎是一款由NVIDIA开发的高性能物理模拟软件开发工具包(SDK),它被广泛应用于游戏开发和其他实时三维互动应用中。PhysX引擎能够帮助开发者实现复杂的物理效果,如物体碰撞、刚体动力学、流体模拟等,...

    PhysX C#包装库

    PhysX C#包装库是一个专为C#开发者设计的接口,用于利用NVIDIA的PhysX物理引擎进行游戏和模拟应用的开发。PhysX是业界广泛使用的实时3D物理引擎,它能够提供高度真实感的碰撞检测、刚体动力学和软体模拟。这个包装库...

    PhysX-mod-1.05

    PhysX-mod-1.05 是一个针对游戏和图形处理的增强模块,旨在使AMD和Nvidia显卡能够协同工作,充分利用PhysX物理引擎的潜力。PhysX是Nvidia开发的一种广泛应用于游戏中的实时物理计算技术,它可以为游戏带来更真实的...

    PhysX入门教程

    ### PhysX入门教程知识点详解 #### 一、PhysX简介及安装配置 ##### 物理引擎概述 在游戏开发和模拟应用领域,物理引擎扮演着至关重要的角色,它能够为虚拟世界提供逼真的物理效果。国际上知名的物理引擎包括Havok...

    PhysX必装显卡加速软件.rar

    PhysX是一种先进的物理运算引擎,由NVIDIA公司开发,主要用于游戏和实时三维图形应用中,为游戏中的物体运动、碰撞、布料模拟等提供真实的物理效果。它利用GPU的并行处理能力,将复杂的物理计算从CPU转移至GPU,从而...

    Physx3.3 source code

    对于如何运行 PhysX 源代码,可能需要参考官方文档、教程以及社区论坛。通过阅读源代码,开发者可以深入理解物理引擎的工作原理,从而进行定制化开发。 10. **自定义扩展**: PhysX 的源代码开放给了开发者更多的...

    physx3.2 sdk(3)

    PhysX是NVIDIA开发的一款高性能物理模拟引擎,广泛应用于游戏开发、实时三维渲染等领域,为虚拟世界中的物体运动提供真实感的模拟。 PhysX 3.2是该引擎的一个重要版本,提供了诸多改进和优化,使得物理效果更加逼真...

    Ogre_Physx_Ball_Game

    《Ogre PhysX 台球游戏开发详解》 在计算机图形学领域,游戏开发是一项集技术与创意于一体的挑战。本文将深入探讨一个基于Ogre渲染引擎和PhysX物理引擎开发的台球小游戏——"Ogre_Physx_Ball_Game"。通过这个项目,...

Global site tag (gtag.js) - Google Analytics