Skip to content

PxArticulationLink collision failed #685

@hazidh

Description

@hazidh

The PxArticulationLink in the groove does not collide with the PxArticulationLink in the chute to support its movement along the groove path. Here, I set the shape of the edge as a triangle mesh and set the filter shape.setSimulationFilterData(new PxFilterData(0, 0, 1, 0));.

static PxFilterFlags scissorFilter(	PxFilterObjectAttributes attributes0, PxFilterData filterData0,
									PxFilterObjectAttributes attributes1, PxFilterData filterData1,
									PxPairFlags& pairFlags, const void* constantBlock, PxU32 constantBlockSize)
{
	PX_UNUSED(attributes0);
	PX_UNUSED(attributes1);
	PX_UNUSED(constantBlock);
	PX_UNUSED(constantBlockSize);
	if (filterData0.word2 != 0 && filterData0.word2 == filterData1.word2)
		return PxFilterFlag::eKILL;
	pairFlags |= PxPairFlag::eCONTACT_DEFAULT;
	return PxFilterFlag::eDEFAULT;
}
PxArticulationLink baselink = articulationControl.createLink(null,
                base.getWorldTransform(), base, gMaterial, 1, true);

        PxArticulationLink rotate0Link = articulationControl.createLink(baselink,
                rotate0.getWorldTransform(), rotate0, gMaterial, 1,true);
        joint = rotate0Link.getInboundJoint();
        joint.setJointType(PxArticulationJointTypeEnum.eFIX);
        Transform parentPose = PhysxMathUtil.getRelativeTransform(rotate0, base);
        Transform childPose = PhysxMathUtil.getRelativeTransform(rotate0, rotate0);
        articulationControl.setJointParentAndChildPose(joint, parentPose, childPose);

        PxArticulationLink rotate1Link = articulationControl.createLink(rotate0Link,
                rotate1.getWorldTransform(), rotate1, gMaterial, 1,true);
        driveJoint = rotate1Link.getInboundJoint();
        driveJoint.setJointType(PxArticulationJointTypeEnum.eREVOLUTE);
        parentPose = PhysxMathUtil.getRelativeTransform(rotate0, rotate0);
        childPose = PhysxMathUtil.getRelativeTransform(rotate0, rotate1);
        articulationControl.setJointParentAndChildPose(driveJoint, parentPose, childPose);
        driveJoint.setMotion(PxArticulationAxisEnum.eSWING2, PxArticulationMotionEnum.eFREE);

        PxArticulationDrive drive = new PxArticulationDrive();
        drive.setStiffness(1000f);      
        drive.setDamping(10f);          
        drive.setMaxForce(100000.0f);    
        drive.setDriveType(PxArticulationDriveTypeEnum.eVELOCITY);
        driveJoint.setDriveParams(PxArticulationAxisEnum.eSWING2, drive);

        PxArticulationLink rotate2Link = articulationControl.createLink(rotate1Link,
                rotate2.getWorldTransform(), rotate2, gMaterial, 1,true);
        joint = rotate2Link.getInboundJoint();
        joint.setJointType(PxArticulationJointTypeEnum.eREVOLUTE);
        parentPose = PhysxMathUtil.getRelativeTransform(rotate1, rotate1);
        childPose = PhysxMathUtil.getRelativeTransform(rotate1, rotate2);
        articulationControl.setJointParentAndChildPose(joint, parentPose, childPose);
        joint.setMotion(PxArticulationAxisEnum.eSWING2, PxArticulationMotionEnum.eFREE);

        PxArticulationLink slideX2Link = articulationControl.createLink(rotate2Link,
                slideX2.getWorldTransform(), slideX2, gMaterial, 1,true);
        joint = slideX2Link.getInboundJoint();
        joint.setJointType(PxArticulationJointTypeEnum.eREVOLUTE);
        parentPose = PhysxMathUtil.getRelativeTransform(slideX2, rotate2);
        childPose = PhysxMathUtil.getRelativeTransform(slideX2, slideX2);
        articulationControl.setJointParentAndChildPose(joint, parentPose, childPose);
        joint.setMotion(PxArticulationAxisEnum.eSWING2, PxArticulationMotionEnum.eFREE);

        PxArticulationLink slideX1Link = articulationControl.createLink(slideX2Link,
                slideX1.getWorldTransform(), slideX1, gMaterial, 1f,true);
        joint = slideX1Link.getInboundJoint();
        joint.setJointType(PxArticulationJointTypeEnum.ePRISMATIC);
        parentPose = PhysxMathUtil.getRelativeTransform(slideX1, slideX2);
        childPose = PhysxMathUtil.getRelativeTransform(slideX1, slideX1);
        articulationControl.setJointParentAndChildPose(joint, parentPose, childPose);
        joint.setMotion(PxArticulationAxisEnum.eX, PxArticulationMotionEnum.eLIMITED);
        joint.setMotion(PxArticulationAxisEnum.eY, PxArticulationMotionEnum.eLOCKED); 
        joint.setMotion(PxArticulationAxisEnum.eZ, PxArticulationMotionEnum.eLOCKED); 
        joint.setMotion(PxArticulationAxisEnum.eTWIST, PxArticulationMotionEnum.eLOCKED);
        joint.setMotion(PxArticulationAxisEnum.eSWING1, PxArticulationMotionEnum.eLOCKED);
        joint.setMotion(PxArticulationAxisEnum.eSWING2, PxArticulationMotionEnum.eLOCKED);

        parentPose = PhysxMathUtil.getRelativeTransform(slideX1, base);
        childPose = PhysxMathUtil.getRelativeTransform(slideX1, slideX1);
        PxD6Joint base_slideX1Joint = PxTopLevelFunctions.D6JointCreate(physxAppState.getPhysics(), baselink,
                PhysxMathUtil.updatePxTransform(parentPose, null),
                slideX1Link, PhysxMathUtil.updatePxTransform(childPose, null));
        base_slideX1Joint.setMotion(PxD6AxisEnum.eX, PxD6MotionEnum.eLIMITED);
        base_slideX1Joint.setMotion(PxD6AxisEnum.eY, PxD6MotionEnum.eLOCKED);  
        base_slideX1Joint.setMotion(PxD6AxisEnum.eZ, PxD6MotionEnum.eLOCKED);  
        base_slideX1Joint.setMotion(PxD6AxisEnum.eTWIST, PxD6MotionEnum.eLOCKED);
        base_slideX1Joint.setMotion(PxD6AxisEnum.eSWING1, PxD6MotionEnum.eLOCKED);
        base_slideX1Joint.setMotion(PxD6AxisEnum.eSWING2, PxD6MotionEnum.eLOCKED);

        PxArticulationLink baseLink1 = articulationControl.createLink(baselink,
                base1.getWorldTransform(), base1, gMaterial, 1f,true);
        joint = baseLink1.getInboundJoint();
        joint.setJointType(PxArticulationJointTypeEnum.eFIX);
        parentPose = PhysxMathUtil.getRelativeTransform(base1, base);
        childPose = PhysxMathUtil.getRelativeTransform(base1, base1);
        articulationControl.setJointParentAndChildPose(joint, parentPose, childPose);

        PxArticulationLink slideY2Link = articulationControl.createLink(baseLink1,
                slideY2.getWorldTransform(), slideY2, gMaterial, 1f,true);
        joint = slideY2Link.getInboundJoint();
        joint.setJointType(PxArticulationJointTypeEnum.ePRISMATIC);
        parentPose = PhysxMathUtil.getRelativeTransform(slideY2, base1);
        childPose = PhysxMathUtil.getRelativeTransform(slideY2, slideY2);
        articulationControl.setJointParentAndChildPose(joint, parentPose, childPose);
        joint.setMotion(PxArticulationAxisEnum.eX, PxArticulationMotionEnum.eLIMITED);

        
        PxArticulationLink slideY1Link = articulationControl.createLink(slideY2Link,
                slideY1.getWorldTransform(), slideY1, gMaterial, 1f,true);
        joint = slideY1Link.getInboundJoint();
        joint.setJointType(PxArticulationJointTypeEnum.eFIX);
        parentPose = PhysxMathUtil.getRelativeTransform(slideY1, slideY2);
        childPose = PhysxMathUtil.getRelativeTransform(slideY1, slideY1);
        articulationControl.setJointParentAndChildPose(joint, parentPose, childPose);
20250827_172950.mp4

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions