Advertisement
Ensikology

RollerCoaster

Dec 10th, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * @author mrdoob / http://mrdoob.com/
  3.  */
  4.  
  5. function RollerCoasterGeometry( curve, divisions ) {
  6.  
  7.     THREE.BufferGeometry.call( this );
  8.  
  9.     var vertices = [];
  10.     var normals = [];
  11.     var colors = [];
  12.  
  13.     var color1 = [ 1, 1, 1 ];
  14.     var color2 = [ 1, 1, 0 ];
  15.  
  16.     var up = new THREE.Vector3( 0, 1, 0 );
  17.     var forward = new THREE.Vector3();
  18.     var right = new THREE.Vector3();
  19.  
  20.     var quaternion = new THREE.Quaternion();
  21.     var prevQuaternion = new THREE.Quaternion();
  22.     prevQuaternion.setFromAxisAngle( up, Math.PI / 2 );
  23.  
  24.     var point = new THREE.Vector3();
  25.     var prevPoint = new THREE.Vector3();
  26.     prevPoint.copy( curve.getPointAt( 0 ) );
  27.  
  28.     // shapes
  29.  
  30.     var step = [
  31.         new THREE.Vector3( - 0.225, 0, 0 ),
  32.         new THREE.Vector3( 0, - 0.050, 0 ),
  33.         new THREE.Vector3( 0, - 0.175, 0 ),
  34.  
  35.         new THREE.Vector3( 0, - 0.050, 0 ),
  36.         new THREE.Vector3( 0.225, 0, 0 ),
  37.         new THREE.Vector3( 0, - 0.175, 0 )
  38.     ];
  39.  
  40.     var PI2 = Math.PI * 2;
  41.  
  42.     var sides = 5;
  43.     var tube1 = [];
  44.  
  45.     for ( var i = 0; i < sides; i ++ ) {
  46.  
  47.         var angle = ( i / sides ) * PI2;
  48.         tube1.push( new THREE.Vector3( Math.sin( angle ) * 0.06, Math.cos( angle ) * 0.06, 0 ) );
  49.  
  50.     }
  51.  
  52.     var sides = 6;
  53.     var tube2 = [];
  54.  
  55.     for ( var i = 0; i < sides; i ++ ) {
  56.  
  57.         var angle = ( i / sides ) * PI2;
  58.         tube2.push( new THREE.Vector3( Math.sin( angle ) * 0.025, Math.cos( angle ) * 0.025, 0 ) );
  59.  
  60.     }
  61.  
  62.     var vector = new THREE.Vector3();
  63.     var normal = new THREE.Vector3();
  64.  
  65.     function drawShape( shape, color ) {
  66.  
  67.         normal.set( 0, 0, - 1 ).applyQuaternion( quaternion );
  68.  
  69.         for ( var j = 0; j < shape.length; j ++ ) {
  70.  
  71.             vector.copy( shape[ j ] );
  72.             vector.applyQuaternion( quaternion );
  73.             vector.add( point );
  74.  
  75.             vertices.push( vector.x, vector.y, vector.z );
  76.             normals.push( normal.x, normal.y, normal.z );
  77.             colors.push( color[ 0 ], color[ 1 ], color[ 2 ] );
  78.  
  79.         }
  80.  
  81.         normal.set( 0, 0, 1 ).applyQuaternion( quaternion );
  82.  
  83.         for ( var j = shape.length - 1; j >= 0; j -- ) {
  84.  
  85.             vector.copy( shape[ j ] );
  86.             vector.applyQuaternion( quaternion );
  87.             vector.add( point );
  88.  
  89.             vertices.push( vector.x, vector.y, vector.z );
  90.             normals.push( normal.x, normal.y, normal.z );
  91.             colors.push( color[ 0 ], color[ 1 ], color[ 2 ] );
  92.  
  93.         }
  94.  
  95.     }
  96.  
  97.     var vector1 = new THREE.Vector3();
  98.     var vector2 = new THREE.Vector3();
  99.     var vector3 = new THREE.Vector3();
  100.     var vector4 = new THREE.Vector3();
  101.  
  102.     var normal1 = new THREE.Vector3();
  103.     var normal2 = new THREE.Vector3();
  104.     var normal3 = new THREE.Vector3();
  105.     var normal4 = new THREE.Vector3();
  106.  
  107.     function extrudeShape( shape, offset, color ) {
  108.  
  109.         for ( var j = 0, jl = shape.length; j < jl; j ++ ) {
  110.  
  111.             var point1 = shape[ j ];
  112.             var point2 = shape[ ( j + 1 ) % jl ];
  113.  
  114.             vector1.copy( point1 ).add( offset );
  115.             vector1.applyQuaternion( quaternion );
  116.             vector1.add( point );
  117.  
  118.             vector2.copy( point2 ).add( offset );
  119.             vector2.applyQuaternion( quaternion );
  120.             vector2.add( point );
  121.  
  122.             vector3.copy( point2 ).add( offset );
  123.             vector3.applyQuaternion( prevQuaternion );
  124.             vector3.add( prevPoint );
  125.  
  126.             vector4.copy( point1 ).add( offset );
  127.             vector4.applyQuaternion( prevQuaternion );
  128.             vector4.add( prevPoint );
  129.  
  130.             vertices.push( vector1.x, vector1.y, vector1.z );
  131.             vertices.push( vector2.x, vector2.y, vector2.z );
  132.             vertices.push( vector4.x, vector4.y, vector4.z );
  133.  
  134.             vertices.push( vector2.x, vector2.y, vector2.z );
  135.             vertices.push( vector3.x, vector3.y, vector3.z );
  136.             vertices.push( vector4.x, vector4.y, vector4.z );
  137.  
  138.             //
  139.  
  140.             normal1.copy( point1 );
  141.             normal1.applyQuaternion( quaternion );
  142.             normal1.normalize();
  143.  
  144.             normal2.copy( point2 );
  145.             normal2.applyQuaternion( quaternion );
  146.             normal2.normalize();
  147.  
  148.             normal3.copy( point2 );
  149.             normal3.applyQuaternion( prevQuaternion );
  150.             normal3.normalize();
  151.  
  152.             normal4.copy( point1 );
  153.             normal4.applyQuaternion( prevQuaternion );
  154.             normal4.normalize();
  155.  
  156.             normals.push( normal1.x, normal1.y, normal1.z );
  157.             normals.push( normal2.x, normal2.y, normal2.z );
  158.             normals.push( normal4.x, normal4.y, normal4.z );
  159.  
  160.             normals.push( normal2.x, normal2.y, normal2.z );
  161.             normals.push( normal3.x, normal3.y, normal3.z );
  162.             normals.push( normal4.x, normal4.y, normal4.z );
  163.  
  164.             colors.push( color[ 0 ], color[ 1 ], color[ 2 ] );
  165.             colors.push( color[ 0 ], color[ 1 ], color[ 2 ] );
  166.             colors.push( color[ 0 ], color[ 1 ], color[ 2 ] );
  167.  
  168.             colors.push( color[ 0 ], color[ 1 ], color[ 2 ] );
  169.             colors.push( color[ 0 ], color[ 1 ], color[ 2 ] );
  170.             colors.push( color[ 0 ], color[ 1 ], color[ 2 ] );
  171.  
  172.         }
  173.  
  174.     }
  175.  
  176.     var offset = new THREE.Vector3();
  177.  
  178.     for ( var i = 1; i <= divisions; i ++ ) {
  179.  
  180.         point.copy( curve.getPointAt( i / divisions ) );
  181.  
  182.         up.set( 0, 1, 0 );
  183.  
  184.         forward.subVectors( point, prevPoint ).normalize();
  185.         right.crossVectors( up, forward ).normalize();
  186.         up.crossVectors( forward, right );
  187.  
  188.         var angle = Math.atan2( forward.x, forward.z );
  189.  
  190.         quaternion.setFromAxisAngle( up, angle );
  191.  
  192.         if ( i % 2 === 0 ) {
  193.  
  194.             drawShape( step, color2 );
  195.  
  196.         }
  197.  
  198.         extrudeShape( tube1, offset.set( 0, - 0.125, 0 ), color2 );
  199.         extrudeShape( tube2, offset.set( 0.2, 0, 0 ), color1 );
  200.         extrudeShape( tube2, offset.set( - 0.2, 0, 0 ), color1 );
  201.  
  202.         prevPoint.copy( point );
  203.         prevQuaternion.copy( quaternion );
  204.  
  205.     }
  206.  
  207.     // console.log( vertices.length );
  208.  
  209.     this.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( vertices ), 3 ) );
  210.     this.addAttribute( 'normal', new THREE.BufferAttribute( new Float32Array( normals ), 3 ) );
  211.     this.addAttribute( 'color', new THREE.BufferAttribute( new Float32Array( colors ), 3 ) );
  212.  
  213. }
  214.  
  215. RollerCoasterGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );
  216.  
  217. function RollerCoasterLiftersGeometry( curve, divisions ) {
  218.  
  219.     THREE.BufferGeometry.call( this );
  220.  
  221.     var vertices = [];
  222.     var normals = [];
  223.  
  224.     var quaternion = new THREE.Quaternion();
  225.  
  226.     var up = new THREE.Vector3( 0, 1, 0 );
  227.  
  228.     var point = new THREE.Vector3();
  229.     var tangent = new THREE.Vector3();
  230.  
  231.     // shapes
  232.  
  233.     var tube1 = [
  234.         new THREE.Vector3( 0, 0.05, - 0.05 ),
  235.         new THREE.Vector3( 0, 0.05, 0.05 ),
  236.         new THREE.Vector3( 0, - 0.05, 0 )
  237.     ];
  238.  
  239.     var tube2 = [
  240.         new THREE.Vector3( - 0.05, 0, 0.05 ),
  241.         new THREE.Vector3( - 0.05, 0, - 0.05 ),
  242.         new THREE.Vector3( 0.05, 0, 0 )
  243.     ];
  244.  
  245.     var tube3 = [
  246.         new THREE.Vector3( 0.05, 0, - 0.05 ),
  247.         new THREE.Vector3( 0.05, 0, 0.05 ),
  248.         new THREE.Vector3( - 0.05, 0, 0 )
  249.     ];
  250.  
  251.     var vector1 = new THREE.Vector3();
  252.     var vector2 = new THREE.Vector3();
  253.     var vector3 = new THREE.Vector3();
  254.     var vector4 = new THREE.Vector3();
  255.  
  256.     var normal1 = new THREE.Vector3();
  257.     var normal2 = new THREE.Vector3();
  258.     var normal3 = new THREE.Vector3();
  259.     var normal4 = new THREE.Vector3();
  260.  
  261.     function extrudeShape( shape, fromPoint, toPoint ) {
  262.  
  263.         for ( var j = 0, jl = shape.length; j < jl; j ++ ) {
  264.  
  265.             var point1 = shape[ j ];
  266.             var point2 = shape[ ( j + 1 ) % jl ];
  267.  
  268.             vector1.copy( point1 );
  269.             vector1.applyQuaternion( quaternion );
  270.             vector1.add( fromPoint );
  271.  
  272.             vector2.copy( point2 );
  273.             vector2.applyQuaternion( quaternion );
  274.             vector2.add( fromPoint );
  275.  
  276.             vector3.copy( point2 );
  277.             vector3.applyQuaternion( quaternion );
  278.             vector3.add( toPoint );
  279.  
  280.             vector4.copy( point1 );
  281.             vector4.applyQuaternion( quaternion );
  282.             vector4.add( toPoint );
  283.  
  284.             vertices.push( vector1.x, vector1.y, vector1.z );
  285.             vertices.push( vector2.x, vector2.y, vector2.z );
  286.             vertices.push( vector4.x, vector4.y, vector4.z );
  287.  
  288.             vertices.push( vector2.x, vector2.y, vector2.z );
  289.             vertices.push( vector3.x, vector3.y, vector3.z );
  290.             vertices.push( vector4.x, vector4.y, vector4.z );
  291.  
  292.             //
  293.  
  294.             normal1.copy( point1 );
  295.             normal1.applyQuaternion( quaternion );
  296.             normal1.normalize();
  297.  
  298.             normal2.copy( point2 );
  299.             normal2.applyQuaternion( quaternion );
  300.             normal2.normalize();
  301.  
  302.             normal3.copy( point2 );
  303.             normal3.applyQuaternion( quaternion );
  304.             normal3.normalize();
  305.  
  306.             normal4.copy( point1 );
  307.             normal4.applyQuaternion( quaternion );
  308.             normal4.normalize();
  309.  
  310.             normals.push( normal1.x, normal1.y, normal1.z );
  311.             normals.push( normal2.x, normal2.y, normal2.z );
  312.             normals.push( normal4.x, normal4.y, normal4.z );
  313.  
  314.             normals.push( normal2.x, normal2.y, normal2.z );
  315.             normals.push( normal3.x, normal3.y, normal3.z );
  316.             normals.push( normal4.x, normal4.y, normal4.z );
  317.  
  318.         }
  319.  
  320.     }
  321.  
  322.     var fromPoint = new THREE.Vector3();
  323.     var toPoint = new THREE.Vector3();
  324.  
  325.     for ( var i = 1; i <= divisions; i ++ ) {
  326.  
  327.         point.copy( curve.getPointAt( i / divisions ) );
  328.         tangent.copy( curve.getTangentAt( i / divisions ) );
  329.  
  330.         var angle = Math.atan2( tangent.x, tangent.z );
  331.  
  332.         quaternion.setFromAxisAngle( up, angle );
  333.  
  334.         //
  335.  
  336.         if ( point.y > 10 ) {
  337.  
  338.             fromPoint.set( - 0.75, - 0.35, 0 );
  339.             fromPoint.applyQuaternion( quaternion );
  340.             fromPoint.add( point );
  341.  
  342.             toPoint.set( 0.75, - 0.35, 0 );
  343.             toPoint.applyQuaternion( quaternion );
  344.             toPoint.add( point );
  345.  
  346.             extrudeShape( tube1, fromPoint, toPoint );
  347.  
  348.             fromPoint.set( - 0.7, - 0.3, 0 );
  349.             fromPoint.applyQuaternion( quaternion );
  350.             fromPoint.add( point );
  351.  
  352.             toPoint.set( - 0.7, - point.y, 0 );
  353.             toPoint.applyQuaternion( quaternion );
  354.             toPoint.add( point );
  355.  
  356.             extrudeShape( tube2, fromPoint, toPoint );
  357.  
  358.             fromPoint.set( 0.7, - 0.3, 0 );
  359.             fromPoint.applyQuaternion( quaternion );
  360.             fromPoint.add( point );
  361.  
  362.             toPoint.set( 0.7, - point.y, 0 );
  363.             toPoint.applyQuaternion( quaternion );
  364.             toPoint.add( point );
  365.  
  366.             extrudeShape( tube3, fromPoint, toPoint );
  367.  
  368.         } else {
  369.  
  370.             fromPoint.set( 0, - 0.2, 0 );
  371.             fromPoint.applyQuaternion( quaternion );
  372.             fromPoint.add( point );
  373.  
  374.             toPoint.set( 0, - point.y, 0 );
  375.             toPoint.applyQuaternion( quaternion );
  376.             toPoint.add( point );
  377.  
  378.             extrudeShape( tube3, fromPoint, toPoint );
  379.  
  380.         }
  381.  
  382.     }
  383.  
  384.     this.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( vertices ), 3 ) );
  385.     this.addAttribute( 'normal', new THREE.BufferAttribute( new Float32Array( normals ), 3 ) );
  386.  
  387. }
  388.  
  389. RollerCoasterLiftersGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );
  390.  
  391. function RollerCoasterShadowGeometry( curve, divisions ) {
  392.  
  393.     THREE.BufferGeometry.call( this );
  394.  
  395.     var vertices = [];
  396.  
  397.     var up = new THREE.Vector3( 0, 1, 0 );
  398.     var forward = new THREE.Vector3();
  399.  
  400.     var quaternion = new THREE.Quaternion();
  401.     var prevQuaternion = new THREE.Quaternion();
  402.     prevQuaternion.setFromAxisAngle( up, Math.PI / 2 );
  403.  
  404.     var point = new THREE.Vector3();
  405.  
  406.     var prevPoint = new THREE.Vector3();
  407.     prevPoint.copy( curve.getPointAt( 0 ) );
  408.     prevPoint.y = 0;
  409.  
  410.     var vector1 = new THREE.Vector3();
  411.     var vector2 = new THREE.Vector3();
  412.     var vector3 = new THREE.Vector3();
  413.     var vector4 = new THREE.Vector3();
  414.  
  415.     for ( var i = 1; i <= divisions; i ++ ) {
  416.  
  417.         point.copy( curve.getPointAt( i / divisions ) );
  418.         point.y = 0;
  419.  
  420.         forward.subVectors( point, prevPoint );
  421.  
  422.         var angle = Math.atan2( forward.x, forward.z );
  423.  
  424.         quaternion.setFromAxisAngle( up, angle );
  425.  
  426.         vector1.set( - 0.3, 0, 0 );
  427.         vector1.applyQuaternion( quaternion );
  428.         vector1.add( point );
  429.  
  430.         vector2.set( 0.3, 0, 0 );
  431.         vector2.applyQuaternion( quaternion );
  432.         vector2.add( point );
  433.  
  434.         vector3.set( 0.3, 0, 0 );
  435.         vector3.applyQuaternion( prevQuaternion );
  436.         vector3.add( prevPoint );
  437.  
  438.         vector4.set( - 0.3, 0, 0 );
  439.         vector4.applyQuaternion( prevQuaternion );
  440.         vector4.add( prevPoint );
  441.  
  442.         vertices.push( vector1.x, vector1.y, vector1.z );
  443.         vertices.push( vector2.x, vector2.y, vector2.z );
  444.         vertices.push( vector4.x, vector4.y, vector4.z );
  445.  
  446.         vertices.push( vector2.x, vector2.y, vector2.z );
  447.         vertices.push( vector3.x, vector3.y, vector3.z );
  448.         vertices.push( vector4.x, vector4.y, vector4.z );
  449.  
  450.         prevPoint.copy( point );
  451.         prevQuaternion.copy( quaternion );
  452.  
  453.     }
  454.  
  455.     this.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( vertices ), 3 ) );
  456.  
  457. }
  458.  
  459. RollerCoasterShadowGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );
  460.  
  461. function SkyGeometry() {
  462.  
  463.     THREE.BufferGeometry.call( this );
  464.  
  465.     var vertices = [];
  466.  
  467.     for ( var i = 0; i < 100; i ++ ) {
  468.  
  469.         var x = Math.random() * 800 - 400;
  470.         var y = Math.random() * 50 + 50;
  471.         var z = Math.random() * 800 - 400;
  472.  
  473.         var size = Math.random() * 40 + 20;
  474.  
  475.         vertices.push( x - size, y, z - size );
  476.         vertices.push( x + size, y, z - size );
  477.         vertices.push( x - size, y, z + size );
  478.  
  479.         vertices.push( x + size, y, z - size );
  480.         vertices.push( x + size, y, z + size );
  481.         vertices.push( x - size, y, z + size );
  482.  
  483.     }
  484.  
  485.  
  486.     this.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( vertices ), 3 ) );
  487.  
  488. }
  489.  
  490. SkyGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );
  491.  
  492. function TreesGeometry( landscape ) {
  493.  
  494.     THREE.BufferGeometry.call( this );
  495.  
  496.     var vertices = [];
  497.     var colors = [];
  498.  
  499.     var raycaster = new THREE.Raycaster();
  500.     raycaster.ray.direction.set( 0, - 1, 0 );
  501.  
  502.     for ( var i = 0; i < 2000; i ++ ) {
  503.  
  504.         var x = Math.random() * 500 - 250;
  505.         var z = Math.random() * 500 - 250;
  506.  
  507.         raycaster.ray.origin.set( x, 50, z );
  508.  
  509.         var intersections = raycaster.intersectObject( landscape );
  510.  
  511.         if ( intersections.length === 0 ) continue;
  512.  
  513.         var y = intersections[ 0 ].point.y;
  514.  
  515.         var height = Math.random() * 5 + 0.5;
  516.  
  517.         var angle = Math.random() * Math.PI * 2;
  518.  
  519.         vertices.push( x + Math.sin( angle ), y, z + Math.cos( angle ) );
  520.         vertices.push( x, y + height, z );
  521.         vertices.push( x + Math.sin( angle + Math.PI ), y, z + Math.cos( angle + Math.PI ) );
  522.  
  523.         angle += Math.PI / 2;
  524.  
  525.         vertices.push( x + Math.sin( angle ), y, z + Math.cos( angle ) );
  526.         vertices.push( x, y + height, z );
  527.         vertices.push( x + Math.sin( angle + Math.PI ), y, z + Math.cos( angle + Math.PI ) );
  528.  
  529.         var random = Math.random() * 0.1;
  530.  
  531.         for ( var j = 0; j < 6; j ++ ) {
  532.  
  533.             colors.push( 0.2 + random, 0.4 + random, 0 );
  534.  
  535.         }
  536.  
  537.     }
  538.  
  539.     this.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( vertices ), 3 ) );
  540.     this.addAttribute( 'color', new THREE.BufferAttribute( new Float32Array( colors ), 3 ) );
  541.  
  542. }
  543.  
  544. TreesGeometry.prototype = Object.create( THREE.BufferGeometry.prototype );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement