aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs')
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs81
1 files changed, 67 insertions, 14 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
index d4ee27d..f3b70c3 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
@@ -51,16 +51,26 @@ public sealed class BSLinksetConstraints : BSLinkset
51 public float cfm; 51 public float cfm;
52 public float erp; 52 public float erp;
53 public float solverIterations; 53 public float solverIterations;
54 //
55 public OMV.Vector3 frameInAloc;
56 public OMV.Quaternion frameInArot;
57 public OMV.Vector3 frameInBloc;
58 public OMV.Quaternion frameInBrot;
59 // Spring
60 public float springDamping;
61 public float springStiffness;
62
63
54 64
55 public BSLinkInfoConstraint(BSPrimLinkable pMember) 65 public BSLinkInfoConstraint(BSPrimLinkable pMember)
56 : base(pMember) 66 : base(pMember)
57 { 67 {
58 constraint = null; 68 constraint = null;
59 ResetToFixedConstraint(); 69 ResetLink();
60 } 70 }
61 71
62 // Set all the parameters for this constraint to a fixed, non-movable constraint. 72 // Set all the parameters for this constraint to a fixed, non-movable constraint.
63 public void ResetToFixedConstraint() 73 public override void ResetLink()
64 { 74 {
65 constraintType = ConstraintType.D6_CONSTRAINT_TYPE; 75 constraintType = ConstraintType.D6_CONSTRAINT_TYPE;
66 linearLimitLow = OMV.Vector3.Zero; 76 linearLimitLow = OMV.Vector3.Zero;
@@ -74,10 +84,16 @@ public sealed class BSLinksetConstraints : BSLinkset
74 cfm = BSParam.LinkConstraintCFM; 84 cfm = BSParam.LinkConstraintCFM;
75 erp = BSParam.LinkConstraintERP; 85 erp = BSParam.LinkConstraintERP;
76 solverIterations = BSParam.LinkConstraintSolverIterations; 86 solverIterations = BSParam.LinkConstraintSolverIterations;
87 frameInAloc = OMV.Vector3.Zero;
88 frameInArot = OMV.Quaternion.Identity;
89 frameInBloc = OMV.Vector3.Zero;
90 frameInBrot = OMV.Quaternion.Identity;
91 springDamping = -1f;
92 springStiffness = -1f;
77 } 93 }
78 94
79 // Given a constraint, apply the current constraint parameters to same. 95 // Given a constraint, apply the current constraint parameters to same.
80 public void SetConstraintParameters(BSConstraint constrain) 96 public override void SetLinkParameters(BSConstraint constrain)
81 { 97 {
82 switch (constraintType) 98 switch (constraintType)
83 { 99 {
@@ -85,6 +101,7 @@ public sealed class BSLinksetConstraints : BSLinkset
85 BSConstraint6Dof constrain6dof = constrain as BSConstraint6Dof; 101 BSConstraint6Dof constrain6dof = constrain as BSConstraint6Dof;
86 if (constrain6dof != null) 102 if (constrain6dof != null)
87 { 103 {
104 // NOTE: D6_SPRING_CONSTRAINT_TYPE should be updated if you change any of this code.
88 // zero linear and angular limits makes the objects unable to move in relation to each other 105 // zero linear and angular limits makes the objects unable to move in relation to each other
89 constrain6dof.SetLinearLimits(linearLimitLow, linearLimitHigh); 106 constrain6dof.SetLinearLimits(linearLimitLow, linearLimitHigh);
90 constrain6dof.SetAngularLimits(angularLimitLow, angularLimitHigh); 107 constrain6dof.SetAngularLimits(angularLimitLow, angularLimitHigh);
@@ -99,6 +116,31 @@ public sealed class BSLinksetConstraints : BSLinkset
99 } 116 }
100 } 117 }
101 break; 118 break;
119 case ConstraintType.D6_SPRING_CONSTRAINT_TYPE:
120 BSConstraintSpring constrainSpring = constrain as BSConstraintSpring;
121 if (constrainSpring != null)
122 {
123 // zero linear and angular limits makes the objects unable to move in relation to each other
124 constrainSpring.SetLinearLimits(linearLimitLow, linearLimitHigh);
125 constrainSpring.SetAngularLimits(angularLimitLow, angularLimitHigh);
126
127 // tweek the constraint to increase stability
128 constrainSpring.UseFrameOffset(useFrameOffset);
129 constrainSpring.TranslationalLimitMotor(enableTransMotor, transMotorMaxVel, transMotorMaxForce);
130 constrainSpring.SetCFMAndERP(cfm, erp);
131 if (solverIterations != 0f)
132 {
133 constrainSpring.SetSolverIterations(solverIterations);
134 }
135 for (int ii = 0; ii < 6; ii++)
136 {
137 if (springDamping != -1)
138 constrainSpring.SetDamping(ii, springDamping);
139 if (springStiffness != -1)
140 constrainSpring.SetStiffness(ii, springStiffness);
141 }
142 }
143 break;
102 default: 144 default:
103 break; 145 break;
104 } 146 }
@@ -262,8 +304,8 @@ public sealed class BSLinksetConstraints : BSLinkset
262 // Create a static constraint between the two passed objects 304 // Create a static constraint between the two passed objects
263 private BSConstraint BuildConstraint(BSPrimLinkable rootPrim, BSLinkInfo li) 305 private BSConstraint BuildConstraint(BSPrimLinkable rootPrim, BSLinkInfo li)
264 { 306 {
265 BSLinkInfoConstraint liConstraint = li as BSLinkInfoConstraint; 307 BSLinkInfoConstraint linkInfo = li as BSLinkInfoConstraint;
266 if (liConstraint == null) 308 if (linkInfo == null)
267 return null; 309 return null;
268 310
269 // Zero motion for children so they don't interpolate 311 // Zero motion for children so they don't interpolate
@@ -271,27 +313,25 @@ public sealed class BSLinksetConstraints : BSLinkset
271 313
272 BSConstraint constrain = null; 314 BSConstraint constrain = null;
273 315
274 switch (liConstraint.constraintType) 316 switch (linkInfo.constraintType)
275 { 317 {
276 case ConstraintType.D6_CONSTRAINT_TYPE: 318 case ConstraintType.D6_CONSTRAINT_TYPE:
277 // Relative position normalized to the root prim 319 // Relative position normalized to the root prim
278 // Essentually a vector pointing from center of rootPrim to center of li.member 320 // Essentually a vector pointing from center of rootPrim to center of li.member
279 OMV.Vector3 childRelativePosition = liConstraint.member.Position - rootPrim.Position; 321 OMV.Vector3 childRelativePosition = linkInfo.member.Position - rootPrim.Position;
280 322
281 // real world coordinate of midpoint between the two objects 323 // real world coordinate of midpoint between the two objects
282 OMV.Vector3 midPoint = rootPrim.Position + (childRelativePosition / 2); 324 OMV.Vector3 midPoint = rootPrim.Position + (childRelativePosition / 2);
283 325
284 DetailLog("{0},BSLinksetConstraint.BuildConstraint,taint,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6},midLoc={7}", 326 DetailLog("{0},BSLinksetConstraint.BuildConstraint,6Dof,rBody={1},cBody={2},rLoc={3},cLoc={4},midLoc={7}",
285 rootPrim.LocalID, 327 rootPrim.LocalID, rootPrim.PhysBody, linkInfo.member.PhysBody,
286 rootPrim.LocalID, rootPrim.PhysBody.AddrString, 328 rootPrim.Position, linkInfo.member.Position, midPoint);
287 liConstraint.member.LocalID, liConstraint.member.PhysBody.AddrString,
288 rootPrim.Position, liConstraint.member.Position, midPoint);
289 329
290 // create a constraint that allows no freedom of movement between the two objects 330 // create a constraint that allows no freedom of movement between the two objects
291 // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818 331 // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818
292 332
293 constrain = new BSConstraint6Dof( 333 constrain = new BSConstraint6Dof(
294 m_physicsScene.World, rootPrim.PhysBody, liConstraint.member.PhysBody, midPoint, true, true ); 334 m_physicsScene.World, rootPrim.PhysBody, linkInfo.member.PhysBody, midPoint, true, true );
295 335
296 /* NOTE: below is an attempt to build constraint with full frame computation, etc. 336 /* NOTE: below is an attempt to build constraint with full frame computation, etc.
297 * Using the midpoint is easier since it lets the Bullet code manipulate the transforms 337 * Using the midpoint is easier since it lets the Bullet code manipulate the transforms
@@ -320,11 +360,23 @@ public sealed class BSLinksetConstraints : BSLinkset
320 */ 360 */
321 361
322 break; 362 break;
363 case ConstraintType.D6_SPRING_CONSTRAINT_TYPE:
364 constrain = new BSConstraintSpring(m_physicsScene.World, rootPrim.PhysBody, linkInfo.member.PhysBody,
365 linkInfo.frameInAloc, linkInfo.frameInArot, linkInfo.frameInBloc, linkInfo.frameInBrot,
366 true /*useLinearReferenceFrameA*/,
367 true /*disableCollisionsBetweenLinkedBodies*/);
368 DetailLog("{0},BSLinksetConstraint.BuildConstraint,spring,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6},midLoc={7}",
369 rootPrim.LocalID,
370 rootPrim.LocalID, rootPrim.PhysBody.AddrString,
371 linkInfo.member.LocalID, linkInfo.member.PhysBody.AddrString,
372 rootPrim.Position, linkInfo.member.Position);
373
374 break;
323 default: 375 default:
324 break; 376 break;
325 } 377 }
326 378
327 liConstraint.SetConstraintParameters(constrain); 379 linkInfo.SetLinkParameters(constrain);
328 380
329 m_physicsScene.Constraints.AddConstraint(constrain); 381 m_physicsScene.Constraints.AddConstraint(constrain);
330 382
@@ -401,6 +453,7 @@ public sealed class BSLinksetConstraints : BSLinkset
401 // If constraint doesn't exist yet, create it. 453 // If constraint doesn't exist yet, create it.
402 constrain = BuildConstraint(LinksetRoot, li); 454 constrain = BuildConstraint(LinksetRoot, li);
403 } 455 }
456 li.SetLinkParameters(constrain);
404 constrain.RecomputeConstraintVariables(linksetMass); 457 constrain.RecomputeConstraintVariables(linksetMass);
405 458
406 // PhysicsScene.PE.DumpConstraint(PhysicsScene.World, constrain.Constraint); // DEBUG DEBUG 459 // PhysicsScene.PE.DumpConstraint(PhysicsScene.World, constrain.Constraint); // DEBUG DEBUG