babylon.physicsEngine.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. module BABYLON {
  2. declare var CANNON;
  3. export interface IPhysicsEnginePlugin {
  4. initialize(iterations?: number);
  5. setGravity(gravity: Vector3): void;
  6. runOneStep(delta: number): void;
  7. registerMesh(mesh: AbstractMesh, impostor: number, options: PhysicsBodyCreationOptions): any;
  8. registerMeshesAsCompound(parts: PhysicsCompoundBodyPart[], options: PhysicsBodyCreationOptions): any;
  9. unregisterMesh(mesh: AbstractMesh);
  10. applyImpulse(mesh: AbstractMesh, force: Vector3, contactPoint: Vector3): void;
  11. createLink(mesh1: AbstractMesh, mesh2: AbstractMesh, pivot1: Vector3, pivot2: Vector3, options?: any): boolean;
  12. dispose(): void;
  13. isSupported(): boolean;
  14. updateBodyPosition(mesh: AbstractMesh): void;
  15. }
  16. export interface PhysicsBodyCreationOptions {
  17. mass: number;
  18. friction: number;
  19. restitution: number;
  20. }
  21. export interface PhysicsCompoundBodyPart {
  22. mesh: Mesh;
  23. impostor: number;
  24. }
  25. export class PhysicsEngine {
  26. public gravity: Vector3;
  27. private _currentPlugin: IPhysicsEnginePlugin;
  28. constructor(plugin?: IPhysicsEnginePlugin) {
  29. this._currentPlugin = plugin || new OimoJSPlugin();
  30. }
  31. public _initialize(gravity?: Vector3) {
  32. this._currentPlugin.initialize();
  33. this._setGravity(gravity);
  34. }
  35. public _runOneStep(delta: number): void {
  36. if (delta > 0.1) {
  37. delta = 0.1;
  38. } else if (delta <= 0) {
  39. delta = 1.0 / 60.0;
  40. }
  41. this._currentPlugin.runOneStep(delta);
  42. }
  43. public _setGravity(gravity: Vector3): void {
  44. this.gravity = gravity || new BABYLON.Vector3(0, -9.82, 0);
  45. this._currentPlugin.setGravity(this.gravity);
  46. }
  47. public _registerMesh(mesh: AbstractMesh, impostor: number, options: PhysicsBodyCreationOptions): any {
  48. return this._currentPlugin.registerMesh(mesh, impostor, options);
  49. }
  50. public _registerMeshesAsCompound(parts: PhysicsCompoundBodyPart[], options: PhysicsBodyCreationOptions): any {
  51. return this._currentPlugin.registerMeshesAsCompound(parts, options);
  52. }
  53. public _unregisterMesh(mesh: AbstractMesh): void {
  54. this._currentPlugin.unregisterMesh(mesh);
  55. }
  56. public _applyImpulse(mesh: AbstractMesh, force: Vector3, contactPoint: Vector3): void {
  57. this._currentPlugin.applyImpulse(mesh, force, contactPoint);
  58. }
  59. public _createLink(mesh1: AbstractMesh, mesh2: AbstractMesh, pivot1: Vector3, pivot2: Vector3, options?: any): boolean {
  60. return this._currentPlugin.createLink(mesh1, mesh2, pivot1, pivot2, options);
  61. }
  62. public _updateBodyPosition(mesh: AbstractMesh): void {
  63. this._currentPlugin.updateBodyPosition(mesh);
  64. }
  65. public dispose(): void {
  66. this._currentPlugin.dispose();
  67. }
  68. public isSupported(): boolean {
  69. return this._currentPlugin.isSupported();
  70. }
  71. // Statics
  72. public static NoImpostor = 0;
  73. public static SphereImpostor = 1;
  74. public static BoxImpostor = 2;
  75. public static PlaneImpostor = 3;
  76. public static MeshImpostor = 4;
  77. public static CapsuleImpostor = 5;
  78. public static ConeImpostor = 6;
  79. public static CylinderImpostor = 7;
  80. public static ConvexHullImpostor = 8;
  81. public static Epsilon = 0.001;
  82. }
  83. }