babylon.boundingBox.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. var BABYLON = BABYLON || {};
  2. (function () {
  3. BABYLON.BoundingBox = function (minimum, maximum) {
  4. this.minimum = minimum;
  5. this.maximum = maximum;
  6. // Bounding vectors
  7. this.vectors = [];
  8. this.vectors.push(this.minimum.clone());
  9. this.vectors.push(this.maximum.clone());
  10. this.vectors.push(this.minimum.clone());
  11. this.vectors[2].x = this.maximum.x;
  12. this.vectors.push(this.minimum.clone());
  13. this.vectors[3].y = this.maximum.y;
  14. this.vectors.push(this.minimum.clone());
  15. this.vectors[4].z = this.maximum.z;
  16. this.vectors.push(this.maximum.clone());
  17. this.vectors[5].z = this.minimum.z;
  18. this.vectors.push(this.maximum.clone());
  19. this.vectors[6].x = this.minimum.x;
  20. this.vectors.push(this.maximum.clone());
  21. this.vectors[7].y = this.minimum.y;
  22. // OBB
  23. this.center = this.maximum.add(this.minimum).scale(0.5);
  24. this.extends = this.maximum.subtract(this.minimum).scale(0.5);
  25. this.directions = [BABYLON.Vector3.Zero(), BABYLON.Vector3.Zero(), BABYLON.Vector3.Zero()];
  26. // World
  27. this.vectorsWorld = [];
  28. for (var index = 0; index < this.vectors.length; index++) {
  29. this.vectorsWorld[index] = BABYLON.Vector3.Zero();
  30. }
  31. this.minimumWorld = BABYLON.Vector3.Zero();
  32. this.maximumWorld = BABYLON.Vector3.Zero();
  33. };
  34. // Methods
  35. BABYLON.BoundingBox.prototype._update = function (world) {
  36. BABYLON.Vector3.FromFloatsToRef(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, this.minimumWorld);
  37. BABYLON.Vector3.FromFloatsToRef(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE, this.maximumWorld);
  38. for (var index = 0; index < this.vectors.length; index++) {
  39. var v = this.vectorsWorld[index];
  40. BABYLON.Vector3.TransformCoordinatesToRef(this.vectors[index], world, v);
  41. if (v.x < this.minimumWorld.x)
  42. this.minimumWorld.x = v.x;
  43. if (v.y < this.minimumWorld.y)
  44. this.minimumWorld.y = v.y;
  45. if (v.z < this.minimumWorld.z)
  46. this.minimumWorld.z = v.z;
  47. if (v.x > this.maximumWorld.x)
  48. this.maximumWorld.x = v.x;
  49. if (v.y > this.maximumWorld.y)
  50. this.maximumWorld.y = v.y;
  51. if (v.z > this.maximumWorld.z)
  52. this.maximumWorld.z = v.z;
  53. }
  54. // OBB
  55. this.maximumWorld.addToRef(this.minimumWorld, this.center);
  56. this.center.scaleInPlace(0.5);
  57. BABYLON.Vector3.FromArrayToRef(world.m, 0, this.directions[0]);
  58. BABYLON.Vector3.FromArrayToRef(world.m, 4, this.directions[1]);
  59. BABYLON.Vector3.FromArrayToRef(world.m, 8, this.directions[2]);
  60. };
  61. BABYLON.BoundingBox.prototype.isInFrustrum = function (frustumPlanes) {
  62. return BABYLON.BoundingBox.IsInFrustrum(this.vectorsWorld, frustumPlanes);
  63. };
  64. BABYLON.BoundingBox.prototype.intersectsPoint = function (point) {
  65. if (this.maximumWorld.x < point.x || this.minimumWorld.x > point.x)
  66. return false;
  67. if (this.maximumWorld.y < point.y || this.minimumWorld.y > point.y)
  68. return false;
  69. if (this.maximumWorld.z < point.z || this.minimumWorld.z > point.z)
  70. return false;
  71. return true;
  72. };
  73. BABYLON.BoundingBox.prototype.intersectsSphere = function (sphere) {
  74. var vector = BABYLON.Vector3.Clamp(sphere.centerWorld, this.minimumWorld, this.maximumWorld);
  75. var num = BABYLON.Vector3.DistanceSquared(sphere.centerWorld, vector);
  76. return (num <= (sphere.radiusWorld * sphere.radiusWorld));
  77. };
  78. BABYLON.BoundingBox.prototype.intersectsMinMax = function (min, max) {
  79. if (this.maximumWorld.x < min.x || this.minimumWorld.x > max.x)
  80. return false;
  81. if (this.maximumWorld.y < min.y || this.minimumWorld.y > max.y)
  82. return false;
  83. if (this.maximumWorld.z < min.z || this.minimumWorld.z > max.z)
  84. return false;
  85. return true;
  86. };
  87. // Statics
  88. BABYLON.BoundingBox.intersects = function (box0, box1) {
  89. if (box0.maximumWorld.x < box1.minimumWorld.x || box0.minimumWorld.x > box1.maximumWorld.x)
  90. return false;
  91. if (box0.maximumWorld.y < box1.minimumWorld.y || box0.minimumWorld.y > box1.maximumWorld.y)
  92. return false;
  93. if (box0.maximumWorld.z < box1.minimumWorld.z || box0.minimumWorld.z > box1.maximumWorld.z)
  94. return false;
  95. return true;
  96. };
  97. BABYLON.BoundingBox.IsInFrustrum = function (boundingVectors, frustumPlanes) {
  98. for (var p = 0; p < 6; p++) {
  99. var inCount = 8;
  100. for (var i = 0; i < 8; i++) {
  101. if (frustumPlanes[p].dotCoordinate(boundingVectors[i]) < 0) {
  102. --inCount;
  103. } else {
  104. break;
  105. }
  106. }
  107. if (inCount == 0)
  108. return false;
  109. }
  110. return true;
  111. };
  112. })();