b3IntegrateTransforms.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h"
  2. inline void integrateSingleTransform(__global b3RigidBodyData_t* bodies, int nodeID, float timeStep, float angularDamping, b3Float4ConstArg gravityAcceleration)
  3. {
  4. if (bodies[nodeID].m_invMass != 0.f)
  5. {
  6. float BT_GPU_ANGULAR_MOTION_THRESHOLD = (0.25f * 3.14159254f);
  7. //angular velocity
  8. {
  9. b3Float4 axis;
  10. //add some hardcoded angular damping
  11. bodies[nodeID].m_angVel.x *= angularDamping;
  12. bodies[nodeID].m_angVel.y *= angularDamping;
  13. bodies[nodeID].m_angVel.z *= angularDamping;
  14. b3Float4 angvel = bodies[nodeID].m_angVel;
  15. float fAngle = b3Sqrt(b3Dot3F4(angvel, angvel));
  16. //limit the angular motion
  17. if (fAngle * timeStep > BT_GPU_ANGULAR_MOTION_THRESHOLD)
  18. {
  19. fAngle = BT_GPU_ANGULAR_MOTION_THRESHOLD / timeStep;
  20. }
  21. if (fAngle < 0.001f)
  22. {
  23. // use Taylor's expansions of sync function
  24. axis = angvel * (0.5f * timeStep - (timeStep * timeStep * timeStep) * 0.020833333333f * fAngle * fAngle);
  25. }
  26. else
  27. {
  28. // sync(fAngle) = sin(c*fAngle)/t
  29. axis = angvel * (b3Sin(0.5f * fAngle * timeStep) / fAngle);
  30. }
  31. b3Quat dorn;
  32. dorn.x = axis.x;
  33. dorn.y = axis.y;
  34. dorn.z = axis.z;
  35. dorn.w = b3Cos(fAngle * timeStep * 0.5f);
  36. b3Quat orn0 = bodies[nodeID].m_quat;
  37. b3Quat predictedOrn = b3QuatMul(dorn, orn0);
  38. predictedOrn = b3QuatNormalized(predictedOrn);
  39. bodies[nodeID].m_quat = predictedOrn;
  40. }
  41. //linear velocity
  42. bodies[nodeID].m_pos += bodies[nodeID].m_linVel * timeStep;
  43. //apply gravity
  44. bodies[nodeID].m_linVel += gravityAcceleration * timeStep;
  45. }
  46. }
  47. inline void b3IntegrateTransform(__global b3RigidBodyData_t* body, float timeStep, float angularDamping, b3Float4ConstArg gravityAcceleration)
  48. {
  49. float BT_GPU_ANGULAR_MOTION_THRESHOLD = (0.25f * 3.14159254f);
  50. if ((body->m_invMass != 0.f))
  51. {
  52. //angular velocity
  53. {
  54. b3Float4 axis;
  55. //add some hardcoded angular damping
  56. body->m_angVel.x *= angularDamping;
  57. body->m_angVel.y *= angularDamping;
  58. body->m_angVel.z *= angularDamping;
  59. b3Float4 angvel = body->m_angVel;
  60. float fAngle = b3Sqrt(b3Dot3F4(angvel, angvel));
  61. //limit the angular motion
  62. if (fAngle * timeStep > BT_GPU_ANGULAR_MOTION_THRESHOLD)
  63. {
  64. fAngle = BT_GPU_ANGULAR_MOTION_THRESHOLD / timeStep;
  65. }
  66. if (fAngle < 0.001f)
  67. {
  68. // use Taylor's expansions of sync function
  69. axis = angvel * (0.5f * timeStep - (timeStep * timeStep * timeStep) * 0.020833333333f * fAngle * fAngle);
  70. }
  71. else
  72. {
  73. // sync(fAngle) = sin(c*fAngle)/t
  74. axis = angvel * (b3Sin(0.5f * fAngle * timeStep) / fAngle);
  75. }
  76. b3Quat dorn;
  77. dorn.x = axis.x;
  78. dorn.y = axis.y;
  79. dorn.z = axis.z;
  80. dorn.w = b3Cos(fAngle * timeStep * 0.5f);
  81. b3Quat orn0 = body->m_quat;
  82. b3Quat predictedOrn = b3QuatMul(dorn, orn0);
  83. predictedOrn = b3QuatNormalized(predictedOrn);
  84. body->m_quat = predictedOrn;
  85. }
  86. //apply gravity
  87. body->m_linVel += gravityAcceleration * timeStep;
  88. //linear velocity
  89. body->m_pos += body->m_linVel * timeStep;
  90. }
  91. }