FishTankRenderer.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. (function() {
  2. var FishTankRenderer = function() {};
  3. FishTankRenderer.prototype.init = function(container) {
  4. if (!FishTankRenderer.isWebGLEnabled()) {
  5. throw new Error('WebGL is not enabled in your browser.');
  6. }
  7. var mesh, geometry;
  8. this.spheres = [];
  9. this.camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 100000);
  10. this.camera.position.z = 3200;
  11. this.scene = new THREE.Scene();
  12. var geometry = new THREE.SphereGeometry(100, 32, 16);
  13. var path = 'assets/fish_tank/';
  14. var format = '.png';
  15. var urls = [
  16. path + 'px' + format, path + 'nx' + format,
  17. path + 'py' + format, path + 'ny' + format,
  18. path + 'pz' + format, path + 'nz' + format
  19. ];
  20. var textureCube = THREE.ImageUtils.loadTextureCube(urls);
  21. var material = new THREE.MeshBasicMaterial({
  22. color: 0xffffff,
  23. envMap: textureCube
  24. });
  25. for (var i = 0; i < 500; i++) {
  26. var mesh = new THREE.Mesh(geometry, material);
  27. mesh.position.x = Math.random() * 100000 - 50000;
  28. mesh.position.y = Math.random() * 100000 - 50000;
  29. mesh.position.z = Math.random() * 100000 - 50000;
  30. mesh.scale.x = mesh.scale.y = mesh.scale.z = Math.random() * 3 + 1;
  31. this.scene.add(mesh);
  32. this.spheres.push(mesh);
  33. }
  34. // Skybox
  35. var shader = THREE.ShaderLib["cube"];
  36. shader.uniforms["tCube"].value = textureCube;
  37. var material = new THREE.ShaderMaterial({
  38. fragmentShader: shader.fragmentShader,
  39. vertexShader: shader.vertexShader,
  40. uniforms: shader.uniforms,
  41. side: THREE.BackSide
  42. }),
  43. mesh = new THREE.Mesh(new THREE.BoxGeometry(100000, 100000, 100000), material);
  44. this.scene.add(mesh);
  45. var _params = {
  46. minFilter: THREE.LinearFilter,
  47. magFilter: THREE.NearestFilter,
  48. format: THREE.RGBAFormat
  49. };
  50. var width = window.innerWidth || 2;
  51. var height = window.innerHeight || 2;
  52. this.renderer = new THREE.WebGLRenderer(width, height, _params);
  53. container.appendChild(this.renderer.domElement);
  54. this.renderer.setSize(width, height);
  55. };
  56. FishTankRenderer.prototype.render = function(controlX, controlY) {
  57. var timer = 0.0001 * Date.now();
  58. this.camera.position.x += (-controlX - this.camera.position.x) * 0.05;
  59. this.camera.position.y += (-controlY - this.camera.position.y) * 0.05;
  60. this.camera.lookAt(this.scene.position);
  61. for (var i = 0, il = this.spheres.length; i < il; i++) {
  62. var sphere = this.spheres[i];
  63. sphere.position.x += 50 * Math.cos(timer + i);
  64. sphere.position.y += 50 * Math.sin(timer + i * 1.1);
  65. }
  66. this.renderer.render(this.scene, this.camera);
  67. };
  68. FishTankRenderer.isWebGLEnabled = function() {
  69. try {
  70. var canvas = document.createElement('canvas');
  71. return !!window.WebGLRenderingContext &&
  72. (canvas.getContext('webgl') || canvas.getContext('experimental-webgl'));
  73. } catch (e) {
  74. return false;
  75. }
  76. };
  77. window.FishTankRenderer = FishTankRenderer;
  78. })();