123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- (function() {
- var FishTankRenderer = function() {};
- FishTankRenderer.prototype.init = function(container) {
- if (!FishTankRenderer.isWebGLEnabled()) {
- throw new Error('WebGL is not enabled in your browser.');
- }
- var mesh, geometry;
- this.spheres = [];
- this.camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 100000);
- this.camera.position.z = 3200;
- this.scene = new THREE.Scene();
- var geometry = new THREE.SphereGeometry(100, 32, 16);
- var path = 'assets/fish_tank/';
- var format = '.png';
- var urls = [
- path + 'px' + format, path + 'nx' + format,
- path + 'py' + format, path + 'ny' + format,
- path + 'pz' + format, path + 'nz' + format
- ];
- var textureCube = THREE.ImageUtils.loadTextureCube(urls);
- var material = new THREE.MeshBasicMaterial({
- color: 0xffffff,
- envMap: textureCube
- });
- for (var i = 0; i < 500; i++) {
- var mesh = new THREE.Mesh(geometry, material);
- mesh.position.x = Math.random() * 100000 - 50000;
- mesh.position.y = Math.random() * 100000 - 50000;
- mesh.position.z = Math.random() * 100000 - 50000;
- mesh.scale.x = mesh.scale.y = mesh.scale.z = Math.random() * 3 + 1;
- this.scene.add(mesh);
- this.spheres.push(mesh);
- }
- // Skybox
- var shader = THREE.ShaderLib["cube"];
- shader.uniforms["tCube"].value = textureCube;
- var material = new THREE.ShaderMaterial({
- fragmentShader: shader.fragmentShader,
- vertexShader: shader.vertexShader,
- uniforms: shader.uniforms,
- side: THREE.BackSide
- }),
- mesh = new THREE.Mesh(new THREE.BoxGeometry(100000, 100000, 100000), material);
- this.scene.add(mesh);
- var _params = {
- minFilter: THREE.LinearFilter,
- magFilter: THREE.NearestFilter,
- format: THREE.RGBAFormat
- };
- var width = window.innerWidth || 2;
- var height = window.innerHeight || 2;
- this.renderer = new THREE.WebGLRenderer(width, height, _params);
- container.appendChild(this.renderer.domElement);
- this.renderer.setSize(width, height);
- };
- FishTankRenderer.prototype.render = function(controlX, controlY) {
- var timer = 0.0001 * Date.now();
- this.camera.position.x += (-controlX - this.camera.position.x) * 0.05;
- this.camera.position.y += (-controlY - this.camera.position.y) * 0.05;
- this.camera.lookAt(this.scene.position);
- for (var i = 0, il = this.spheres.length; i < il; i++) {
- var sphere = this.spheres[i];
- sphere.position.x += 50 * Math.cos(timer + i);
- sphere.position.y += 50 * Math.sin(timer + i * 1.1);
- }
- this.renderer.render(this.scene, this.camera);
- };
- FishTankRenderer.isWebGLEnabled = function() {
- try {
- var canvas = document.createElement('canvas');
- return !!window.WebGLRenderingContext &&
- (canvas.getContext('webgl') || canvas.getContext('experimental-webgl'));
- } catch (e) {
- return false;
- }
- };
- window.FishTankRenderer = FishTankRenderer;
- })();
|