PhysX icon indicating copy to clipboard operation
PhysX copied to clipboard

PxArticulationLink collision failed

Open hazidh opened this issue 4 months ago • 0 comments

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);

https://github.com/user-attachments/assets/0dcb87f5-40b2-4b6d-ade7-559040927617

hazidh avatar Aug 27 '25 09:08 hazidh