rigidbody.h
上传用户:qccn516
上传日期:2013-05-02
资源大小:3382k
文件大小:2k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /* RigidBody dynamics
  2.  *
  3.  * Copyright (C) 2003-2004, Alexander Zaprjagaev <frustum@frustum.org>
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  */
  19. #ifndef __RIGID_BODY_H__
  20. #define __RIGID_BODY_H__
  21. #include "mathlib.h"
  22. class Object;
  23. class Collide;
  24. class Joint;
  25. /*
  26.  */
  27. class RigidBody {
  28. public:
  29. enum {
  30. COLLIDE_MESH = 1 << 0,
  31. COLLIDE_SPHERE = 1 << 1,
  32. BODY_BOX = 1 << 2,
  33. BODY_SPHERE = 1 << 3,
  34. BODY_CYLINDER = 1 << 4,
  35. NUM_JOINTS = 6,
  36. };
  37. RigidBody(Object *object,float mass,float restitution,float friction,int flag);
  38. ~RigidBody();
  39. void set(const vec3 &p);
  40. void set(const mat4 &m);
  41. void simulate();
  42. void addImpulse(const vec3 &point,const vec3 &impulse); // add impulse to this rb
  43. protected:
  44. friend class Physic;
  45. friend class Collide;
  46. friend class Joint;
  47. friend class JointBall;
  48. friend class JointHinge;
  49. friend class JointUniversal;
  50. friend int rigidbody_cmp(const void *a,const void *b);
  51. void calcForce(float ifps);
  52. void findContacts(float ifps);
  53. void integrateVelocity(float ifps);
  54. void integratePos(float ifps);
  55. int contactsResponse(float ifps,int zero_restitution = 0);
  56. Object *object;
  57. int collide_type;
  58. Collide *collide;
  59. float mass; // physical values
  60. float restitution;
  61. float friction;
  62. vec3 pos;
  63. mat3 orienation;
  64. mat4 transform;
  65. mat4 itransform;
  66. vec3 velocity;
  67. vec3 angularVelocity;
  68. vec3 angularMomentum;
  69. vec3 force;
  70. vec3 torque;
  71. mat3 iBodyInertiaTensor;
  72. mat3 iWorldInertiaTensor;
  73. int frozen;
  74. float frozen_time;
  75. int frozen_num_objects;
  76. int num_joints;
  77. Joint *joints[NUM_JOINTS];
  78. RigidBody *joined_rigidbodies[NUM_JOINTS];
  79. int simulated;
  80. int immovable;
  81. };
  82. #endif /* __RIGID_BODY_H__ */