下面是从Newton dynamic的源文件中找到的函数说明,只是一小部分
NewtonCollision* NewtonCreateBox(const NewtonWorld* const newtonWorld,
dFloat dx, dFloat dy, dFloat dz, int shapeID,
const dFloat* const offsetMatrix)
//dx,dy,dz,表示在这些方向上的box的长度。
//offsetMatrix是一个4*4的矩阵,表示这个shape的方位
//shape是引用计数对象,需要使用函数NewtonReleaseCollision来减低引用计数。
NewtonBody* NewtonCreateBody(const NewtonWorld* const newtonWorld,
const NewtonCollision* const collisionPtr, const dFloat* const matrixPtr)
//matrixPtr是一个矩阵表示这个body的方位,通常与三维物体的方位一致。
//body是引用计数对象,需要使用NewtonDestroyBody来减低引用计数。
void NewtonBodySetUserData(const NewtonBody* const bodyPtr,
void* const userDataPtr)
//设置body的用户数据。
void NewtonConvexCollisionCalculateInertialMatrix(
const NewtonCollision* convexCollision, dFloat* const inertia,
dFloat* const origin)
//计算一个shape的x,y,z三个方向上的(转动惯量J/质量m)的值,将结果保存到inertia中。
//origin保存质心坐标。
//这个函数可以计算由物体的顶点来创建的shape的这个值。
void NewtonBodySetMassMatrix(const NewtonBody* const bodyPtr, dFloat mass,
dFloat Ixx, dFloat Iyy, dFloat Izz)
//设置body的对x,y,z三个轴的转动惯量J。
void NewtonBodyGetCentreOfMass(const NewtonBody* const bodyPtr,
dFloat* const comPtr)
//设置body的质心坐标。
void NewtonBodySetForceAndTorqueCallback(const NewtonBody* const bodyPtr,
NewtonApplyForceAndTorque callback)
//为body设置一个回调函数,专门给body加外力,或外力矩。当引擎要模拟这个物体的时候都会调用这个函数给它加力,
//如最常见的外力。
//这个回调函数的格式:
typedef void (*NewtonApplyForceAndTorque) (const NewtonBody* const body, dFloat timestep, int threadIndex);
void NewtonBodyGetMassMatrix(const NewtonBody* const bodyPtr,
dFloat* const mass, dFloat* const Ixx, dFloat* const Iyy, dFloat* const Izz)
//获得body的质量和x,y,z等方向的(转动惯量J/质量m)。
void NewtonBodySetForce(const NewtonBody* const bodyPtr,
const dFloat* vectorPtr)
//为body添加一个外力。vectorPtr是一个dVector,w分量为1.0f。
void NewtonBodySetTransformCallback(const NewtonBody* const bodyPtr,
NewtonSetTransform callback)
//为一个body设置方位变化回调函数,但body的方位发生改变时,会调用这个函数
//你可以在这个函数里面改变可见三维物体的方位。
//回调函数的格式:
typedef void (*NewtonSetTransform) (const NewtonBody* const body, const dFloat* const matrix, int threadIndex);
void NewtonBodyGetRotation(const NewtonBody* const bodyPtr, dFloat* rotPtr)
//获得body先对于上一帧的旋转量。rotPtr是一个四元数。
void NewtonCollisionCalculateAABB(const NewtonCollision* collisionPtr,
const dFloat* const offsetMatrix, dFloat* const p0, dFloat* const p1)
//计算shape的AABB包围盒。
NewtonCollision* NewtonCreateConvexHull(const NewtonWorld* const newtonWorld,
int count, const dFloat* const vertexCloud, int strideInBytes,
dgFloat32 tolerance, int shapeID, const dFloat* const offsetMatrix)
//根据3维物体的网格顶点 创建一个shape,这个shape接近物体的真实形状。
//count:是顶点个数
//vertexCloud:指向是顶点数据的指针。
//strideInButes:是每个顶点占的内存大小。
//tolerance:公差。
//offsetMatrix偏移矩阵,可以为NULL。
NewtonCollision* NewtonCreateCompoundCollision(
const NewtonWorld* const newtonWorld, int count,
NewtonCollision* const collisionPrimitiveArray[], int shapeID)
//根据一组shape,创建一个复合shape。
void NewtonWorldRayCast(const NewtonWorld* const newtonWorld,
const dFloat* const p0, const dFloat* const p1,
NewtonWorldRayFilterCallback filter, void* const userData,
NewtonWorldRayPrefilterCallback prefilter)
// Name: NewtonWorldRayCast
// 从p0到p1发射一条射线,在每一次相交的时候都调用回调函数
//
// 参数:
// *const NewtonWorld* *newtonWorld - 牛顿世界指针.
// *const dFloat* *p0 - 射线在世界坐标中的起点,至少3个浮点数.
// *const dFloat* *p1 - 射线在世界坐标中的终点,至少3个浮点数.
// *NewtonWorldRayFilterCallback* filter - 每次射线与一个body相交的时候都会调用这个函数.
// *void* *userData - 传递个上面那个回调函数的自定义数据.
// *NewtonWorldRayPrefilterCallback* prefilter - 射线与一个body相交之前会调用这个函数。
//
// 返回值: 无
// 说明: 这个函数最大的作用就是查找与第一个与射线相交的body
// 假如那个filter回调函数返回了0,就会立即退出函数,结束相交测试。
假如prefilter不为NULL,每次与primitive做相交测试之前都会调用prefilter这个回调函数,
如果这个函数返回0,就不会与这个primitive做相交测试了。
这个函数性能很高
过量使用会减低性能。
filter的函数声明:
static dFloat RayCastPlacement (const NewtonBody* body, const dFloat* normal, int collisionID,
void* userData, dFloat intersetParam)
最后一个参数是牛顿传递进来的,是射线长度的倍数关系,这个值乘以射线长度,加上射线的端点就是射线与物体相交的点。
int NewtonWorldConvexCast(const NewtonWorld* const newtonWorld,
const dFloat* const matrix, const dFloat* const target,
const NewtonCollision* const shape, dFloat* const hitParam,
void* const userData, NewtonWorldRayPrefilterCallback prefilter,
NewtonWorldConvexCastReturnInfo* const info, int maxContactsCount,
int threadIndex)
//从matrix position到destination沿着一条射线投射一个简单的凸形,得到第一个接触的collisions。
// Parameters:
// *const NewtonWorld* *newtonWorld - 牛顿世界.
// *const dFloat* *matrix -包含shape在世界坐标中的位置和方向的值,shape的位置也是射线的起点。
// *const dFloat* *target - 射线的端点,至少3个float值
// *const NewtonCollision* shape - 测试碰用的shape
// *dFloat* hitParam - 与射线长度的倍数关系.这个值乘射线的长度加上射线的端点的坐标,
就是这个shape与其他物体开始相交所在的地方。
int NewtonMaterialCreateGroupID(const NewtonWorld* const newtonWorld)
创建一个group ID,这样一个ID其实是一个稠密图的一个节点。返回一个新的材质ID。
void NewtonMaterialSetCollisionCallback(const NewtonWorld* const newtonWorld,
int id0, int id1, void *userData, NewtonOnAABBOverlap aabbOverlap,
NewtonContactsProcess processCallback)
// Name: NewtonMaterialSetCollisionCallback
// 设置两个材质碰撞的时候调用的回调函数。
//
// Parameters:
// *const NewtonWorld* *newtonWorld - is the pointer to the Newton world.
// *int* id0 - group id0.
// *int* id1 - group id1.
// *void* *userData - user data value.
// *NewtonOnAABBOverlap* aabbOverlap - 碰撞前回调
// *NewtonContactsProcess* processCallback - 碰撞后回调
static void GenericContactProcess (const NewtonJoint* contactJoint, dFloat timestep, int threadIndex)
// See also: NewtonMaterialAsThreadSafe
NewtonBody* NewtonJointGetBody0(const NewtonJoint* const joint)
// Name: NewtonJointGetBody0
// 获得通过这个joint连起来的body中的第一个body
int NewtonContactJointGetContactCount(const NewtonJoint* const contactJoint)
// Name: NewtonContactJointGetContactCount
// Return to number of contact int thsi contact joint.
//
// Parameters:
// *const NewtonJoint* *contactJoint - pointer to corrent contact joint.
//
// Return: numbet of contacts.
//
// See also: NewtonContactJointGetFirstContact, NewtonContactJointGetNextContact, NewtonContactJointRemoveContact
void* NewtonContactJointGetFirstContact(const NewtonJoint* const contactJoint)
// Name: NewtonContactJointGetFirstContact
// Return to the next contact from the cantact array of the contact joint.
//
// Parameters:
// *const NewtonJoint* *contactJoint - pointer to corrent contact joint.
//
// Return: first contact contact array of the joint contact exist, NULL otherwise
//
// See also: NewtonContactJointGetNextContact, NewtonContactGetMaterial, NewtonContactJointRemoveContact
void* NewtonContactJointGetNextContact(const NewtonJoint* const contactJoint,
void* const contact)
// Name: NewtonContactJointGetNextContact
// Return to the first contact fromm the cantact array of the contact joint.
//
// Parameters:
// *const NewtonJoint* *contactJoint - pointer to corrent contact joint.
// *void* *contact - pointer to current contact.
//
// Return: a handle to the next contact contact in the contact array if contact exist, NULL otherwise.
//
// See also: NewtonContactJointGetFirstContact, NewtonContactGetMaterial, NewtonContactJointRemoveContact
NewtonCollision* NewtonCreateTreeCollision(const NewtonWorld* const newtonWorld,
int shapeID)
// Name: NewtonCreateTreeCollision
// 创建一个空的复杂碰撞几何树
//
// Parameters:
// *const NewtonWorld* *newtonWorld - is the pointer to the Newton world.
//
// Return: Pointer to the collision tree.
//
// *TreeCollision* 是牛顿对一些复杂的多边形几何体的默认的一种shape
// The mesh must be made of flat non-intersecting polygons, but they do not explicitly need to be triangles.
// *TreeCollision* 能够串行化到存储设备,或从存储设备中读取出来。
//
// 当一个body的shape是*TreeCollision*类型时,这个物体就是静态的了,质量无线大。
// shape是索引计数对象,创建后需要release,如果不release会内存泄露。
// 一个collision(shape)可以被多个body共享,这样可以节省内存,加速计算。
void NewtonTreeCollisionAddFace(const NewtonCollision* const treeCollision,
int vertexCount, const dFloat* const vertexPtr, int strideInBytes,
int faceAttribute)
// Name: NewtonTreeCollisionAddFace
// 添加一个多边形到 *TreeCollision*.
//
// Parameters:
// *const NewtonCollision* *treeCollision - is the pointer to the collision tree.
// *int* vertexCount - *vertexPtr*指针里面的顶点数,一个顶点是vector3类型。
// *const dFloat* *vertexPtr - 顶点指针。
// *int* strideInBytes - 每个顶点所占的字节数. 至少12.
// *int* faceAttribute - 给这个多边形的一个ID。
//
// Return: Nothing.
//
// *NewtonTreeCollisionBeginBuild*需在这个函数之后调用
// 多边形不能自我相交。
void NewtonTreeCollisionSetUserRayCastCallback(
const NewtonCollision* const treeCollision,
NewtonCollisionTreeRayCastCallback rayHitCallback)
//设置一个回调函数,当射线与treecollision里面的面相交的时候会被调用。
void NewtonCollisionCalculateAABB(const NewtonCollision* collisionPtr,
const dFloat* const offsetMatrix, dFloat* const p0, dFloat* const p1)
//为collision计算相对于offsetMatrix的AABB包围盒。
NewtonCollision* NewtonCreateHeightFieldCollision(
const NewtonWorld* const newtonWorld, int width, int height,
int cellsDiagonals, const unsigned short* const elevationMap,
const char* const atributeMap, dFloat horizontalScale, dFloat verticalScale,
int shapeID)
// Name: NewtonCreateHeightFieldCollision
// Create a height field collision geometry.
//
// Parameters:
// *const NewtonWorld* *newtonWorld - is the pointer to the Newton world.
// *int* width -
// *int* height -
// *int* cellsDiagonals -
// *unsigned short* elevationMap -//高度值
// *char* atributeMap - //每个高度值,可以有个属性,
// *dFloat* horizontalScale - //每个地形格子的水平长度
// *dFloat* verticalScale - //每个地形格子的垂直宽度
//
// Return: Pointer to the collision.
void NewtonHeightFieldSetUserRayCastCallback(const NewtonCollision* treeCollision, UserHeightFieldCollisionCallback);
设置当有射线与地形相交时调用的回调函数
static dFloat UserHeightFieldCollisionCallback (const NewtonBody* const body, const NewtonCollision* const heightField, dFloat interception, int
row, int col, dFloat* normal, int faceId, void* usedData)
{
return 1.0f;
}