babylon.boundingBox.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. var BABYLON;
  2. (function (BABYLON) {
  3. var BoundingBox = (function () {
  4. function BoundingBox(minimum, maximum) {
  5. this.minimum = minimum;
  6. this.maximum = maximum;
  7. this.vectors = new Array();
  8. this.vectorsWorld = new Array();
  9. // Bounding vectors
  10. this.vectors.push(this.minimum.clone());
  11. this.vectors.push(this.maximum.clone());
  12. this.vectors.push(this.minimum.clone());
  13. this.vectors[2].x = this.maximum.x;
  14. this.vectors.push(this.minimum.clone());
  15. this.vectors[3].y = this.maximum.y;
  16. this.vectors.push(this.minimum.clone());
  17. this.vectors[4].z = this.maximum.z;
  18. this.vectors.push(this.maximum.clone());
  19. this.vectors[5].z = this.minimum.z;
  20. this.vectors.push(this.maximum.clone());
  21. this.vectors[6].x = this.minimum.x;
  22. this.vectors.push(this.maximum.clone());
  23. this.vectors[7].y = this.minimum.y;
  24. // OBB
  25. this.center = this.maximum.add(this.minimum).scale(0.5);
  26. this.extendSize = this.maximum.subtract(this.minimum).scale(0.5);
  27. this.directions = [BABYLON.Vector3.Zero(), BABYLON.Vector3.Zero(), BABYLON.Vector3.Zero()];
  28. // World
  29. for (var index = 0; index < this.vectors.length; index++) {
  30. this.vectorsWorld[index] = BABYLON.Vector3.Zero();
  31. }
  32. this.minimumWorld = BABYLON.Vector3.Zero();
  33. this.maximumWorld = BABYLON.Vector3.Zero();
  34. this._update(BABYLON.Matrix.Identity());
  35. }
  36. // Methods
  37. BoundingBox.prototype.getWorldMatrix = function () {
  38. return this._worldMatrix;
  39. };
  40. BoundingBox.prototype.setWorldMatrix = function (matrix) {
  41. this._worldMatrix.copyFrom(matrix);
  42. return this;
  43. };
  44. BoundingBox.prototype._update = function (world) {
  45. BABYLON.Vector3.FromFloatsToRef(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, this.minimumWorld);
  46. BABYLON.Vector3.FromFloatsToRef(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE, this.maximumWorld);
  47. for (var index = 0; index < this.vectors.length; index++) {
  48. var v = this.vectorsWorld[index];
  49. BABYLON.Vector3.TransformCoordinatesToRef(this.vectors[index], world, v);
  50. if (v.x < this.minimumWorld.x)
  51. this.minimumWorld.x = v.x;
  52. if (v.y < this.minimumWorld.y)
  53. this.minimumWorld.y = v.y;
  54. if (v.z < this.minimumWorld.z)
  55. this.minimumWorld.z = v.z;
  56. if (v.x > this.maximumWorld.x)
  57. this.maximumWorld.x = v.x;
  58. if (v.y > this.maximumWorld.y)
  59. this.maximumWorld.y = v.y;
  60. if (v.z > this.maximumWorld.z)
  61. this.maximumWorld.z = v.z;
  62. }
  63. // OBB
  64. this.maximumWorld.addToRef(this.minimumWorld, this.center);
  65. this.center.scaleInPlace(0.5);
  66. BABYLON.Vector3.FromFloatArrayToRef(world.m, 0, this.directions[0]);
  67. BABYLON.Vector3.FromFloatArrayToRef(world.m, 4, this.directions[1]);
  68. BABYLON.Vector3.FromFloatArrayToRef(world.m, 8, this.directions[2]);
  69. this._worldMatrix = world;
  70. };
  71. BoundingBox.prototype.isInFrustum = function (frustumPlanes) {
  72. return BoundingBox.IsInFrustum(this.vectorsWorld, frustumPlanes);
  73. };
  74. BoundingBox.prototype.isCompletelyInFrustum = function (frustumPlanes) {
  75. return BoundingBox.IsCompletelyInFrustum(this.vectorsWorld, frustumPlanes);
  76. };
  77. BoundingBox.prototype.intersectsPoint = function (point) {
  78. var delta = -BABYLON.Epsilon;
  79. if (this.maximumWorld.x - point.x < delta || delta > point.x - this.minimumWorld.x)
  80. return false;
  81. if (this.maximumWorld.y - point.y < delta || delta > point.y - this.minimumWorld.y)
  82. return false;
  83. if (this.maximumWorld.z - point.z < delta || delta > point.z - this.minimumWorld.z)
  84. return false;
  85. return true;
  86. };
  87. BoundingBox.prototype.intersectsSphere = function (sphere) {
  88. return BoundingBox.IntersectsSphere(this.minimumWorld, this.maximumWorld, sphere.centerWorld, sphere.radiusWorld);
  89. };
  90. BoundingBox.prototype.intersectsMinMax = function (min, max) {
  91. if (this.maximumWorld.x < min.x || this.minimumWorld.x > max.x)
  92. return false;
  93. if (this.maximumWorld.y < min.y || this.minimumWorld.y > max.y)
  94. return false;
  95. if (this.maximumWorld.z < min.z || this.minimumWorld.z > max.z)
  96. return false;
  97. return true;
  98. };
  99. // Statics
  100. BoundingBox.Intersects = function (box0, box1) {
  101. if (box0.maximumWorld.x < box1.minimumWorld.x || box0.minimumWorld.x > box1.maximumWorld.x)
  102. return false;
  103. if (box0.maximumWorld.y < box1.minimumWorld.y || box0.minimumWorld.y > box1.maximumWorld.y)
  104. return false;
  105. if (box0.maximumWorld.z < box1.minimumWorld.z || box0.minimumWorld.z > box1.maximumWorld.z)
  106. return false;
  107. return true;
  108. };
  109. BoundingBox.IntersectsSphere = function (minPoint, maxPoint, sphereCenter, sphereRadius) {
  110. var vector = BABYLON.Vector3.Clamp(sphereCenter, minPoint, maxPoint);
  111. var num = BABYLON.Vector3.DistanceSquared(sphereCenter, vector);
  112. return (num <= (sphereRadius * sphereRadius));
  113. };
  114. BoundingBox.IsCompletelyInFrustum = function (boundingVectors, frustumPlanes) {
  115. for (var p = 0; p < 6; p++) {
  116. for (var i = 0; i < 8; i++) {
  117. if (frustumPlanes[p].dotCoordinate(boundingVectors[i]) < 0) {
  118. return false;
  119. }
  120. }
  121. }
  122. return true;
  123. };
  124. BoundingBox.IsInFrustum = function (boundingVectors, frustumPlanes) {
  125. for (var p = 0; p < 6; p++) {
  126. var inCount = 8;
  127. for (var i = 0; i < 8; i++) {
  128. if (frustumPlanes[p].dotCoordinate(boundingVectors[i]) < 0) {
  129. --inCount;
  130. }
  131. else {
  132. break;
  133. }
  134. }
  135. if (inCount === 0)
  136. return false;
  137. }
  138. return true;
  139. };
  140. return BoundingBox;
  141. })();
  142. BABYLON.BoundingBox = BoundingBox;
  143. })(BABYLON || (BABYLON = {}));