[Bf-committers] SVN commit: /data/svn/bf-blender [20369] trunk/blender: Set default constraint solver mode more compatible to Blender 2. 48 settings, this fixes rigid body stacking in this blend file:

Campbell Barton ideasman42 at gmail.com
Sun May 31 07:27:22 CEST 2009


This commit breaks one of the submissions for the game contest - when
moving against a wall the main objects X/Y/Z moves to INF,
http://blenderartists.org/forum/showthread.php?t=150858
http://blenderartists.org/forum/showthread.php?t=157394

The main objects Z anisotropic friction is 0.0, setting it to 0.001
solves it, but 0.0 friction values should be supported and other games
probably use zero anisotropic values.

On Sat, May 23, 2009 at 10:28 PM,  <blender at erwincoumans.com> wrote:
>
> If you think you can rename the pad3 variable in DNA, please go ahead.
>
> Thanks,
> Erwin
>
>
>
>
> Campbell Barton writes:
>
>> Best rename pad3 in DNA, pad's are not meant to be used by blender,
>> only for alignment.
>>
>> On Sun, May 24, 2009 at 8:35 AM, Erwin Coumans <blender at erwincoumans.com> wrote:
>>> Revision: 20369
>>>          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20369
>>> Author:   erwin
>>> Date:     2009-05-24 00:35:47 +0200 (Sun, 24 May 2009)
>>>
>>> Log Message:
>>> -----------
>>> Set default constraint solver mode more compatible to Blender 2.48 settings, this fixes rigid body stacking in this blend file:
>>> http://blenderartists.org/forum/showpost.php?p=1382653&postcount=102
>>>
>>> (todo: expose this setting in World setting GUI)
>>>
>>> Expose contact processing threshold in Advanced GUI, next to rigid body margin, called CPT.
>>> Default to 1, makes rigid body stacking a bit more stable, smaller values makes sliding easier (at the cost of easier jittering).
>>> Disabled for 'dynamic' objects that don't rotate, because characters etc. always need smooth sliding.
>>>
>>> Modified Paths:
>>> --------------
>>>    trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h
>>>    trunk/blender/source/blender/blenkernel/intern/object.c
>>>    trunk/blender/source/blender/blenloader/intern/readfile.c
>>>    trunk/blender/source/blender/makesdna/DNA_object_types.h
>>>    trunk/blender/source/blender/src/buttons_logic.c
>>>    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
>>>    trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
>>>    trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
>>>    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
>>>    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h
>>>
>>> Modified: trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h
>>> ===================================================================
>>> --- trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h      2009-05-23 22:19:25 UTC (rev 20368)
>>> +++ trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h      2009-05-23 22:35:47 UTC (rev 20369)
>>> @@ -77,7 +77,7 @@
>>>                m_splitImpulsePenetrationThreshold = -0.02f;
>>>                m_linearSlop = btScalar(0.0);
>>>                m_warmstartingFactor=btScalar(0.85);
>>> -               m_solverMode = SOLVER_USE_WARMSTARTING | SOLVER_SIMD ;//SOLVER_RANDMIZE_ORDER
>>> +               m_solverMode = SOLVER_USE_WARMSTARTING | SOLVER_USE_2_FRICTION_DIRECTIONS |SOLVER_SIMD | SOLVER_RANDMIZE_ORDER;
>>>                m_restingContactRestitutionThreshold = 2;//resting contact lifetime threshold to disable restitution
>>>        }
>>>  };
>>>
>>> Modified: trunk/blender/source/blender/blenkernel/intern/object.c
>>> ===================================================================
>>> --- trunk/blender/source/blender/blenkernel/intern/object.c     2009-05-23 22:19:25 UTC (rev 20368)
>>> +++ trunk/blender/source/blender/blenkernel/intern/object.c     2009-05-23 22:35:47 UTC (rev 20369)
>>> @@ -984,6 +984,8 @@
>>>        ob->anisotropicFriction[2] = 1.0f;
>>>        ob->gameflag= OB_PROP|OB_COLLISION;
>>>        ob->margin = 0.0;
>>> +       /* ob->pad3 == Contact Processing Threshold */
>>> +       ob->pad3 = 1.;
>>>
>>>        /* NT fluid sim defaults */
>>>        ob->fluidsimFlag = 0;
>>>
>>> Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
>>> ===================================================================
>>> --- trunk/blender/source/blender/blenloader/intern/readfile.c   2009-05-23 22:19:25 UTC (rev 20368)
>>> +++ trunk/blender/source/blender/blenloader/intern/readfile.c   2009-05-23 22:35:47 UTC (rev 20369)
>>> @@ -8083,7 +8083,7 @@
>>>                /* Adjustments needed after Bullets update */
>>>                for(ob = main->object.first; ob; ob= ob->id.next) {
>>>                        ob->damping *= 0.635f;
>>> -                       ob->rdamping = 0.1 + (0.59f * ob->rdamping);
>>> +                       ob->rdamping = 0.1 + (0.8f * ob->rdamping);
>>>                }
>>>        }
>>>
>>> @@ -8105,11 +8105,12 @@
>>>                        wrld->occlusionRes = 128;
>>>                }
>>>        }
>>> -
>>> +
>>>        if (main->versionfile < 248 || (main->versionfile == 248 && main->subversionfile < 5)) {
>>>                Object *ob;
>>>                World *wrld;
>>>                for(ob = main->object.first; ob; ob= ob->id.next) {
>>> +                       ob->pad3 = 1.; //pad3 is used for m_contactProcessingThreshold
>>>                        if(ob->parent) {
>>>                                /* check if top parent has compound shape set and if yes, set this object
>>>                                   to compound shaper as well (was the behaviour before, now it's optional) */
>>>
>>> Modified: trunk/blender/source/blender/makesdna/DNA_object_types.h
>>> ===================================================================
>>> --- trunk/blender/source/blender/makesdna/DNA_object_types.h    2009-05-23 22:19:25 UTC (rev 20368)
>>> +++ trunk/blender/source/blender/makesdna/DNA_object_types.h    2009-05-23 22:35:47 UTC (rev 20369)
>>> @@ -159,7 +159,7 @@
>>>        float margin;
>>>        float max_vel; /* clamp the maximum velocity 0.0 is disabled */
>>>        float min_vel; /* clamp the maximum velocity 0.0 is disabled */
>>> -       float pad3; /* clamp the maximum velocity 0.0 is disabled */
>>> +       float pad3; /* pad3 is now used for m_contactProcessingThreshold, can we still rename it? */
>>>
>>>        char dt, dtx;
>>>        char totcol;    /* copy of mesh or curve or meta */
>>>
>>> Modified: trunk/blender/source/blender/src/buttons_logic.c
>>> ===================================================================
>>> --- trunk/blender/source/blender/src/buttons_logic.c    2009-05-23 22:19:25 UTC (rev 20368)
>>> +++ trunk/blender/source/blender/src/buttons_logic.c    2009-05-23 22:35:47 UTC (rev 20369)
>>> @@ -3198,11 +3198,17 @@
>>>                        uiDefButF(block, NUM, 0, "Margin",
>>>                                        xco, yco, 180, 19, &ob->margin, 0.001, 1.0, 1, 0,
>>>                                        "Collision margin");
>>> +
>>>
>>> -                       yco -= 20;
>>>
>>>                        if (ob->gameflag & OB_RIGID_BODY)
>>>                        {
>>> +                               uiDefButF(block, NUM, 0, "CPT",
>>> +                                       xco+180, yco, 180, 19, &ob->pad3, 0.00, 1., 1, 0,
>>> +                                       "Contact Processing Threshold");
>>> +
>>> +                               yco -= 20;
>>> +
>>>                                uiDefButBitI(block, TOG, OB_LOCK_RIGID_BODY_X_AXIS, 0, "Lock X Axis",
>>>                                        xco, yco, 180, 19, &ob->gameflag2, 0, 0, 0, 0,
>>>                                        "Disable simulation of linear motion along the X axis");
>>> @@ -3226,8 +3232,9 @@
>>>                                uiDefButBitI(block, TOG, OB_LOCK_RIGID_BODY_Z_ROT_AXIS, 0, "Lock Z Rot Axis",
>>>                                        xco+=180, yco, 180, 19, &ob->gameflag2, 0, 0, 0, 0,
>>>                                        "Disable simulation of angular motion along the Z axis");
>>> -                               yco -= 20;
>>>                        }
>>> +
>>> +                       yco -= 20;
>>>                        xco = 0;
>>>
>>>                        uiBlockEndAlign(block);
>>> @@ -3279,6 +3286,10 @@
>>>                        uiDefButF(block, NUM, 0, "Margin",
>>>                                        xco, yco, 180, 19, &ob->margin, 0.0, 1.0, 1, 0,
>>>                                        "Collision margin");
>>> +                       uiDefButF(block, NUM, 0, "CPT",
>>> +                               xco+180, yco, 180, 19, &ob->pad3, 0.00, 1., 1, 0,
>>> +                               "Contact Processing Threshold");
>>> +
>>>                }
>>>                yco -= 20;
>>>                xco = 0;
>>>
>>> Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
>>> ===================================================================
>>> --- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp      2009-05-23 22:19:25 UTC (rev 20368)
>>> +++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp      2009-05-23 22:35:47 UTC (rev 20369)
>>> @@ -1412,11 +1412,22 @@
>>>        objprop.m_isCompoundChild = isCompoundChild;
>>>        objprop.m_hasCompoundChildren = hasCompoundChildren;
>>>        objprop.m_margin = blenderobject->margin;
>>> +
>>>        // ACTOR is now a separate feature
>>>        objprop.m_isactor = (blenderobject->gameflag & OB_ACTOR)!=0;
>>>        objprop.m_dyna = (blenderobject->gameflag & OB_DYNAMIC) != 0;
>>>        objprop.m_softbody = (blenderobject->gameflag & OB_SOFT_BODY) != 0;
>>>        objprop.m_angular_rigidbody = (blenderobject->gameflag & OB_RIGID_BODY) != 0;
>>> +
>>> +       ///contact processing threshold is only for rigid bodies and static geometry, not 'dynamic'
>>> +       if (objprop.m_angular_rigidbody || !objprop.m_dyna )
>>> +       {
>>> +               objprop.m_contactProcessingThreshold = blenderobject->pad3;
>>> +       } else
>>> +       {
>>> +               objprop.m_contactProcessingThreshold = 0.f;
>>> +       }
>>> +
>>>        objprop.m_sensor = (blenderobject->gameflag & OB_SENSOR) != 0;
>>>
>>>        if (objprop.m_softbody)
>>> @@ -1461,6 +1472,7 @@
>>>                        objprop.m_soft_numclusteriterations= blenderobject->bsoft->numclusteriterations;        /* number of iterations to refine collision clusters*/
>>>                        objprop.m_soft_welding = blenderobject->bsoft->welding;         /* welding */
>>>                        objprop.m_margin = blenderobject->bsoft->margin;
>>> +                       objprop.m_contactProcessingThreshold = 0.f;
>>>                } else
>>>                {
>>>                        objprop.m_gamesoftFlag = OB_BSB_BENDING_CONSTRAINTS | OB_BSB_SHAPE_MATCHING | OB_BSB_AERO_VPOINT;
>>> @@ -1501,6 +1513,7 @@
>>>                        objprop.m_soft_numclusteriterations= 16;
>>>                        objprop.m_soft_welding = 0.f;
>>>                        objprop.m_margin = 0.f;
>>> +                       objprop.m_contactProcessingThreshold = 0.f;
>>>                }
>>>        }
>>>
>>>
>>> Modified: trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
>>> ===================================================================
>>> --- trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h    2009-05-23 22:19:25 UTC (rev 20368)
>>> +++ trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h    2009-05-23 22:35:47 UTC (rev 20369)
>>> @@ -139,6 +139,8 @@
>>>
>>>        /////////////////////////
>>>        double  m_margin;
>>> +       float   m_contactProcessingThreshold;
>>> +
>>>        KX_BoundBoxClass        m_boundclass;
>>>        union {
>>>                KX_BoxBounds    box;
>>>
>>> Modified: trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
>>> ===================================================================
>>> --- trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp 2009-05-23 22:19:25 UTC (rev 20368)
>>> +++ trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp 2009-05-23 22:35:47 UTC (rev 20369)
>>> @@ -1103,6 +1103,8 @@
>>>                (isbulletdyna) ? short(CcdConstructionInfo::AllFilter) :
>>>                short(CcdConstructionInfo::AllFilter ^ CcdConstructionInfo::StaticFilter);
>>>        ci.m_bRigid = objprop->m_dyna && objprop->m_angular_rigidbody;
>>> +
>>> +       ci.m_contactProcessingThreshold = objprop->m_contactProcessingThreshold;//todo: expose this in advanced settings, just like margin, default to 10000 or so
>>>        ci.m_bSoft = objprop->m_softbody;
>>>        ci.m_bSensor = isbulletsensor;
>>>        MT_Vector3 scaling = gameobj->NodeGetWorldScaling();
>>>
>>> Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
>>> ===================================================================
>>> --- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp     2009-05-23 22:19:25 UTC (rev 20368)
>>> +++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp     2009-05-23 22:35:47 UTC (rev 20369)
>>> @@ -519,6 +519,8 @@
>>>                {
>>>                        body->setAngularFactor(0.f);
>>>                }
>>> +               body->setContactProcessingThreshold(m_cci.m_contactProcessingThreshold);
>>> +
>>>        }
>>>        if (m_object && m_cci.m_do_anisotropic)
>>>        {
>>>
>>> Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h
>>> ===================================================================
>>> --- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h       2009-05-23 22:19:25 UTC (rev 20368)
>>> +++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h       2009-05-23 22:35:47 UTC (rev 20369)
>>> @@ -231,7 +231,8 @@
>>>                m_physicsEnv(0),
>>>                m_inertiaFactor(1.f),
>>>                m_do_anisotropic(false),
>>> -               m_anisotropicFriction(1.f,1.f,1.f)
>>> +               m_anisotropicFriction(1.f,1.f,1.f),
>>> +               m_contactProcessingThreshold(1e10)
>>>        {
>>>        }
>>>
>>> @@ -317,6 +318,13 @@
>>>        btScalar        m_fh_distance;           ///< The range above the surface where Fh is active.
>>>        bool            m_fh_normal;             ///< Should the object slide off slopes?
>>>        float           m_radius;//for fh backwards compatibility
>>> +
>>> +       ///m_contactProcessingThreshold allows to process contact points with positive distance
>>> +       ///normally only contacts with negative distance (penetration) are solved
>>> +       ///however, rigid body stacking is more stable when positive contacts are still passed into the constraint solver
>>> +       ///this might sometimes lead to collisions with 'internal edges' such as a sliding character controller
>>> +       ///so disable/set m_contactProcessingThreshold to zero for sliding characters etc.
>>> +       float           m_contactProcessingThreshold;///< Process contacts with positive distance in range [0..INF]
>>>
>>>  };
>>>
>>>
>>>
>>> _______________________________________________
>>> Bf-blender-cvs mailing list
>>> Bf-blender-cvs at blender.org
>>> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>>>
>>
>>
>>
>> --
>> - Campbell
>> _______________________________________________
>> Bf-committers mailing list
>> Bf-committers at blender.org
>> http://lists.blender.org/mailman/listinfo/bf-committers
>
>
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers
>



-- 
- Campbell


More information about the Bf-committers mailing list