247 int i, s =
info->rowskip;
252 btVector3 ofs = trB.getOrigin() - trA.getOrigin();
269 btVector3 ax1A = trA.getBasis().getColumn(0);
270 btVector3 ax1B = trB.getBasis().getColumn(0);
275 ax1 = ax1A * factA + ax1B * factB;
282 ax1 = trA.getBasis().getColumn(0);
284 p = trA.getBasis().getColumn(1);
285 q = trA.getBasis().getColumn(2);
295 info->m_J1angularAxis[0] = p[0];
296 info->m_J1angularAxis[1] = p[1];
297 info->m_J1angularAxis[2] = p[2];
298 info->m_J1angularAxis[s + 0] = q[0];
299 info->m_J1angularAxis[s + 1] = q[1];
300 info->m_J1angularAxis[s + 2] = q[2];
302 info->m_J2angularAxis[0] = -p[0];
303 info->m_J2angularAxis[1] = -p[1];
304 info->m_J2angularAxis[2] = -p[2];
305 info->m_J2angularAxis[s + 0] = -q[0];
306 info->m_J2angularAxis[s + 1] = -q[1];
307 info->m_J2angularAxis[s + 2] = -q[2];
327 btVector3 u = ax1A.cross(ax1B);
328 info->m_constraintError[0] = k * u.dot(p);
329 info->m_constraintError[s] = k * u.dot(q);
351 btVector3 tmpA(0, 0, 0), tmpB(0, 0, 0), relA(0, 0, 0), relB(0, 0, 0), c(0, 0, 0);
355 relB = trB.getOrigin() - bodyB_trans.getOrigin();
357 btVector3 projB = ax1 * relB.dot(ax1);
359 btVector3 orthoB = relB - projB;
361 relA = trA.getOrigin() - bodyA_trans.getOrigin();
362 btVector3 projA = ax1 * relA.dot(ax1);
363 btVector3 orthoA = relA - projA;
367 btVector3 totalDist = projA + ax1 * sliderOffs - projB;
369 relA = orthoA + totalDist * factA;
370 relB = orthoB - totalDist * factB;
372 p = orthoB * factA + orthoA * factB;
380 p = trA.getBasis().getColumn(1);
385 tmpA = relA.cross(p);
386 tmpB = relB.cross(p);
387 for (i = 0; i < 3; i++)
info->m_J1angularAxis[s2 + i] = tmpA[i];
388 for (i = 0; i < 3; i++)
info->m_J2angularAxis[s2 + i] = -tmpB[i];
389 tmpA = relA.cross(q);
390 tmpB = relB.cross(q);
397 for (i = 0; i < 3; i++)
info->m_J1angularAxis[s3 + i] = tmpA[i];
398 for (i = 0; i < 3; i++)
info->m_J2angularAxis[s3 + i] = -tmpB[i];
399 for (i = 0; i < 3; i++)
info->m_J1linearAxis[s2 + i] = p[i];
400 for (i = 0; i < 3; i++)
info->m_J1linearAxis[s3 + i] = q[i];
401 for (i = 0; i < 3; i++)
info->m_J2linearAxis[s2 + i] = -p[i];
402 for (i = 0; i < 3; i++)
info->m_J2linearAxis[s3 + i] = -q[i];
407 c = bodyB_trans.getOrigin() - bodyA_trans.getOrigin();
408 btVector3 tmp = c.cross(p);
409 for (i = 0; i < 3; i++)
info->m_J1angularAxis[s2 + i] = factA * tmp[i];
410 for (i = 0; i < 3; i++)
info->m_J2angularAxis[s2 + i] = factB * tmp[i];
412 for (i = 0; i < 3; i++)
info->m_J1angularAxis[s3 + i] = factA * tmp[i];
413 for (i = 0; i < 3; i++)
info->m_J2angularAxis[s3 + i] = factB * tmp[i];
415 for (i = 0; i < 3; i++)
info->m_J1linearAxis[s2 + i] = p[i];
416 for (i = 0; i < 3; i++)
info->m_J1linearAxis[s3 + i] = q[i];
417 for (i = 0; i < 3; i++)
info->m_J2linearAxis[s2 + i] = -p[i];
418 for (i = 0; i < 3; i++)
info->m_J2linearAxis[s3 + i] = -q[i];
424 k =
info->fps * currERP;
427 info->m_constraintError[s2] =
rhs;
428 rhs = k * q.dot(ofs);
429 info->m_constraintError[s3] =
rhs;
442 limit = (limit_err >
btScalar(0.0)) ? 2 : 1;
446 if (limit || powered)
449 srow = nrow *
info->rowskip;
450 info->m_J1linearAxis[srow + 0] = ax1[0];
451 info->m_J1linearAxis[srow + 1] = ax1[1];
452 info->m_J1linearAxis[srow + 2] = ax1[2];
453 info->m_J2linearAxis[srow + 0] = -ax1[0];
454 info->m_J2linearAxis[srow + 1] = -ax1[1];
455 info->m_J2linearAxis[srow + 2] = -ax1[2];
468 tmpA = relA.cross(ax1);
469 tmpB = relB.cross(ax1);
470 info->m_J1angularAxis[srow + 0] = tmpA[0];
471 info->m_J1angularAxis[srow + 1] = tmpA[1];
472 info->m_J1angularAxis[srow + 2] = tmpA[2];
473 info->m_J2angularAxis[srow + 0] = -tmpB[0];
474 info->m_J2angularAxis[srow + 1] = -tmpB[1];
475 info->m_J2angularAxis[srow + 2] = -tmpB[2];
482 info->m_J1angularAxis[srow + 0] = factA * ltd[0];
483 info->m_J1angularAxis[srow + 1] = factA * ltd[1];
484 info->m_J1angularAxis[srow + 2] = factA * ltd[2];
485 info->m_J2angularAxis[srow + 0] = factB * ltd[0];
486 info->m_J2angularAxis[srow + 1] = factB * ltd[1];
487 info->m_J2angularAxis[srow + 2] = factB * ltd[2];
492 if (limit && (lostop == histop))
496 info->m_constraintError[srow] = 0.;
497 info->m_lowerLimit[srow] = 0.;
498 info->m_upperLimit[srow] = 0.;
514 k =
info->fps * currERP;
515 info->m_constraintError[srow] += k * limit_err;
520 if (lostop == histop)
528 info->m_upperLimit[srow] = 0;
532 info->m_lowerLimit[srow] = 0;
540 vel -= linVelB.dot(ax1);
549 if (newc >
info->m_constraintError[srow])
551 info->m_constraintError[srow] = newc;
560 if (newc < info->m_constraintError[srow])
562 info->m_constraintError[srow] = newc;
576 limit = (limit_err >
btScalar(0.0)) ? 1 : 2;
580 if (limit || powered)
583 srow = nrow *
info->rowskip;
584 info->m_J1angularAxis[srow + 0] = ax1[0];
585 info->m_J1angularAxis[srow + 1] = ax1[1];
586 info->m_J1angularAxis[srow + 2] = ax1[2];
588 info->m_J2angularAxis[srow + 0] = -ax1[0];
589 info->m_J2angularAxis[srow + 1] = -ax1[1];
590 info->m_J2angularAxis[srow + 2] = -ax1[2];
594 if (limit && (lostop == histop))
612 k =
info->fps * currERP;
613 info->m_constraintError[srow] += k * limit_err;
618 if (lostop == histop)
626 info->m_lowerLimit[srow] = 0;
632 info->m_upperLimit[srow] = 0;
647 if (newc >
info->m_constraintError[srow])
649 info->m_constraintError[srow] = newc;
658 if (newc < info->m_constraintError[srow])
660 info->m_constraintError[srow] = newc;