babylon.boundingBox.js 4.7 KB

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