Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.59 KB | None | 0 0
  1. //my listener for gravity physics
  2.     class GravityListener : public VEEventListener {
  3.         VESceneNode* m_pObject = nullptr;
  4.         VESceneNode* m_pPlane = nullptr;
  5.  
  6.         glm::vec3 f = glm::vec3(0, 0, 0);
  7.         glm::vec3 v = glm::vec3(0, 0, 0);
  8.         glm::vec3 w = glm::vec3(0, 0, 0);
  9.         glm::vec3 l = glm::vec3(0, 0, 0);
  10.  
  11.         float m = 1;
  12.         float width = 1;
  13.         float height = 1;
  14.         float depth = 1;
  15.  
  16.         glm::mat3 i = glm::mat3(
  17.             glm::vec3(1.0f / 12.0f * m * (height * height + depth * depth), 0, 0),
  18.             glm::vec3(0, 1.0f / 12.0f * m * (width * width + depth * depth), 0),
  19.             glm::vec3(0, 0, 1.0f / 12.f * m * (width * width + height * height))
  20.         );
  21.  
  22.         glm::vec3 m_pVertices[8] = {
  23.             glm::vec3(0.500000, -0.500000, 0.500000),
  24.             glm::vec3(0.500000, -0.500000, 0.500000),
  25.             glm::vec3(-0.500000, 0.500000, 0.500000),
  26.             glm::vec3(0.500000, 0.500000, 0.500000),
  27.             glm::vec3(-0.500000, 0.500000, -0.500000),
  28.             glm::vec3(0.500000, 0.500000, -0.500000),
  29.             glm::vec3(-0.500000, -0.500000, -0.500000),
  30.             glm::vec3(0.500000, -0.500000, -0.500000)
  31.         };
  32.  
  33.  
  34.     public:
  35.         ///Constructor
  36.         GravityListener(std::string name, VESceneNode* pObject, VESceneNode* pPlane) :
  37.             VEEventListener(name), m_pObject(pObject), m_pPlane(pPlane) {
  38.  
  39.             glm::vec3 ax = glm::vec3(0, 0, 1);
  40.             float angle = (float)rand();
  41.  
  42.             glm::mat3 rotation_matrix = glm::rotate(angle, ax);
  43.  
  44.             glm::vec3 origin = m_pObject->getPosition();
  45.             m_pObject->setPosition(glm::vec3());
  46.             m_pObject->multiplyTransform(rotation_matrix);
  47.             m_pObject->setPosition(origin);
  48.  
  49.             for (glm::vec3& vertex : m_pVertices) {
  50.  
  51.                 vertex = vertex * rotation_matrix;
  52.  
  53.             }
  54.         };
  55.  
  56.         void onFrameStarted(veEvent event) {
  57.  
  58.             glm::vec3 a = f / m;
  59.  
  60.             v = v + event.dt * a;
  61.  
  62.             m_pObject->setPosition(glm::vec3(
  63.                 m_pObject->getPosition().x + event.dt * v.x,
  64.                 m_pObject->getPosition().y + event.dt * v.y,
  65.                 m_pObject->getPosition().z + event.dt * v.z)
  66.             );
  67.  
  68.             glm::vec3 t = glm::cross(f, l);
  69.  
  70.             glm::vec3 angular_acceleration = glm::vec3();
  71.  
  72.             if (t.x != 0 || t.y != 0 || t.z != 0) {
  73.                 angular_acceleration = glm::inverse(i) * t;
  74.             }
  75.  
  76.             w = w + event.dt * angular_acceleration;
  77.  
  78.             if (glm::length(w) != 0) {
  79.  
  80.                 glm::mat3 rotation_matrix = glm::rotate(glm::length(w), glm::normalize(w));
  81.  
  82.                 glm::vec3 origin = m_pObject->getPosition();
  83.                 m_pObject->setPosition(glm::vec3());
  84.                 m_pObject->multiplyTransform(rotation_matrix);
  85.                 m_pObject->setPosition(origin);
  86.  
  87.                 for (glm::vec3& vertex : m_pVertices) {
  88.  
  89.                     vertex = vertex * rotation_matrix;
  90.  
  91.                 }
  92.             }
  93.  
  94.             //collision detection and response
  95.             for (glm::vec3& vertex : m_pVertices) {
  96.  
  97.                 if (m_pObject->getPosition().y + vertex.y < 0) {
  98.  
  99.                     m_pObject->setPosition(glm::vec3(
  100.                         m_pObject->getPosition().x,
  101.                         -vertex.y,
  102.                         m_pObject->getPosition().z
  103.                     ));
  104.  
  105.                     glm::vec3 n = glm::vec3(0, 1, 0);
  106.                     float rest_coeff = 0.5;
  107.  
  108.                     //velocity at collision
  109.                     glm::vec3 vc = v + glm::cross(w, vertex);
  110.  
  111.                     //this works for velocity
  112.                     glm::vec3 j = -(1 + rest_coeff) * vc  * n /  (1 / m);
  113.  
  114.                     //this should work for both theoretically
  115.                     //glm::vec3 j = (-(1 + rest_coeff) * va * n) / (1 / m + n * glm::cross(glm::inverse(i) * glm::cross(vertex, n), vertex));
  116.  
  117.                     v = v + (j * n) / m;
  118.  
  119.                     //w = w + glm::inverse(i) * glm::cross(vertex, j * n);
  120.                 }
  121.             }
  122.         }
  123.  
  124.         virtual bool onKeyboard(veEvent event) {
  125.  
  126.             if (event.idata3 == GLFW_RELEASE) {
  127.                 return false;
  128.             }
  129.  
  130.             if (event.idata1 == GLFW_KEY_SPACE) {
  131.                 // 'activates' gravity
  132.                 f = glm::vec3(0, -9.81 * m, 0);
  133.  
  134.                 return false;
  135.             }
  136.             return false;
  137.         }
  138.  
  139.     };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement