three实现三维鼠标交互式鸟群飞翔迁徙动画效果代码
代码语言:html
所属分类:三维
代码描述:three实现三维鼠标交互式鸟群飞翔迁徙动画效果代码,鼠标放上去,鸟群会自动避开。
代码标签: three 三维 鼠标 交互式 鸟群 飞翔 迁徙 动画
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> body { background-color: #ffffff; margin: 0px; overflow: hidden; font-family:Monospace; font-size:13px; text-align:center; text-align:center; cursor: pointer; } </style> </head> <body> <script id="fragmentShaderPosition" type="x-shader/x-fragment"> uniform float time; uniform float delta; void main() { vec2 uv = gl_FragCoord.xy / resolution.xy; vec4 tmpPos = texture2D( texturePosition, uv ); vec3 position = tmpPos.xyz; vec3 velocity = texture2D( textureVelocity, uv ).xyz; float phase = tmpPos.w; phase = mod( ( phase + delta + length( velocity.xz ) * delta * 3. + max( velocity.y, 0.0 ) * delta * 6. ), 62.83 ); gl_FragColor = vec4( position + velocity * delta * 15. , phase ); } </script> <!-- shader for bird's velocity --> <script id="fragmentShaderVelocity" type="x-shader/x-fragment"> uniform float time; uniform float testing; uniform float delta; // about 0.016 uniform float seperationDistance; // 20 uniform float alignmentDistance; // 40 uniform float cohesionDistance; // uniform float freedomFactor; uniform vec3 predator; const float width = resolution.x; const float height = resolution.y; const float PI = 3.141592653589793; const float PI_2 = PI * 2.0; // const float VISION = PI * 0.55; float zoneRadius = 40.0; float zoneRadiusSquared = 1600.0; float separationThresh = 0.45; float alignmentThresh = 0.65; const float UPPER_BOUNDS = BOUNDS; const float LOWER_BOUNDS = -UPPER_BOUNDS; const float SPEED_LIMIT = 9.0; float rand(vec2 co){ return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); } void main() { zoneRadius = seperationDistance + alignmentDistance + cohesionDistance; separationThresh = seperationDistance / zoneRadius; alignmentThresh = ( seperationDistance + alignmentDistance ) / zoneRadius; zoneRadiusSquared = zoneRadius * zoneRadius; vec2 uv = gl_FragCoord.xy / resolution.xy; vec3 birdPosition, birdVelocity; vec3 selfPosition = texture2D( texturePosition, uv ).xyz; vec3 selfVelocity = texture2D( textureVelocity, uv ).xyz; float dist; vec3 dir; // direction float distSquared; float seperationSquared = seperationDistance * seperationDistance; float cohesionSquared = cohesionDistance * cohesionDistance; float f; float percent; vec3 velocity = selfVelocity; float limit = SPEED_LIMIT; dir = predator * UPPER_BOUNDS - selfPosition; dir.z = 0.; // dir.z *= 0.6; dist = length( dir ); distSquared = dist * dist; float preyRadius = 150.0; float preyRadiusSq = preyRadius * preyRadius; // move birds away from predator if (dist < preyRadius) { f = ( distSquared / preyRadiusSq - 1.0 ) * delta * 100.; velocity += normalize( dir ) * f; limit += 5.0; } // if (testing == 0.0) {} // if ( rand( uv + time ) < freedomFactor ) {} // Attract flocks to the center vec3 central = vec3( 0., 0., 0. ); dir = selfPosition - central; dist = length( dir ); dir.y *= 2.5; velocity -= normalize( dir ) * delta * 5.; for (float y=0.0;y<height;y++) { for (float x=0.0;x<width;x++) { vec2 ref = vec2( x + 0.5, y + 0.5 ) / resolution.xy; birdPosition = texture2D( texturePosition, ref ).xyz; dir = birdPosition - selfPosition; dist = length(dir); if (dist < 0.0001) continue; distSquared = dist * dist; if (distSquared > zoneRadiusSquared ) continue; percent = distSquared / zoneRadiusSquared; if ( percent < separationThresh ) { // low // Separation - Move apart for comfort f = (separationThresh / percent - 1.0) * delta; velocity -= normalize(dir) * f; } else if ( percent < alignmentThresh ) { // high // Alignment - fly the same direction float threshDelta = alignmentThresh - separationThresh; float adjustedPercent = ( percent - separationThresh ) / threshDelta; birdVelocity = texture2D( textureVelocity, ref ).xyz; f = ( 0.5 - cos( adjustedPercent * PI_2 ) * 0.5 + 0.5 ) * delta; velocity += normalize(birdVelocity) * f; } else { // Attraction / Cohesion - move closer float threshDelta = 1.0 - alignmentThresh; float adjustedPercent = ( percent - alignmentThresh ) / threshDelta; f = ( 0.5 - ( cos( adjustedPercent * PI_2 ) * -0.5 + 0.5 ) ) * delta; velocity += normalize(dir) * f; } } } // this make tends to fly around than down or up // if (velocity.y > 0.) velocity.y *= (1. - 0.2 * delta); // Speed Limits if ( length( velocity ) > limit ) { velocity = normalize( velocity ) * limit; } gl_FragColor = vec4( velocity, 1.0 ); } </script> <script type="x-shader/x-vertex" id="birdVS"> attribute vec2 reference; attribute float frameId; uniform sampler2D texturePosition; uniform sampler2D textureVelocity; varying vec2 vUV; varying mat2 vUVRot; varying float vFrameId; uniform float time; void main() { vec3 pos = texture2D( texturePosition, reference ).xyz; vec3 vel = normalize( texture2D( textureVelocity, reference ).xyz ); vec4 mvPos = modelViewMatrix * vec4( pos, 1.0 ); gl_PointSize = 20.0 * ( 800.0 / -mvPos.z ); vUV = vec2( vel.x * 0.5 + 0.5, vel.y * 0.5 + 0.5 ); vUV = floor( vUV * 11.0 ) / 11.0 + 0.5 / 11.0; // TODO: better movement later vUVRot = mat2( 1, 0, 0, 1 ); vFrameId = floor( mod( frameId + time * 0.5, 9.0 ) ); gl_Position = projectionMatrix * mvPos; } </script> <!-- bird geometry shader --> <script type="x-shader/x-fragment" id="birdFS"> uniform sampler2D texturesBird[ 9 ]; varying vec2 vUV; varying mat2 vUVRot; varying float vFrameId; uniform vec3 color; void main() { vec2 uv = 0.9 * vec2( 1.0 / 11.0 ) * ( gl_PointCoord - 0.5 ) * vUVRot + vUV; int id = int( vFrameId ); vec4 col; if ( id == 0 ) { col = texture2D( texturesBird[ 0 ], uv ); } else if ( id == 1 ) { col = texture2D( texturesBird[ 1 ], uv ); } else if ( id == 2 ) { col = texture2D( texturesBird[ 2 ], uv ); } else if ( id == 3 ) { col = texture2D( texturesBird[ 3 ], uv ); } else if ( id == 4 ) { col = texture2D( texturesBird[ 4 ], uv ); } else if ( id == 5 ) { col = texture2D( texturesBird[ 5 ], uv ); } else if ( id == 6 ) { col = texture2D( texturesBird[ 6 ], uv ); } else if ( id == 7 ) { col = texture2D( texturesBird[ 7 ], uv ); } else if ( id == 8 ) { col = texture2D( texturesBird[ 8 ], uv ); } gl_FragColor = col; } </script> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/three.82.js"></script> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/GPUComputationRenderer.js"></script> <script> /* TEXTURE WIDTH FOR SIMULATION */ var WIDTH = 32; var BIRDS = WIDTH * WIDTH; var container; var camera, scene, renderer, geometry, i, h, color; var mouseX = 0, mouseY = 0; var windowHalfX = window.innerWidth / 2; var windowHalfY = window.innerHeight / 2; var BOUNDS = 800, BOUNDS_HALF = BOUNDS / 2; var last = performance.now(); var gpuCompute; var velocityVariable; var positionVariable; var positionUniforms; var velocityUniforms; var birdUniforms; var birdTextures = []; init(); function init() { container = document.createElement( 'div' ); document.body.appendChild( container ); loader = new THREE.TextureLoader(); birdTextures[ 0 ] = loader.load( '//repo.bfw.wiki/bfwrepo/images/bird/crow-0.........完整代码请登录后点击上方下载按钮下载查看
网友评论0