diff --git a/Demos/ColladaDemo/ColladaConverter.cpp b/Demos/ColladaDemo/ColladaConverter.cpp index d2d4fee03..7105bd7a7 100644 --- a/Demos/ColladaDemo/ColladaConverter.cpp +++ b/Demos/ColladaDemo/ColladaConverter.cpp @@ -537,8 +537,8 @@ void ColladaConverter::prepareConstraints(ConstraintInput& input) const domRigid_constraint::domRef_attachmentRef attachRefBody = rigidConstraintRef->getRef_attachment(); const domRigid_constraint::domAttachmentRef attachBody1 = rigidConstraintRef->getAttachment(); - daeString orgUri0 = attachRefBody->getRigid_body().getOriginalURI(); - daeString orgUri1 = attachBody1->getRigid_body().getOriginalURI(); + daeString orgUri0 = attachRefBody ? attachRefBody->getRigid_body().getOriginalURI() : ""; + daeString orgUri1 = attachBody1 ? attachBody1->getRigid_body().getOriginalURI() : ""; btRigidBody* body0=0,*body1=0; for (int i=0;igetRotate_array(), - attachRefBody->getTranslate_array()); + attachFrameRef0.setIdentity(); + + if (attachRefBody) + { + attachFrameRef0 = + GetbtTransformFromCOLLADA_DOM + ( + emptyMatrixArray, + attachRefBody->getRotate_array(), + attachRefBody->getTranslate_array()); + } btTransform attachFrameOther; - attachFrameOther = - GetbtTransformFromCOLLADA_DOM - ( - emptyMatrixArray, - attachBody1->getRotate_array(), - attachBody1->getTranslate_array() - ); + attachFrameOther.setIdentity(); + if (attachBody1) + { + attachFrameOther = + GetbtTransformFromCOLLADA_DOM + ( + emptyMatrixArray, + attachBody1->getRotate_array(), + attachBody1->getTranslate_array() + ); + } //convert INF / -INF into lower > upper @@ -639,18 +648,34 @@ void ColladaConverter::prepareConstraints(ConstraintInput& input) } - if (body0&& body1) + if (body0 || body1) { - createUniversalD6Constraint( - body0, - body1, - attachFrameRef0, - attachFrameOther, - linearLowerLimits, - linearUpperLimits, - angularLowerLimits, - angularUpperLimits - ); + //swap so that first body is non-zero + if (!body0) + { + createUniversalD6Constraint( + body1, + body0, + attachFrameOther, + attachFrameRef0, + linearLowerLimits, + linearUpperLimits, + angularLowerLimits, + angularUpperLimits + ); + } else + { + createUniversalD6Constraint( + body0, + body1, + attachFrameRef0, + attachFrameOther, + linearLowerLimits, + linearUpperLimits, + angularLowerLimits, + angularUpperLimits + ); + } } else { printf("Error: Cannot find Rigidbodies(%s,%s) for constraint %s\n",orgUri0,orgUri1,constraintName); diff --git a/Demos/ColladaDemo/ColladaDemo.cpp b/Demos/ColladaDemo/ColladaDemo.cpp index d9bbe18c4..2b38d8605 100644 --- a/Demos/ColladaDemo/ColladaDemo.cpp +++ b/Demos/ColladaDemo/ColladaDemo.cpp @@ -57,8 +57,17 @@ class MyColladaConverter : public ColladaConverter const btVector3& angularMaxLimits ) { - if (bodyRef && bodyOther) + if (bodyRef) { + if (!bodyOther) + { + bodyOther = new btRigidBody(0,0,0); + + bodyOther->setWorldTransform(bodyRef->getWorldTransform()); + localAttachmentOther = localAttachmentFrameRef; + + } + btGeneric6DofConstraint* genericConstraint = new btGeneric6DofConstraint( *bodyRef,*bodyOther, localAttachmentFrameRef,localAttachmentOther);