Revision: 20366
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20366
Author:   erwin
Date:     2009-05-23 22:02:12 +0200 (Sat, 23 May 2009)

Log Message:
-----------
Minor fixes in Bullet/constraint solving
Should  make generic 6DOF constraint more useable, and rigid body stacking more 
stable (warmstarting was accidently switched off)
If time allows, a few more minor last-minute 2.49 fixes might follow.
Check out http://bulletphysics.com/constraintsTutorial.blend

Modified Paths:
--------------
    
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
    
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h
    
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
    
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
    
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp
    
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp
    
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSliderConstraint.h
    trunk/blender/extern/bullet2/src/LinearMath/btScalar.h
    trunk/blender/source/blender/src/buttons_object.c

Modified: 
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
===================================================================
--- 
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
  2009-05-23 19:47:47 UTC (rev 20365)
+++ 
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
  2009-05-23 20:02:12 UTC (rev 20366)
@@ -22,13 +22,14 @@
 #include "LinearMath/btMinMax.h"
 #include <new>
 
-//-----------------------------------------------------------------------------
 
+
+//#define CONETWIST_USE_OBSOLETE_SOLVER true
 #define CONETWIST_USE_OBSOLETE_SOLVER false
 #define CONETWIST_DEF_FIX_THRESH btScalar(.05f)
 
-//-----------------------------------------------------------------------------
 
+
 btConeTwistConstraint::btConeTwistConstraint()
 :btTypedConstraint(CONETWIST_CONSTRAINT_TYPE),
 m_useSolveConstraintObsolete(CONETWIST_USE_OBSOLETE_SOLVER)
@@ -63,14 +64,14 @@
        m_bMotorEnabled = false;
        m_maxMotorImpulse = btScalar(-1);
 
-       setLimit(btScalar(1e30), btScalar(1e30), btScalar(1e30));
+       setLimit(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), 
btScalar(BT_LARGE_FLOAT));
        m_damping = btScalar(0.01);
        m_fixThresh = CONETWIST_DEF_FIX_THRESH;
 }
 
 
-//-----------------------------------------------------------------------------
 
+
 void btConeTwistConstraint::getInfo1 (btConstraintInfo1* info)
 {
        if (m_useSolveConstraintObsolete)
@@ -99,10 +100,10 @@
                        info->nub--;
                }
        }
-} // btConeTwistConstraint::getInfo1()
+}
        
-//-----------------------------------------------------------------------------
 
+
 void btConeTwistConstraint::getInfo2 (btConstraintInfo2* info)
 {
        btAssert(!m_useSolveConstraintObsolete);
@@ -230,8 +231,8 @@
        }
 }
        
-//-----------------------------------------------------------------------------
 
+
 void   btConeTwistConstraint::buildJacobian()
 {
        if (m_useSolveConstraintObsolete)
@@ -239,6 +240,7 @@
                m_appliedImpulse = btScalar(0.);
                m_accTwistLimitImpulse = btScalar(0.);
                m_accSwingLimitImpulse = btScalar(0.);
+               m_accMotorImpulse = btVector3(0.,0.,0.);
 
                if (!m_angularOnly)
                {
@@ -277,8 +279,8 @@
        }
 }
 
-//-----------------------------------------------------------------------------
 
+
 void   btConeTwistConstraint::solveConstraintObsolete(btSolverBody& 
bodyA,btSolverBody& bodyB,btScalar timeStep)
 {
        if (m_useSolveConstraintObsolete)
@@ -406,10 +408,10 @@
 
                        }
                }
-               else // no motor: do a little damping
+               else if (m_damping > SIMD_EPSILON) // no motor: do a little 
damping
                {
-                       const btVector3& angVelA = 
getRigidBodyA().getAngularVelocity();
-                       const btVector3& angVelB = 
getRigidBodyB().getAngularVelocity();
+                       btVector3 angVelA; bodyA.getAngularVelocity(angVelA);
+                       btVector3 angVelB; bodyB.getAngularVelocity(angVelB);
                        btVector3 relVel = angVelB - angVelA;
                        if (relVel.length2() > SIMD_EPSILON)
                        {
@@ -490,16 +492,16 @@
 
 }
 
-//-----------------------------------------------------------------------------
 
+
 void   btConeTwistConstraint::updateRHS(btScalar       timeStep)
 {
        (void)timeStep;
 
 }
 
-//-----------------------------------------------------------------------------
 
+
 void btConeTwistConstraint::calcAngleInfo()
 {
        m_swingCorrection = btScalar(0.);
@@ -584,26 +586,47 @@
                        m_twistAxis.normalize();
                }
        }
