在PhysX中提供了模拟各种车辆行驶的接口。一些车辆运动的物理参数都可以通过该物理引擎设置后模拟现实中的车辆行驶。
首先会用到一个车辆的描述器VehiclDesc,它就像一个总的指挥长,负责整个车辆的运作。
1. 自身的物理特性,如车辆在场景中的所在位置、车辆自身的质量、车辆行驶的最大速度、车辆重心的位置、车辆的驱动力等。
2. 该描述器可以将轮胎描述器NxWheelDesc、车辆驱动描述器NxVehicleMotorDesc、车辆换档描述器NxVehicleGearDesc进行绑定。
3. 车身以及轮胎都是模型,关键就是如何将模型和Actor即描述器结合起来。在PhysX的demo中提供了一个函数AttachModelToActor,将创建的3D Max的模型和NxActor绑定起来。每个Actor都有自己的描述器,每个描述器又有各自的Shape。而Actor的只是一个物理空壳。但是VechiclDesc中又恰巧有成员变量接口,NxArray<NxShapeDesc*> carShapes;NxArray<NxWheelDesc*> carWheels;将ShapeDesc和WheelDesc加到各自的变量中。
4. 接着就是如何将车身和轮胎结合起来。我的想法是:将车身的Actor作为一个主要的角色,将轮胎的描述器通过函数将它的描述器和车身的Actor结合起来。都知道,在模型渲染的时候都是根据各自的shape,然后进行绘制。但是我之前知道PhysX提供的都是诸如盒子、圆、胶囊等形的函数接口。不过,PhysX同时也提高了轮胎的Shape。并且轮胎的位置可以通过轮胎描述器中的position变量进行设置。正是由于它支持轮胎的Shape,所以将轮胎和车身的actor绑定起来后,它的shape也将和actor绑定起来。一个actor可以有多个shape,正是由于shape通过shapes[shapeNum]来取得每个shape后进行渲染。
注意,shapeNum是从0开始的。随着绑定的顺序,shapeNum逐一增加。而
AttachModelToActor(NxActor* actor, char* file, NxU32 shapeNum, NxReal scale, NxReal angle = 0)
函数就是将指定的file的模型根据它在actor中shapeNum,原有模型尺寸和在场景中的角度位置,渲染成最后效果。