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