babylon.physicsEngine.ts 3.3 KB

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