Advertisement
Guest User

Untitled

a guest
May 20th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.82 KB | None | 0 0
  1. function World(){
  2. var objects = [];
  3. var epsilon = 0.5;
  4. const gravity = 0;
  5. var objectIndex = 0;
  6. var createObject = function(type = 'sphere',
  7. pos = new THREE.Vector3(),
  8. force = new THREE.Vector3(),
  9. rot = new THREE.Vector3(0,0,0),
  10. angle = 0,
  11. static = false,
  12. mass = 1.0,
  13. normal = null,
  14. color) {
  15. console.log('create');
  16. var geometry, material;
  17. var vel = new THREE.Vector3();
  18. var acc = new THREE.Vector3(0.0, 0.0, 0.0);
  19. if(type === "plane"){
  20. color = color || "#103F97"
  21. geometry = new THREE.PlaneGeometry(40, 40);
  22. geometry.elementsNeedUpdate = true;
  23. material = new THREE.MeshBasicMaterial( { color: color} );
  24. } else if(type === "sphere"){
  25. color = color || "#433F81"
  26. geometry = new THREE.SphereGeometry(1.0, 10.0, 10.0);
  27. material = new THREE.MeshBasicMaterial( { color: color } );
  28. }
  29. else{
  30. type = 'box';
  31. geometry = new THREE.BoxGeometry(1.0, 1.0, 1.0);
  32. material = new THREE.MeshBasicMaterial( { color: "#433F81" } );
  33. }
  34. var newMesh = new THREE.Mesh(geometry, material);
  35. newMesh.setRotationFromAxisAngle(rot, angle);
  36. newMesh.position.set(pos.x, pos.y, pos.z);
  37. scene.add(newMesh);
  38. objects.push({
  39. mesh: newMesh,
  40. type: type,
  41. mass: mass,
  42. moment_of_inertia: 0.0,
  43. pos: pos,
  44. rot: rot,
  45. vel: vel,
  46. acc: acc,
  47. static: static,
  48. force: force,
  49. normal: normal
  50. });
  51.  
  52. compute_moment_of_inertia(objects[objectIndex])
  53. objectIndex++;
  54. }
  55.  
  56. var compute_moment_of_inertia = function(object){
  57. if (object.type === "sphere"){
  58. object.moment_of_inertia = 2.0 / 5.0 * object.mass * object.mesh.geometry.parameters.radius ** 2;
  59. } else if(object.type === "box"){
  60. object.moment_of_inertia = 1.0 / 12.0 * object.mass * (object.mesh.geometry.parameters.width ** 2 +
  61. object.mesh.geometry.parameters.height ** 2);
  62. }
  63. }
  64.  
  65. var compute_force_applied = function() {
  66. for(var key = 0 ;key < objects.length;key++){
  67. var obj = objects[key];
  68. obj.force.y += (obj.mass * gravity);
  69. if (obj.force.x == 0 && obj.force.y == 0 && obj.force.z == 0) continue;
  70. obj.acc = obj.force.divideScalar(obj.mass);
  71. }
  72. }
  73.  
  74. var detect_collision = function() {
  75. for(var key1 = 0;key1 < objects.length - 1;key1++){
  76. var obj1 = objects[key1];
  77. for(var key2 = key1 + 1;key2 < objects.length;key2++){
  78. var obj2 = objects[key2];
  79. if(obj1.type == "sphere" && obj2.type == "sphere"){
  80. var centers_distance = obj1.pos.distanceTo(obj2.pos);
  81. if(centers_distance <= obj1.mesh.geometry.parameters.radius + obj2.mesh.geometry.parameters.radius){
  82. solve_collision(key1, key2);
  83. }
  84. }
  85. if((obj1.type == "plane" && obj2.type == "sphere")||
  86. (obj1.type == "sphere" && obj2.type == "plane")){
  87. var key_plane, key_sphere;
  88. if(obj1.type == 'plane'){
  89. var obj_plane = obj1;
  90. var obj_sphere = obj2;
  91. key_plane = key1;
  92. key_sphere = key2;
  93. }else{
  94. var obj_plane = obj2;
  95. var obj_sphere = obj1;
  96. key_plane = key2;
  97. key_sphere = key1;
  98. }
  99. var bbs = new THREE.Box3();
  100. var bbp = new THREE.Box3();
  101. bbs.setFromObject(obj_sphere.mesh);
  102. bbp.setFromObject(obj_plane.mesh);
  103. if(bbs.intersectsBox(bbp)){
  104. contact_point = new THREE.Vector3(obj_sphere.pos.x - obj_plane.normal.x * obj_sphere.mesh.geometry.parameters.radius
  105. , obj_sphere.pos.y - obj_plane.normal.y * obj_sphere.mesh.geometry.parameters.radius
  106. , obj_sphere.pos.z - obj_plane.normal.z * obj_sphere.mesh.geometry.parameters.radius);
  107. solve_collision_plane(key_sphere, key_plane,contact_point,obj_plane.normal);
  108. }
  109. }
  110.  
  111. }
  112.  
  113. }
  114. }
  115.  
  116. var solve_collision_plane = function(key_sphere, key_plane, contact_point, normal){
  117. var obj_sphere = objects[key_sphere];
  118. var obj_plane = objects[key_plane];
  119. var newSphereVel = compute_impulse(key_sphere, key_plane, contact_point, normal);
  120. obj_sphere.vel.sub(newSphereVel);
  121. }
  122.  
  123. var solve_collision = function(key1, key2){
  124. obj1 = objects[key1];
  125. obj2 = objects[key2];
  126. var newVel1 = compute_impulse(key1,key2);
  127. var newVel2 = compute_impulse(key2,key1);
  128. obj1.vel.add(newVel1);
  129. obj2.vel.add(newVel2);
  130.  
  131. }
  132.  
  133. var compute_impulse = function(key1, key2, contact_point = null){
  134. obj1 = objects[key1];
  135. obj2 = objects[key2];
  136. var vel1 = new THREE.Vector3(obj1.vel.x, obj1.vel.y, obj1.vel.z);
  137. var vel2 = new THREE.Vector3(obj2.vel.x, obj2.vel.y, obj2.vel.z);
  138. var pos1 = new THREE.Vector3(obj1.pos.x, obj1.pos.y, obj1.pos.z);
  139. if(obj2.type === "plane"){
  140. var pos2 = contact_point;
  141. }
  142. else var pos2 = new THREE.Vector3(obj2.pos.x, obj2.pos.y, obj2.pos.z);
  143. var velr = new THREE.Vector3();
  144. var n = new THREE.Vector3();
  145. velr.addVectors(vel1,vel2);
  146.  
  147. n.subVectors((pos1), (pos2));
  148. n = n.divideScalar(pos1.distanceTo(pos2));
  149.  
  150. var pre_distance = pos1.distanceTo(pos2);
  151. var tmp1 = new THREE.Vector3(pos1.x, pos1.y, pos1.z);
  152. var tmp2 = new THREE.Vector3(pos2.x, pos2.y, pos2.z);
  153. var velRel1 = new THREE.Vector3(obj1.vel.x, obj1.vel.y, obj1.vel.z);
  154. var velRel2 = new THREE.Vector3(obj2.vel.x, obj2.vel.y, obj2.vel.z);
  155. velRel1.dot(n);
  156. velRel2.dot(n);
  157. var post_distance = (tmp1.add(velRel1).distanceTo(tmp2.add(velRel2)));
  158. if(post_distance > pre_distance){
  159. return new THREE.Vector3(0,0,0);
  160. }
  161.  
  162. var velRelPre = new THREE.Vector3();
  163. velRelPre.subVectors(velRel1,velRel2);
  164. var epsilon_tmp;
  165. if(contact_point != null){
  166. if(velRelPre < 0.5) epsilon_tmp = 0;
  167. else epsilon_tmp = 0.6;
  168. }
  169. else epsilon_tmp = epsilon;
  170. var j = (-(1 + epsilon_tmp) * velRelPre.length()) / (1/obj1.mass + 1/obj2.mass);
  171. var newVel1 = new THREE.Vector3(n.x, n.y, n.z);
  172. newVel1.multiplyScalar(j);
  173. newVel1.divideScalar(obj1.mass);
  174. return newVel1;
  175. }
  176.  
  177.  
  178. var updatePosition = function(){
  179. detect_collision();
  180. compute_force_applied();
  181. for(var key in objects){
  182. var currObj = objects[key];
  183. currObj.pos.add(currObj.vel);
  184. currObj.vel.add(currObj.acc);
  185. currObj.mesh.position.set(currObj.pos.x, currObj.pos.y, currObj.pos.z);
  186. }
  187. }
  188.  
  189. return{
  190. objects: objects,
  191. create: createObject,
  192. update: updatePosition
  193. }
  194.  
  195.  
  196. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement