Th3NiKo

Rigidbody.cpp

May 12th, 2018
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.28 KB | None | 0 0
  1. #include "RigidBody.h"
  2.  
  3. RigidBody::RigidBody (float m, glm::mat3 inertia)
  4. {
  5.     m_mass = m;
  6.     m_inertia = inertia;
  7.     m_invInertia =  glm::inverse(inertia);
  8.     m_invMass = 1.0f / m;
  9. }
  10.  
  11. RigidBody::~RigidBody()
  12. {
  13.     //dtor
  14. }
  15.  
  16. void RigidBody :: Convert ( glm::quat Q, glm::vec3 P, glm::vec3 L, glm::mat3 & R, glm::vec3 & V, glm::vec3 & W) const {
  17.     R = glm::mat3_cast (Q);
  18.     V = P * m_invMass;
  19.     W = R* m_invInertia * glm::transpose (R)*L;
  20. }
  21.  
  22. void RigidBody :: Update ( float t, float dt) {
  23.     float halfdt = 0.5f * dt , sixthdt = dt / 6.0f;
  24.     float tphalfdt = t + halfdt , tpdt = t +dt;
  25.     glm::vec3 XN , PN , LN , VN , WN;
  26.     glm::quat QN;
  27.     glm::mat3 RN;
  28.     // A1 = G(t,S0), B1 = S0 + (dt / 2) * A1
  29.     glm::vec3 A1DXDT = m_V;
  30.     glm::quat A1DQDT = 0.5f * m_W * m_Q;
  31.     glm::vec3 A1DPDT = m_force;
  32.     glm::vec3 A1DLDT = m_torque;
  33.     XN = m_X + halfdt * A1DXDT;
  34.     QN = m_Q + halfdt * A1DQDT;
  35.     PN = m_P + halfdt * A1DPDT;
  36.     LN = m_L + halfdt * A1DLDT;
  37.     Convert (QN ,PN ,LN ,RN ,VN ,WN);
  38.     // A2 = G(t + dt / 2,B1), B2 = S0 + (dt / 2) * A2
  39.     glm::vec3 A2DXDT = VN;
  40.     glm::quat A2DQDT = 0.5f * WN * QN;
  41.     glm::vec3 A2DPDT = m_force;
  42.     glm::vec3 A2DLDT = m_torque;
  43.     XN = m_X + halfdt * A2DXDT;
  44.     QN = m_Q + halfdt * A2DQDT;
  45.     PN = m_P + halfdt * A2DPDT;
  46.     LN = m_L + halfdt * A2DLDT;
  47.     Convert (QN ,PN ,LN ,RN ,VN ,WN);
  48.     // A3 = G(t + dt / 2,B2), B3 = S0 + dt * A3
  49.     glm::vec3 A3DXDT = VN;
  50.     glm::quat A3DQDT = 0.5f * WN * QN;
  51.     glm::vec3 A3DPDT = m_force;
  52.     glm::vec3 A3DLDT = m_torque;
  53.     XN = m_X + dt * A3DXDT;
  54.     QN = m_Q + dt * A3DQDT;
  55.     PN = m_P + dt * A3DPDT;
  56.     LN = m_L + dt * A3DLDT;
  57.     Convert (QN ,PN ,LN ,RN ,VN ,WN);
  58.     // A4 = G(t + dt, B3),
  59.     // S1 = S0 + (dt / 6) * (A1 + 2 * A2 + 2 * A3 + A4)
  60.     glm::vec3 A4DXDT = VN;
  61.     glm::quat A4DQDT = 0.5f * WN * QN;
  62.     glm::vec3 A4DPDT = m_force;
  63.     glm::vec3 A4DLDT = m_torque;
  64.     m_X = m_X + sixthdt *( A1DXDT + 2.0f*( A2DXDT + A3DXDT ) + A4DXDT );
  65.     m_Q = m_Q + sixthdt *( A1DQDT + 2.0f*( A2DQDT + A3DQDT ) + A4DQDT );
  66.     m_P = m_P + sixthdt *( A1DPDT + 2.0f*( A2DPDT + A3DPDT ) + A4DPDT );
  67.     m_L = m_L + sixthdt *( A1DLDT + 2.0f*( A2DLDT + A3DLDT ) + A4DLDT );
  68.     Convert (m_Q ,m_P ,m_L ,m_R ,m_V ,m_W );
  69.  
  70.     m_force = glm::vec3(0.0f, 0.0f, 0.0f);
  71.     m_torque = glm::vec3(0.0f, 0.0f, 0.0f);
  72.  
  73. }
  74.  
  75. void RigidBody::ClearEverything(){
  76.     glm::quat tempQuat = glm::quat(1.0f, 0.0f, 0.0f, 0.0f);
  77.     glm::mat3 jednostkowa = glm::mat3(1.0f);
  78.     glm::vec3 nullVector = glm::vec3(0.0f);
  79.     m_X = nullVector; // position
  80.     m_Q = tempQuat; // orientation
  81.     m_P = nullVector; // linear momentum
  82.     m_L = nullVector; // angular momentum
  83.     // derived state variables
  84.  
  85.     m_R = jednostkowa; // orientation matrix
  86.     m_V = nullVector; // linear velocity vector
  87.     m_W = nullVector; // angular velocity
  88.  
  89.     m_force = glm::vec3(0.0f, 0.0f, 0.0f);
  90.     m_torque = glm::vec3(0.0f, 0.0f, 0.0f);
  91.  
  92. }
  93.  
  94. void RigidBody::AddForce(glm::vec3 force){
  95.     AddForce(force, m_X);
  96. }
  97.  
  98. void RigidBody::AddForce(glm::vec3 force, glm::vec3 position){
  99.     m_force += force;
  100.  
  101.     glm::vec3 taui = glm::cross(position - m_X, force);
  102.     m_torque += taui;
  103. }
  104.  
  105.  
  106. void RigidBody::AddTorque(glm::vec3 _torque){
  107.     m_torque += _torque;
  108. }
Add Comment
Please, Sign In to add comment