-} // btConeTwistConstraint::calcAngleInfo()
+}
 
 
 static btVector3 vTwist(1,0,0); // twist axis in constraint's space
 
-//-----------------------------------------------------------------------------
 
+
 void btConeTwistConstraint::calcAngleInfo2()
 {
        m_swingCorrection = btScalar(0.);
        m_twistLimitSign = btScalar(0.);
        m_solveTwistLimit = false;
        m_solveSwingLimit = false;
+       // compute rotation of A wrt B (in constraint space)
+       if (m_bMotorEnabled && (!m_useSolveConstraintObsolete))
+       {       // it is assumed that setMotorTarget() was alredy called 
+               // and motor target m_qTarget is within constraint limits
+               // TODO : split rotation to pure swing and pure twist
+               // compute desired transforms in world
+               btTransform trPose(m_qTarget);
+               btTransform trA = getRigidBodyA().getCenterOfMassTransform() * 
m_rbAFrame;
+               btTransform trB = getRigidBodyB().getCenterOfMassTransform() * 
m_rbBFrame;
+               btTransform trDeltaAB = trB * trPose * trA.inverse();
+               btQuaternion qDeltaAB = trDeltaAB.getRotation();
+               btVector3 swingAxis =   btVector3(qDeltaAB.x(), qDeltaAB.y(), 
qDeltaAB.z());
+               m_swingAxis = swingAxis;
+               m_swingAxis.normalize();
+               m_swingCorrection = qDeltaAB.getAngle();
+               if(!btFuzzyZero(m_swingCorrection))
+               {
+                       m_solveSwingLimit = true;
+               }
+               return;
+       }
 
+
        {
                // compute rotation of A wrt B (in constraint space)
                btQuaternion qA = 
getRigidBodyA().getCenterOfMassTransform().getRotation() * 
m_rbAFrame.getRotation();
                btQuaternion qB = 
getRigidBodyB().getCenterOfMassTransform().getRotation() * 
m_rbBFrame.getRotation();
                btQuaternion qAB = qB.inverse() * qA;
-
                // split rotation into cone and twist
                // (all this is done from B's perspective. Maybe I should be 
averaging axes...)
                btVector3 vConeNoTwist = quatRotate(qAB, vTwist); 
vConeNoTwist.normalize();
@@ -756,7 +779,7 @@
                        m_twistAngle = btScalar(0.f);
                }
        }
-} // btConeTwistConstraint::calcAngleInfo2()
+}
 
 
 
@@ -982,8 +1005,5 @@
 }
 
 
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
 
 

Modified: 
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h
===================================================================
--- 
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h
    2009-05-23 19:47:47 UTC (rev 20365)
+++ 
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h
    2009-05-23 20:02:12 UTC (rev 20366)
@@ -17,6 +17,22 @@
 
 
 
+/*
+Overview:
+
+btConeTwistConstraint can be used to simulate ragdoll joints (upper arm, leg 
etc).
+It is a fixed translation, 3 degree-of-freedom (DOF) rotational "joint".
+It divides the 3 rotational DOFs into swing (movement within a cone) and twist.
+Swing is divided into swing1 and swing2 which can have different limits, 
giving an elliptical shape.
+(Note: the cone's base isn't flat, so this ellipse is "embedded" on the 
surface of a sphere.)
+
+In the contraint's frame of reference:
+twist is along the x-axis,
+and swing 1 and 2 are along the z and y axes respectively.
+*/
+
+
+
 #ifndef CONETWISTCONSTRAINT_H
 #define CONETWISTCONSTRAINT_H
 
@@ -141,7 +157,18 @@
                };
        }
 
