canvas+webgl实现360度全景环境可旋转蠕动的液态立方体交互效果代码
代码语言:html
所属分类:三维
代码描述:canvas+webgl实现360度全景环境可旋转蠕动的液态立方体交互效果代码,原生js实现。
代码标签: canvas webgl 360度 全景 环境 旋转 蠕动 液态 立方体 交互
下面为部分代码预览,完整代码请点击下载或在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.title = "🤖"; 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, 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; function createCubeMap() { const cubeMap = gl.createTexture(); gl.bindTexture(gl.TEXTURE_CUBE_MAP, cubeMap); const imgpath = '//repo.bfw.wiki/bfwrepo/images/360'; const faces = [ [gl.TEXTURE_CUBE_MAP_POSITIVE_X, 'posx.jpg'], [gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 'negx.jpg'], [gl.TEXTURE_CUBE_MAP_POSITIVE_Y, 'posy.jpg'], [gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, 'negy.jpg'], [gl.TEXTURE_CUBE_MAP_POSITIVE_Z, 'posz.jpg'], [gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, 'negz.jpg']]; for (let [target, url] of faces) { const level = 0; const internalFormat = gl.RGBA; const width = 512; const height = 512; const format = gl.RGBA; const type = gl.UNSIGNED_BYTE; gl.texImage2D(target, level, internalFormat, width, height, 0, format, type, null); const image = new Image(); image.crossOrigin = 'anonymous'; image.onload = () => { gl.bindTexture(gl.TEXTURE_CUBE_MAP, cubeMap); gl.texImage2D(target, level, internalFormat, format, type, image); }; image.src = `${imgpath}/${url}?width=512&height=512&format=auto`; } gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.NEAREST); } 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 O; uniform vec2 resolution; uniform float time; uniform vec2 touch; uniform samplerCube cubeMap; #define mouse (touch/R) #define FC gl_FragCoord.xy #define R resolution #define T mod(time,120.) #define S smoothstep #define N normalize #define rot(a) mat2(cos(a-vec4(0,11,33,0))) float map(vec3 p) { float t=T*5.; t=mix(t,t+.5,sin(t)*.5+.5); p.z*=1.-.05*cos((sign(p.z)<.0?1.:-1.)*t-14.*length(p)); p.x*=1.-.05*cos(t-14.*p.z); p.y*=1.-.05*cos(t-14.*p.z); p=abs(p)-1.; float d=length(max(p,.0))+min(.0,max(max(p.x,p.y),p.z))-.05; return d*.5; } vec3 norm(vec3 p) { float h=1e-3; vec2 k=vec2(-1,1); return N( k.xyy*map(p+k.xyy*h)+ k.yxy*map(p+k.yxy*h)+ k.yyx*map(p+k.yyx*h)+ k.xxx*map(p+k.xxx*h) ); } float mapto(float x,float a,float b,float c,float d) { return (x-a)/(b-a)*(d-c)+c; } void cam(inout vec3 p) { if (abs(mapto(.........完整代码请登录后点击上方下载按钮下载查看
网友评论0