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