gl-matrix+webgl实现可调参数的三维物体运行动画效果代码
代码语言:html
所属分类:三维
代码描述:gl-matrix+webgl实现可调参数的三维物体运行动画效果代码
代码标签: gl-matrix webgl 调参数 三维 物体 运行 动画
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> @import url("https://fonts.googleapis.com/css2?family=Space+Mono&display=swap"); body, html { margin: 0; padding: 0; width: 100%; height: 100%; overflow: hidden; background: #000; font-family: "Space Mono", monospace; font-size: 1rem; } canvas { width: 100%; height: 100%; } #ui { position: absolute; top: 10px; left: 10px; color: white; background: rgba(0, 0, 0, 0.7); padding: 10px; border-radius: 5px; max-width: 460px; } .control { margin-bottom: 10px; } label { display: inline-block; width: 120px; } input[type="range"] { width: 260px; } input[type="color"] { vertical-align: middle; } #togglePanel { cursor: pointer; user-select: none; font-size: 20px; margin-bottom: 0; } .colorBtn { margin-left: 5px; cursor: pointer; font-family: "Space Mono", monospace; font-size: 1rem; } button, input { font-family: "Space Mono", monospace; font-size: 1rem; } .sliderValue { display: inline-block; width: 40px; text-align: right; margin-left: 5px; } #fullscreenBtn { margin-top: 10px; width: 100%; padding: 5px 10px; background: rgba(255, 255, 255, 0.2); color: white; border: none; border-radius: 5px; cursor: pointer; } </style> </head> <body translate="no"> <canvas id="glCanvas"></canvas> <div id="ui"> <div id="togglePanel">☰</div> <div id="controls"> <div class="control"> <label for="zoomLevel">Zoom:</label> <input type="range" id="zoomLevel" min="0.1" max="3" step="0.1" value="1"> <span id="zoomValue" class="sliderValue">1.00</span> </div> <div class="control"> <label for="rotationSpeed">Rotation:</label> <input type="range" id="rotationSpeed" min="0" max="3" step="0.01" value="0.3"> <span id="rotationValue" class="sliderValue">0.30</span> </div> <div class="control"> <label for="waveSpeed">Wave:</label> <input type="range" id="waveSpeed" min="0" max="2" step="0.01" value="0.1"> <span id="waveValue" class="sliderValue">0.10</span> </div> <div class="control"> <label for="cubeColor">Cube Color:</label> <input type="color" id="cubeColor" value="#b8934a"> <button class="colorBtn" id="cubeRandom">Random</button> <button class="colorBtn" id="cubeRainbow">Rainbow</button> </div> <div class="control"> <label for="orbColor">Orb Color:</label> <input type="color" id="orbColor" value="#ffffff"> <button class="colorBtn" id="orbRandom">Random</button> <button class="colorBtn" id="orbRainbow">Rainbow</button> </div> <div class="control"> <label for="sphereColor">Sphere Col.:</label> <input type="color" id="sphereColor" value="#C0C0C0"> <button class="colorBtn" id="sphereRandom">Random</button> <button class="colorBtn" id="sphereRainbow">Rainbow</button> </div> <div class="control"> <label for="skyColor">Sky Color:</label> <input type="color" id="skyColor" value="#87CEEB"> </div> <div class="control"> <label for="floorColor">Floor Color:</label> <input type="color" id="floorColor" value="#aaaaaa"> </div> <button id="fullscreenBtn">Toggle Full Screen</button> </div> </div> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/gl-matrix-min.js"></script> <script > const canvas = document.getElementById("glCanvas"); const gl = canvas.getContext("webgl2"); if (!gl) { console.error("WebGL 2 not supported"); document.body.innerHTML = "WebGL 2 is not supported in your browser."; } const vertexShaderSource = `#version 300 es in vec4 a_position; void main() { gl_Position = a_position; }`; const fragmentShaderSource = `#version 300 es precision highp float; out vec4 fragColor; uniform vec3 iResolution; uniform float iTime; uniform vec4 iMouse; uniform float uZoomLevel; uniform float uRotationSpeed; uniform float uWaveSpeed; uniform vec3 uCubeColor; uniform vec3 uOrbColor; uniform vec3 uSphereColor; uniform vec3 uSkyColor; uniform vec3 uFloorColor; uniform bool uCubeRainbow; uniform bool uOrbRainbow; uniform bool uSphereRainbow; vec3 hsv2rgb(vec3 c) { vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); } vec2 rotate(vec2 a, float b) { float c = cos(b); float s = sin(b); return vec2( a.x * c - a.y * s, a.x * s + a.y * c ); } float sdBox( vec3 p, vec3 b ) { vec3 d = abs(p) - b; return min(max(d.x,max(d.y,d.z)),0.0) + length(max(d,0.0)); } float scene(vec3 p) { vec3 sp = p + vec3(1,3,2); return min( max( max( sdBox(p, vec3(1.)), -sdBox(p,vec3(.9)) ), abs(mod(length(sp)-iTime*uWaveSpeed,.2)-.1)-.01 ), min( length(p)-.8, length(p - vec3(2.0 * sin(iT.........完整代码请登录后点击上方下载按钮下载查看
网友评论0