canvas+webgl实现三维楼宇透视穿梭动画效果代码
代码语言:html
所属分类:三维
代码描述:canvas+webgl实现三维楼宇透视穿梭动画效果代码,点击鼠标可切换方向。
代码标签: canvas webgl 三维 楼宇 透视 穿梭 动画
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> </head> <body translate="no"> <script> const canvas = document.createElement("canvas"); const gl = canvas.getContext("webgl2"); document.body.innerHTML = ""; document.body.appendChild(canvas); document.body.style = "margin:0;touch-action:none;overflow:hidden"; canvas.style.width = "100%"; canvas.style.height = "auto"; canvas.style.userSelect = "none"; const dpr = Math.max(1, .5 * window.devicePixelRatio); function resize() { const { innerWidth: width, innerHeight: height } = window; canvas.width = width * dpr; canvas.height = height * dpr; gl.viewport(0, 0, width * dpr, height * dpr); } window.onresize = resize; const vertexSource = `#version 300 es #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif in vec4 position; void main(void) { gl_Position = position; } `; const fragmentSource = `#version 300 es /********* * made by Matthias Hurrle (@atzedent) */ #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif out vec4 fragColor; uniform vec2 resolution; uniform float time; uniform vec2 touch; uniform int pointerCount; #define mouse (touch/resolution) #define P pointerCount #define T mod(time+40.,180.) #define TICK (fract(T*.025)) mat2 rot(float a) { float c=cos(a), s=sin(a); return mat2(c,-s,s,c); } float rnd(vec2 p) { return fract(sin(dot(p,p.yx+vec2(234.78,543.12)))*345678.); } float box(vec3 p, vec3 s, float r) { p = abs(p)-s; return length(max(p,.0))+ min(.0,max(max(p.x,p.y),p.z))-r; } float map(vec3 p) { vec3 q = p; const float n = 3.; p.xz = (fract(p.xz/n)-.5)*n; vec2 id = (floor(q.xz/n)-.5)*n; float h = max(.2,rnd(id)*2.5), w = max(.5,1.-rnd(id)); q = mod(q*10.,1.125); float bld = box((p-vec3(0,h,0))+.05,vec3(w,h,w),.0125), wnd = box(q,vec3(1),.005); return max(bld, -(TICK<.5?max(wnd,-(bld+.05)):min(wnd,bld-.025))); } void cam(inout vec3 p) { if (P>0) { p.yz *= rot(-mouse.y*3.1415+1.5707); p.xz *= rot(3.1415-mouse.x*6.2832); } else { if (TICK>.5) { p.yz *= rot(-.45); p.xz *= rot(2.7+sin(T*.05)); } else { p.yz *= rot(-.25); p.xz *= rot(3.1415+cos(T*.1)*.75); } } } void main(void) { vec2 uv = ( gl_FragCoord.xy-.5*resolution )/min(resolution.x,resolution.y); vec3 col = vec3(0), p = vec3(0), rd = normalize(.........完整代码请登录后点击上方下载按钮下载查看
网友评论0