Advertisement
Guest User

Untitled

a guest
Oct 31st, 2014
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var scene = new THREE.Scene();
  2. var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
  3. var renderer = new THREE.WebGLRenderer();
  4.  
  5. renderer.setClearColor(0xeeeeee, 1.0);
  6. renderer.setSize(window.innerWidth, window.innerHeight);
  7. var webglContainer = document.getElementById('webgl-container');
  8. webglContainer.appendChild(renderer.domElement);
  9.  
  10. var containerWidth = webglContainer.clientWidth;
  11. var containerHeight = webglContainer.clientHeight;
  12.  
  13. // camera controls
  14. var camControls = new THREE.OrbitControls(camera, renderer.domElement);
  15. camControls.damping = 0.2;
  16. camControls.addEventListener('change', render);
  17.  
  18.  
  19. // window resize handler
  20. window.addEventListener('resize', onWindowResize, false);
  21.  
  22. function onWindowResize() {
  23.     camera.aspect = window.innerWidth / window.innerHeight;
  24.     camera.updateProjectionMatrix();
  25.     renderer.setSize(window.innerWidth, window.innerHeight);
  26.     render();
  27. }
  28.  
  29. var axes = new THREE.AxisHelper(20);
  30. scene.add(axes);
  31.  
  32. var grid = new THREE.GridHelper(40, 1);
  33.  
  34. // create the ground plane
  35. var planeGeometry = new THREE.PlaneGeometry(80, 80, 10, 10);
  36. var planeMaterial = new THREE.MeshLambertMaterial({
  37.     color: 0xffffff
  38. });
  39. var plane = new THREE.Mesh(planeGeometry, planeMaterial);
  40. plane.rotation.x = -0.5 * Math.PI;
  41. plane.position.x = 0;
  42. plane.position.y = -0.05;
  43. plane.position.z = 0;
  44. scene.add(plane);
  45.  
  46. // ---- 3D CONTENT CREATION -----------------------------------------------------
  47.  
  48. var mech = new THREE.Object3D();
  49. var mechMaterialColor = 0xa65e00;
  50.  
  51. var base_x = 0;
  52. var base_y = 10;
  53. var base_z = 0;
  54. var partPositions = [];
  55.  
  56. partPositions['torso'] = {x: base_x, y: base_y, z: base_z};
  57. partPositions['head'] = {x: base_x, y: base_y + 2.3, z: base_z};
  58. partPositions['base'] = {x: base_x, y: base_y - 2.75, z: base_z};
  59. partPositions['arm_left'] = {x: base_x + 2.7, y: base_y - 0.5, z: base_z};
  60. partPositions['arm_right'] = {x: base_x - 2.7, y: base_y - 0.5, z: base_z};
  61. partPositions['leg_left'] = {x: base_x + 1.7, y: base_y - 6.5, z: base_z};
  62. partPositions['leg_right'] = {x: base_x - 1.7, y: base_y - 6.5, z: base_z};
  63.  
  64.  
  65. function loadMech()
  66. {
  67.  
  68.     loadMechPart('torso', false);
  69.     loadMechPart('head', false);
  70.     loadMechPart('base', false);
  71.     loadMechPart('arm_right', true);
  72.     loadMechPart('leg_right', true);
  73.     loadMechPart('arm_left', false);
  74.     loadMechPart('leg_left', false);
  75.  
  76.  
  77. }
  78.  
  79.  
  80.  
  81.  
  82.  
  83. function loadMechPart(part, mirrored)
  84. {
  85.     var mat;
  86.  
  87.     var loader = new THREE.OBJLoader();
  88.     loader.load('assets/' + part + '.obj', function (geometry, materials) {
  89.  
  90.  
  91.         var childTraverser;
  92.         var updaterFunction;
  93.         if (mirrored == true) // blender does silly shit with face order when mirroring.
  94.         {
  95.             childTraverser = function (child) {
  96.                 if (child instanceof THREE.Mesh) {
  97.                     var mat = new THREE.MeshPhongMaterial({color: mechMaterialColor});
  98.                     child.material = mat;
  99.                     child.material.side = THREE.BackSide;//dafuq
  100.                     child.elementsNeedUpdate = true;
  101.                     console.log("inverted called");
  102.                 }
  103.             }
  104.            
  105.             updaterFunction = function () {
  106.                 mechMaterialColor = document.getElementById('mesh-color').value;
  107.                 newMat = new THREE.MeshPhongMaterial({color: mechMaterialColor, shading: THREE.FlatShading});
  108.                 newMat.side = THREE.BackSide;
  109.                 geometry.traverse(function (child) {
  110.                     if (child instanceof THREE.Mesh) {
  111.                         // apply custom material
  112.                         child.material = newMat;
  113.                     }
  114.                 });
  115.             }
  116.            
  117.         } else {
  118.             childTraverser = function (child) {
  119.                 if (child instanceof THREE.Mesh) {
  120.                     var mat = new THREE.MeshPhongMaterial({color: mechMaterialColor});
  121.                     child.material = mat;
  122.                     child.material.side = THREE.FrontSide;
  123.                 }
  124.             }
  125.            
  126.             updaterFunction = function () {
  127.                 mechMaterialColor = document.getElementById('mesh-color').value;
  128.                 newMat = new THREE.MeshPhongMaterial({color: mechMaterialColor, shading: THREE.FlatShading});
  129.                 newMat.shininess = 100;
  130.                 geometry.traverse(function (child) {
  131.                     if (child instanceof THREE.Mesh) {
  132.                         // apply custom material
  133.                         child.material = newMat;
  134.                     }
  135.                 });
  136.             }
  137.         }
  138.  
  139.         geometry.traverse(childTraverser);
  140.         geometry.updateFromColorPicker = updaterFunction;
  141.  
  142.         geometry.name = part;
  143.         geometry.position.x = partPositions[part].x;
  144.         geometry.position.y = partPositions[part].y;
  145.         geometry.position.z = partPositions[part].z;
  146.  
  147.         geometry.scale.set(1, 1, 1);
  148.        
  149.         var partSelector = document.getElementById("partSelector");
  150.         var option = document.createElement("option");
  151.         option.text = geometry.name;
  152.         partSelector.add(option);
  153.        
  154.         mech.add(geometry);
  155.  
  156.  
  157.  
  158.     });
  159.  
  160. }
  161.  
  162. loadMech();
  163. scene.add(mech);
  164.  
  165. // ---- END OF 3D CONTENT CREATION ---------------------------------------------
  166.  
  167. // position and point the camera to the center of the scene
  168.  
  169. function initCamera()
  170. {
  171.     camera.position.x = 4.5;
  172.     camera.position.y = 8;
  173.     camera.position.z = 17;
  174.     camera.rotation.x = -0.1;
  175.     camera.rotation.y = 0.52;
  176.     camera.rotation.z = 0.05;
  177.  
  178. }
  179.  
  180. initCamera();
  181.  
  182.  
  183. projector = new THREE.Projector();
  184. mouseVector = new THREE.Vector3();
  185.  
  186. window.addEventListener('mousemove', onMouseMove, false);
  187.  
  188.  
  189. // add subtle ambient lighting
  190. var ambientLight = new THREE.AmbientLight(0x222222);
  191. scene.add(ambientLight);
  192.  
  193. // add spotlight
  194. var spotLight = new THREE.SpotLight(0xffffff);
  195. spotLight.position.set(-80, 70, 90);
  196. spotLight.position.set(-80, 70, 90);
  197. spotLight.castShadow = true;
  198. spotLight.intensity = 1.5;
  199. spotLight.exponent = 5;
  200. spotLight.rotation.set( 0, Math.PI, 0 );
  201. spotLight.target= mech;
  202. scene.add(spotLight);
  203.  
  204. // add GUI control elements
  205. var guiControls = new function () {
  206.     this.showAxes = true;
  207.     this.showGrid = false;
  208.     this.showPlane = true;
  209.     this.asWireframes = false;
  210.     this.animated = true;
  211.     this.withShadow = false;
  212.     this.withFog = false;
  213. }
  214.  
  215. var gui = new dat.GUI({
  216.     autoPlace: false
  217. });
  218. var guiContainer = document.getElementById('gui-container');
  219. guiContainer.appendChild(gui.domElement);
  220. gui.add(guiControls, 'showAxes').onChange(function (e) {
  221.     showAxes = e;
  222.     if (showAxes) {
  223.         scene.add(axes);
  224.     } else {
  225.         scene.remove(axes);
  226.     }
  227.     render();
  228. });
  229. gui.add(guiControls, 'showGrid').onChange(function (e) {
  230.     showGrid = e;
  231.     if (showGrid) {
  232.         scene.add(grid);
  233.     } else {
  234.         scene.remove(grid);
  235.     }
  236.     render();
  237. });
  238. gui.add(guiControls, 'showPlane').onChange(function (e) {
  239.     showPlane = e;
  240.     if (showPlane) {
  241.         scene.add(plane);
  242.     } else {
  243.         scene.remove(plane);
  244.     }
  245.     render();
  246. });
  247. gui.add(guiControls, 'asWireframes').onChange(function (e) {
  248.     asWireframes = e;
  249.     // TODO: for all material.wireframe = asWireframes;
  250.     mat.wireframe = asWireframes;
  251.     render();
  252. });
  253. gui.open();
  254.  
  255. // init and call render function
  256. function render() {
  257.     renderer.render(scene, camera);
  258.     /*
  259.      console.log("camera.position.x: ", camera.position.x);
  260.      console.log("camera.position.y: ", camera.position.y);
  261.      console.log("camera.position.z: ", camera.position.z);
  262.      console.log("camera.rotation.x: ", camera.rotation.x);
  263.      console.log("camera.rotation.y: ", camera.rotation.y);
  264.      console.log("camera.rotation.z: ", camera.rotation.z);
  265.      */
  266.  
  267. }
  268. initAnim(true);
  269. initShadow(false);
  270. initFog(false);
  271. render();
  272. setShadow(false);
  273. setFog(false);
  274. animate();
  275.  
  276. // animate the 3D objects
  277. function initAnim(value) {
  278.     if (value) {
  279.         gui.add(guiControls, 'animated').onChange(function (e) {
  280.             animated = e;
  281.             if (animated)
  282.                 animate();
  283.         });
  284.     }
  285. }
  286.  
  287.  
  288. var step = 0;
  289. var scalingStep = 0;
  290.  
  291. function animate() {
  292.     if (guiControls.animated) {
  293.         // DO ANIMATING 3D ELEMENTS
  294.  
  295.         // request re-rendering
  296.         requestAnimationFrame(animate);
  297.     }
  298.     render();
  299. }
  300.  
  301. // shadow cast on plane
  302. function initShadow(value) {
  303.     // SET receiveShadow AND castShadow FLAGS OF 3D ELEMENTS WITH SHADOW
  304.     plane.receiveShadow = value;
  305.     spotLight.castShadow = value;
  306.     renderer.shadowMapEnabled = value;
  307.     if (value) {
  308.         gui.add(guiControls, 'withShadow').onChange(function (e) {
  309.             withShadow = e;
  310.             setShadow(withShadow);
  311.         });
  312.     }
  313. }
  314.  
  315. function setShadow(value) {
  316.     if (value) {
  317.         renderer.shadowMapAutoUpdate = true;
  318.     } else {
  319.         renderer.shadowMapAutoUpdate = false;
  320.         renderer.clearTarget(spotLight.shadowMap);
  321.     }
  322.     render();
  323. }
  324.  
  325. // fog
  326. var fog;
  327.  
  328. function initFog(value) {
  329.     if (value) {
  330.         fog = new THREE.Fog(0xeeeeee, 0.0000001, 150);
  331.         scene.fog = fog;
  332.         gui.add(guiControls, 'withFog').onChange(function (e) {
  333.             withFog = e;
  334.             setFog(withFog);
  335.         });
  336.     }
  337. }
  338.  
  339. function setFog(value) {
  340.     if (!fog)
  341.         return;
  342.     if (value) {
  343.         fog.near = 0.000000001;
  344.         fog.far = 150;
  345.     } else {
  346.         fog.near = 8000;
  347.         fog.far = 8000;
  348.     }
  349.     render();
  350. }
  351.  
  352. function onMouseMove(e) {
  353.  
  354.     mouseVector.x = 2 * (e.clientX / containerWidth) - 1;
  355.     mouseVector.y = 1 - 2 * (e.clientY / containerHeight);
  356.  
  357.     var raycaster = projector.pickingRay(mouseVector.clone(), camera),
  358.             intersects = raycaster.intersectObjects(mech.children, true);
  359.  
  360.     mech.children.forEach(function (part) {
  361.  
  362.         part.children.forEach(function (child) {
  363.             child.material.color.setRGB(1, 1, 1);
  364.         });
  365.     });
  366.  
  367.     for (var i = 0; i < intersects.length; i++) {
  368.         var intersection = intersects[ i ],
  369.                 obj = intersection.object;
  370.         console.log(obj.name);
  371.         obj.material.color.setRGB(1.0, 0, 0);
  372.     }
  373.  
  374.  
  375. }
  376.  
  377. function updateColorChoice() {
  378.     var index = document.getElementById('partSelector').value;
  379.     console.log(mech.children);
  380.     mech.getObjectByName(index, false).updateFromColorPicker();
  381. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement