Hmm… I checked in a first version (linear & angular joints, without drive) a few days ago, but it seems the buildbot servers are not running, so there is no snapshot build yet. You could compile yourself until the snapshot builds are back again.
Here is a snippet for setting up something simular to the Bullet sample with the disk and the three soft bodies connected to it.
# Disk
p0 = Point3(0, 0, 4)
v1 = Vec3(-3,-3,0)
v2 = Vec3(3,-3,0)
v3 = Vec3(0,3,0)
size = Vec3(1.5,1.5,1.5)
np = self.worldNP.attachNewNode(BulletRigidBodyNode('Cylinder'))
np.node().setMass(1.0)
np.node().addShape(BulletCylinderShape(3.0, 0.6, ZUp))
np.setPos(p0 + Point3(0,0,4))
np.setCollideMask(BitMask32.allOn())
self.world.attachRigidBody(np.node())
# Three softbodies
def makeBall(p, v, size):
np = self.worldNP.attachNewNode(BulletSoftBodyNode.makeEllipsoid(info, p+v, size, 128))
np.node().getMaterial(0).setLinearStiffness(0.1)
np.node().getCfg().setDynamicFrictionCoefficient(1)
np.node().getCfg().setDampingCoefficient(0.001)
np.node().getCfg().setPressureCoefficient(1500)
np.node().setTotalMass(30, True)
np.node().setPose(True, False)
np.node().generateClusters(1)
np.showTightBounds()
geom = BulletHelper.makeGeomFromFaces(np.node())
nodeVis = GeomNode('')
nodeVis.addGeom(geom)
npVis = np.attachNewNode(nodeVis)
np.node().linkGeom(geom)
return np
np1 = makeBall(p0, v1, size)
np2 = makeBall(p0, v2, size)
np3 = makeBall(p0, v3, size)
self.world.attachSoftBody(np1.node())
self.world.attachSoftBody(np2.node())
self.world.attachSoftBody(np3.node())
# Links by cluster
np1.node().appendLinearJoint(np.node(), 0, erp=0.5)
np2.node().appendLinearJoint(np.node(), 0, erp=0.5)
np3.node().appendLinearJoint(np.node(), 0, erp=0.5)
# Same result, but by transform and not by cluster
#np1.node().appendLinearJoint(np.node(), p0+v1, erp=0.5)
#np2.node().appendLinearJoint(np.node(), p0+v2, erp=0.5)
#np3.node().appendLinearJoint(np.node(), p0+v3, erp=0.5)