PhysX
PhysX copied to clipboard
PxArticulationLink collision failed
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