<div id="container"></div>
html, body{ margin: 0; padding: 0; width: 100%; height: 100%; background: #fff; overflow: hidden; }
var WIDTH = 1280;
var HEIGHT = 600;
var VIEW_ANGLE = 45;
var ASPECT = WIDTH / HEIGHT;
var NEAR = 0.1;
var FAR = 10000;
var scene;
var $container;
var renderer;
var camera;
var camera2;
var controls;
var mesh, geometry, pathSpline;
var t = 0;
var tt = 0.005;
var binormal = new THREE.Vector3();
var normal = new THREE.Vector3();
var earth;
var space;
$(document).ready( function(){
WIDTH = window.innerWidth;
HEIGHT = window.innerHeight;
init();
$( window ).resize( function(){
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );
});
});
function init(){
$container = $('#container');
renderer = new THREE.WebGLRenderer({antialias: true});
renderer.shadowMapEnabled = true;
camera = new THREE.PerspectiveCamera( VIEW_ANGLE, ASPECT, NEAR, FAR );
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.shadowMapType = THREE.PCFSoftShadowMap;
camera2 = new THREE.PerspectiveCamera( VIEW_ANGLE, ASPECT, NEAR, FAR );
camera2.aspect = window.innerWidth / window.innerHeight;
camera2.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.shadowMapType = THREE.PCFSoftShadowMap;
scene = new THREE.Scene();
scene.autoClear = false;
scene.add(camera);
scene.add(camera2);
camera.position.x = 0;
camera.position.y = 0;
camera.position.z = 0;
camera2.position.x = -150;
camera2.position.y = 0;
camera2.position.z = 1500;
renderer.setSize(WIDTH, HEIGHT);
renderer.shadowMapSoft = true;
renderer.shadowMapType = THREE.PCFShadowMap;
$container.append(renderer.domElement);
controls = new THREE.OrbitControls(camera2, renderer.domElement);
clock = new THREE.Clock();
//Space
space = new THREE.Mesh( new THREE.SphereGeometry( 7500, 30, 30 ), new THREE.MeshBasicMaterial( {color: 0x111122, side: THREE.DoubleSide, shading: THREE.SmoothShading } ) );
space.castShadow = true;
space.receiveShadow = true;
scene.add( space );
//Light
var light = new THREE.SpotLight();
light.position.set( 0, 1000, -500 );
light.castShadow = true;
light.shadowMapWidth = 2048;
light.shadowMapHeight = 2048;
light.shadowBias = 0.00001;
light.shadowDarkness = 0.1;
scene.add(light);
//Spline
var pathSplinePoints = [];
/*pathSplinePoints.push( new THREE.Vector3( 0, 5000, 0 ) );
pathSplinePoints.push( new THREE.Vector3( 0, 0, -2500 ) );
pathSplinePoints.push( new THREE.Vector3( 0, -5000, 0 ) );
pathSplinePoints.push( new THREE.Vector3( 0, 0, 5000 ) ); */
pathSplinePoints.push( new THREE.Vector3( 0, 0, 0 ) );
pathSplinePoints.push( new THREE.Vector3( 250, 300, -400 ) );
pathSplinePoints.push( new THREE.Vector3( 0, -100, -500 ) );
pathSplinePoints.push( new THREE.Vector3( -500, -100, 250 ) );
pathSplinePoints.push( new THREE.Vector3( 0, 0, 500 ) );
pathSpline = new THREE.ClosedSplineCurve3( pathSplinePoints );
geometry = new THREE.TubeGeometry( pathSpline, 100, 50, 20,true );
geometry2 = new THREE.TubeGeometry( pathSpline, 100, 52, 20,true );
material = new THREE.MeshBasicMaterial( {color: 0xaaaaaa, side: THREE.DoubleSide, shading: THREE.SmoothShading, wireframe: false } );
material2 = new THREE.MeshBasicMaterial( {color: 0xff0000, side: THREE.DoubleSide, shading: THREE.SmoothShading, wireframe: true } );
material3 = new THREE.MeshBasicMaterial( {color: 0x1e1e1e, side: THREE.DoubleSide, shading: THREE.SmoothShading, wireframe: false } );
THREE.ImageUtils.crossOrigin = '';
textureVortex = THREE.ImageUtils.loadTexture( "https://s3-us-west-2.amazonaws.com/s.cdpn.io/39394/vortex4.jpg" );
textureVortex.wrapS = THREE.RepeatWrapping;
textureVortex.wrapT = THREE.RepeatWrapping;
textureVortex.repeat.set( 2, 7 );
material4 = new THREE.MeshBasicMaterial( {map: textureVortex, side: THREE.DoubleSide, shading: THREE.SmoothShading, wireframe: false, transparent: false, opacity: 1 } );
mesh2 = new THREE.Mesh( geometry2, material4 );
mesh2.geometry.dynamic = true;
scene.add( mesh2 );
composer = new WAGNER.Composer( renderer, { useRGBA: false } );
composer.setSize( renderer.domElement.width, renderer.domElement.height );
zoomBlurPass = new WAGNER.ZoomBlurPass();
zoomBlurPass.params.strength = 0.005;
zoomBlurPass.params.center.set( .75 * composer.width, .75 * composer.height );
vignettePass = new WAGNER.Vignette2Pass();
vignettePass.params.boost = 3.5;
vignettePass.params.reduction = 5.25;
highPassPass = new WAGNER.HighPassPass();
invertPass = new WAGNER.InvertPass();
chromaticAberrationPass = new WAGNER.ChromaticAberrationPass();
fxaaPass = new WAGNER.FXAAPass();
setInterval( function(){
render();
}, 1000/30);
}
function render(){
controls.update();
textureVortex.offset.x += 0.005;
textureVortex.offset.x %= 1;
textureVortex.offset.y += 0.01;
textureVortex.offset.y %= 1;
t+=0.0035;
if(t>1){
t = 0
}
//Pos
camera.position.set( pathSpline.getPointAt(t).x, pathSpline.getPointAt(t).y, pathSpline.getPointAt(t).z);
//Rotation
var pos = pathSpline.getPointAt( t );
// interpolation
var segments = mesh2.geometry.tangents.length;
var pickt = t * segments;
var pick = Math.floor( pickt );
var pickNext = ( pick + 1 ) % segments;
binormal.subVectors( mesh2.geometry.binormals[ pickNext ], mesh2.geometry.binormals[ pick ] );
binormal.multiplyScalar( pickt - pick ).add( mesh2.geometry.binormals[ pick ] );
var dir = mesh2.geometry.parameters.path.getTangentAt( t );
var offset = 15;
normal.copy( binormal ).cross( dir );
pos.add( normal.clone().multiplyScalar( offset ) );
camera.position.copy( pos );
var lookAt = mesh2.geometry.parameters.path.getPointAt( ( t + 30 / pathSpline.getLength() ) % 1 );
lookAt.copy( pos ).add( dir );
camera.matrix.lookAt(camera.position, lookAt, normal);
camera.rotation.setFromRotationMatrix( camera.matrix, camera.rotation.order );
composer.reset();
composer.render( scene, camera );
composer.pass( zoomBlurPass );
composer.pass( vignettePass );
composer.pass( fxaaPass );
composer.toScreen();
}
Also see: Tab Triggers