-       void    setLimit(btScalar _swingSpan1,btScalar _swingSpan2,btScalar 
_twistSpan,  btScalar _softness = 1.f, btScalar _biasFactor = 0.3f, btScalar 
_relaxationFactor = 1.0f)
+       // setLimit(), a few notes:
+       // _softness:
+       //              0->1, recommend ~0.8->1.
+       //              describes % of limits where movement is free.
+       //              beyond this softness %, the limit is gradually enforced 
until the "hard" (1.0) limit is reached.
+       // _biasFactor:
+       //              0->1?, recommend 0.3 +/-0.3 or so.
+       //              strength with which constraint resists zeroth order 
(angular, not angular velocity) limit violation.
+       // __relaxationFactor:
+       //              0->1, recommend to stay near 1.
+       //              the lower the value, the less the constraint will fight 
velocities which violate the angular limits.
+       void    setLimit(btScalar _swingSpan1,btScalar _swingSpan2,btScalar 
_twistSpan, btScalar _softness = 1.f, btScalar _biasFactor = 0.3f, btScalar 
_relaxationFactor = 1.0f)
        {
                m_swingSpan1 = _swingSpan1;
                m_swingSpan2 = _swingSpan2;

Modified: 
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
===================================================================
--- 
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
        2009-05-23 19:47:47 UTC (rev 20365)
+++ 
trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
        2009-05-23 20:02:12 UTC (rev 20366)
@@ -26,8 +26,8 @@
 
 
 #define D6_USE_OBSOLETE_METHOD false
-//-----------------------------------------------------------------------------
 
+
 btGeneric6DofConstraint::btGeneric6DofConstraint()
 :btTypedConstraint(D6_CONSTRAINT_TYPE),
 m_useLinearReferenceFrameA(true),
@@ -35,8 +35,8 @@
 {
 }
 
-//-----------------------------------------------------------------------------
 
+
 btGeneric6DofConstraint::btGeneric6DofConstraint(btRigidBody& rbA, 
btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, 
bool useLinearReferenceFrameA)
 : btTypedConstraint(D6_CONSTRAINT_TYPE, rbA, rbB)
 , m_frameInA(frameInA)
@@ -46,13 +46,13 @@
 {
 
 }
-//-----------------------------------------------------------------------------
 
 
+
 #define GENERIC_D6_DISABLE_WARMSTARTING 1
 
-//-----------------------------------------------------------------------------
 
+
 btScalar btGetMatrixElem(const btMatrix3x3& mat, int index);
 btScalar btGetMatrixElem(const btMatrix3x3& mat, int index)
 {
@@ -61,8 +61,8 @@
        return mat[i][j];
 }
 
-//-----------------------------------------------------------------------------
 
+
 ///MatrixToEulerXYZ from 
http://www.geometrictools.com/LibFoundation/Mathematics/Wm4Matrix3.inl.html
 bool   matrixToEulerXYZ(const btMatrix3x3& mat,btVector3& xyz);
 bool   matrixToEulerXYZ(const btMatrix3x3& mat,btVector3& xyz)
@@ -129,8 +129,8 @@
 
 }
 
-//-----------------------------------------------------------------------------
 
+
 btScalar btRotationalLimitMotor::solveAngularLimits(
        btScalar timeStep,btVector3& axis,btScalar jacDiagABInv,
        btRigidBody * body0, btSolverBody& bodyA, btRigidBody * body1, 
btSolverBody& bodyB)
@@ -191,8 +191,8 @@
 
 
        // sort with accumulated impulses
-       btScalar        lo = btScalar(-1e30);
-       btScalar        hi = btScalar(1e30);
+       btScalar        lo = btScalar(-BT_LARGE_FLOAT);
+       btScalar        hi = btScalar(BT_LARGE_FLOAT);
 
        btScalar oldaccumImpulse = m_accumulatedImpulse;
        btScalar sum = oldaccumImpulse + clippedMotorImpulse;
@@ -249,10 +249,10 @@
        m_currentLimit[limitIndex] = 0;//Free from violation
        m_currentLimitError[limitIndex] = btScalar(0.f);
        return 0;
-} // btTranslationalLimitMotor::testLimitValue()
+}
 
-//-----------------------------------------------------------------------------
 
+
 btScalar btTranslationalLimitMotor::solveLinearAxis(
        btScalar timeStep,
        btScalar jacDiagABInv,
@@ -283,8 +283,8 @@
 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to