b3ConvertConstraint4.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include "Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h"
  2. #include "Bullet3Dynamics/shared/b3ContactConstraint4.h"
  3. #include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h"
  4. void b3PlaneSpace1 (b3Float4ConstArg n, b3Float4* p, b3Float4* q);
  5. void b3PlaneSpace1 (b3Float4ConstArg n, b3Float4* p, b3Float4* q)
  6. {
  7. if (b3Fabs(n.z) > 0.70710678f) {
  8. // choose p in y-z plane
  9. float a = n.y*n.y + n.z*n.z;
  10. float k = 1.f/sqrt(a);
  11. p[0].x = 0;
  12. p[0].y = -n.z*k;
  13. p[0].z = n.y*k;
  14. // set q = n x p
  15. q[0].x = a*k;
  16. q[0].y = -n.x*p[0].z;
  17. q[0].z = n.x*p[0].y;
  18. }
  19. else {
  20. // choose p in x-y plane
  21. float a = n.x*n.x + n.y*n.y;
  22. float k = 1.f/sqrt(a);
  23. p[0].x = -n.y*k;
  24. p[0].y = n.x*k;
  25. p[0].z = 0;
  26. // set q = n x p
  27. q[0].x = -n.z*p[0].y;
  28. q[0].y = n.z*p[0].x;
  29. q[0].z = a*k;
  30. }
  31. }
  32. void setLinearAndAngular( b3Float4ConstArg n, b3Float4ConstArg r0, b3Float4ConstArg r1, b3Float4* linear, b3Float4* angular0, b3Float4* angular1)
  33. {
  34. *linear = b3MakeFloat4(n.x,n.y,n.z,0.f);
  35. *angular0 = b3Cross3(r0, n);
  36. *angular1 = -b3Cross3(r1, n);
  37. }
  38. float calcRelVel( b3Float4ConstArg l0, b3Float4ConstArg l1, b3Float4ConstArg a0, b3Float4ConstArg a1, b3Float4ConstArg linVel0,
  39. b3Float4ConstArg angVel0, b3Float4ConstArg linVel1, b3Float4ConstArg angVel1 )
  40. {
  41. return b3Dot3F4(l0, linVel0) + b3Dot3F4(a0, angVel0) + b3Dot3F4(l1, linVel1) + b3Dot3F4(a1, angVel1);
  42. }
  43. float calcJacCoeff(b3Float4ConstArg linear0, b3Float4ConstArg linear1, b3Float4ConstArg angular0, b3Float4ConstArg angular1,
  44. float invMass0, const b3Mat3x3* invInertia0, float invMass1, const b3Mat3x3* invInertia1)
  45. {
  46. // linear0,1 are normlized
  47. float jmj0 = invMass0;//b3Dot3F4(linear0, linear0)*invMass0;
  48. float jmj1 = b3Dot3F4(mtMul3(angular0,*invInertia0), angular0);
  49. float jmj2 = invMass1;//b3Dot3F4(linear1, linear1)*invMass1;
  50. float jmj3 = b3Dot3F4(mtMul3(angular1,*invInertia1), angular1);
  51. return -1.f/(jmj0+jmj1+jmj2+jmj3);
  52. }
  53. void setConstraint4( b3Float4ConstArg posA, b3Float4ConstArg linVelA, b3Float4ConstArg angVelA, float invMassA, b3Mat3x3ConstArg invInertiaA,
  54. b3Float4ConstArg posB, b3Float4ConstArg linVelB, b3Float4ConstArg angVelB, float invMassB, b3Mat3x3ConstArg invInertiaB,
  55. __global struct b3Contact4Data* src, float dt, float positionDrift, float positionConstraintCoeff,
  56. b3ContactConstraint4_t* dstC )
  57. {
  58. dstC->m_bodyA = abs(src->m_bodyAPtrAndSignBit);
  59. dstC->m_bodyB = abs(src->m_bodyBPtrAndSignBit);
  60. float dtInv = 1.f/dt;
  61. for(int ic=0; ic<4; ic++)
  62. {
  63. dstC->m_appliedRambdaDt[ic] = 0.f;
  64. }
  65. dstC->m_fJacCoeffInv[0] = dstC->m_fJacCoeffInv[1] = 0.f;
  66. dstC->m_linear = src->m_worldNormalOnB;
  67. dstC->m_linear.w = 0.7f ;//src->getFrictionCoeff() );
  68. for(int ic=0; ic<4; ic++)
  69. {
  70. b3Float4 r0 = src->m_worldPosB[ic] - posA;
  71. b3Float4 r1 = src->m_worldPosB[ic] - posB;
  72. if( ic >= src->m_worldNormalOnB.w )//npoints
  73. {
  74. dstC->m_jacCoeffInv[ic] = 0.f;
  75. continue;
  76. }
  77. float relVelN;
  78. {
  79. b3Float4 linear, angular0, angular1;
  80. setLinearAndAngular(src->m_worldNormalOnB, r0, r1, &linear, &angular0, &angular1);
  81. dstC->m_jacCoeffInv[ic] = calcJacCoeff(linear, -linear, angular0, angular1,
  82. invMassA, &invInertiaA, invMassB, &invInertiaB );
  83. relVelN = calcRelVel(linear, -linear, angular0, angular1,
  84. linVelA, angVelA, linVelB, angVelB);
  85. float e = 0.f;//src->getRestituitionCoeff();
  86. if( relVelN*relVelN < 0.004f ) e = 0.f;
  87. dstC->m_b[ic] = e*relVelN;
  88. //float penetration = src->m_worldPosB[ic].w;
  89. dstC->m_b[ic] += (src->m_worldPosB[ic].w + positionDrift)*positionConstraintCoeff*dtInv;
  90. dstC->m_appliedRambdaDt[ic] = 0.f;
  91. }
  92. }
  93. if( src->m_worldNormalOnB.w > 0 )//npoints
  94. { // prepare friction
  95. b3Float4 center = b3MakeFloat4(0.f,0.f,0.f,0.f);
  96. for(int i=0; i<src->m_worldNormalOnB.w; i++)
  97. center += src->m_worldPosB[i];
  98. center /= (float)src->m_worldNormalOnB.w;
  99. b3Float4 tangent[2];
  100. b3PlaneSpace1(src->m_worldNormalOnB,&tangent[0],&tangent[1]);
  101. b3Float4 r[2];
  102. r[0] = center - posA;
  103. r[1] = center - posB;
  104. for(int i=0; i<2; i++)
  105. {
  106. b3Float4 linear, angular0, angular1;
  107. setLinearAndAngular(tangent[i], r[0], r[1], &linear, &angular0, &angular1);
  108. dstC->m_fJacCoeffInv[i] = calcJacCoeff(linear, -linear, angular0, angular1,
  109. invMassA, &invInertiaA, invMassB, &invInertiaB );
  110. dstC->m_fAppliedRambdaDt[i] = 0.f;
  111. }
  112. dstC->m_center = center;
  113. }
  114. for(int i=0; i<4; i++)
  115. {
  116. if( i<src->m_worldNormalOnB.w )
  117. {
  118. dstC->m_worldPos[i] = src->m_worldPosB[i];
  119. }
  120. else
  121. {
  122. dstC->m_worldPos[i] = b3MakeFloat4(0.f,0.f,0.f,0.f);
  123. }
  124. }
  125. }