コード例 #1
0
void GenericContactProcess (const NewtonJoint* contactJoint, dFloat timestep, int threadIndex)
{
	int isHightField;
	NewtonBody* body;
	NewtonCollision* collision;
	NewtonCollisionInfoRecord info;

	isHightField = 1;
	body = NewtonJointGetBody0 (contactJoint);
	collision = NewtonBodyGetCollision(body);
	NewtonCollisionGetInfo(collision, &info);
	if (info.m_collisionType != SERIALIZE_ID_HEIGHTFIELD) {
		body = NewtonJointGetBody1 (contactJoint);
		collision = NewtonBodyGetCollision(body);
		NewtonCollisionGetInfo(collision, &info);
		isHightField  = (info.m_collisionType == SERIALIZE_ID_HEIGHTFIELD); 
	}

	#define HOLE_IN_TERRAIN 10
	if (isHightField) {
		void* nextContact;
		for (void* contact = NewtonContactJointGetFirstContact (contactJoint); contact; contact = nextContact) {
			int faceID;
			NewtonMaterial* material;

			nextContact = NewtonContactJointGetNextContact (contactJoint, contact);

			material = NewtonContactGetMaterial (contact);
			faceID = NewtonMaterialGetContactFaceAttribute (material);
			if (faceID == HOLE_INTERRAIN) {
				NewtonContactJointRemoveContact (contactJoint, contact); 
			}
		}
	}
}
コード例 #2
0
int Physics::levelContactProcess( const NewtonMaterial* p_material, const NewtonContact* /*p_contact*/ )
{
    // handle level submaterials
    unsigned int materialType = static_cast< unsigned int >( NewtonMaterialGetContactFaceAttribute( p_material ) );
    switch ( materialType )
    {
        case Physics::MAT_DEFAULT:
            NewtonMaterialSetContactElasticity( p_material, 0.3f );
            NewtonMaterialSetContactStaticFrictionCoef( p_material, 0.6f, 0 );
            NewtonMaterialSetContactKineticFrictionCoef( p_material, 0.3f, 0 );
            break;

        case Physics::MAT_WOOD:

            NewtonMaterialSetContactElasticity( p_material, 0.5f );
            NewtonMaterialSetContactStaticFrictionCoef( p_material, 0.6f, 0 );
            NewtonMaterialSetContactKineticFrictionCoef( p_material, 0.4f, 0 );
            break;

        case Physics::MAT_STONE:

            NewtonMaterialSetContactElasticity( p_material, 0.4f );
            NewtonMaterialSetContactStaticFrictionCoef( p_material, 0.55f, 0 );
            NewtonMaterialSetContactKineticFrictionCoef( p_material, 0.35f, 0 );
            break;

        case Physics::MAT_METALL:

            NewtonMaterialSetContactElasticity( p_material, 0.6f );
            NewtonMaterialSetContactStaticFrictionCoef( p_material, 0.5f, 0 );
            NewtonMaterialSetContactKineticFrictionCoef( p_material, 0.4f, 0 );
            break;

        case Physics::MAT_GRASS:

            NewtonMaterialSetContactElasticity( p_material, 0.4f );
            NewtonMaterialSetContactStaticFrictionCoef( p_material, 0.8f, 0 );
            NewtonMaterialSetContactKineticFrictionCoef( p_material, 0.6f, 0 );
            break;

        case Physics::MAT_WALL:

            NewtonMaterialSetContactElasticity( p_material, 0.8f );
            NewtonMaterialSetContactStaticFrictionCoef( p_material, 0.1f, 0 );
            NewtonMaterialSetContactKineticFrictionCoef( p_material, 0.1f, 0 );
            break;

        // simply return 0 for non-colliding pairs
        case Physics::MAT_NOCOL:
            return 0;
            break;

        default:
            ;
    }

    return 1;
}
コード例 #3
0
ファイル: material.cpp プロジェクト: fathat/pynewton
unsigned Material::GetContactFaceAttribute ()
{
    return NewtonMaterialGetContactFaceAttribute( m_material );
}