随机多彩图形变换动画效果

代码语言:html

所属分类:动画

代码描述:可以作为待机画面或屏保,不断地变换图形和色彩

代码标签: 变换 动画 效果

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">

<style>
body {
  background-color: #000;    
  margin: 0;
  overflow: hidden;
  background-repeat: no-repeat;
  display:flex;
  align-items:center;
  justify-content:center;  
}
</style>

</head>
<body translate="no">

<p id="controls"></p>
<canvas id="canvas"></canvas>

<script type="text/javascript" src="http://repo.bfw.wiki/bfwrepo/js/dat.gui-min.js"></script>
<script type="text/javascript" src="http://repo.bfw.wiki/bfwrepo/js/tinycolor.min.js"></script>
<script >
var canvas = document.getElementById("canvas");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
var gl = canvas.getContext("webgl");
var menuOpen = false;
canvas.addEventListener("click", function (ev) {
  genGui();

});
var myoptions;
var data = document.getElementById("controls");
var modes = ["multiply", "divide", "add", "subtract", "reciprocal", "inverted subtraction"];
var operators = ["add", "subtract", "multiply", "divide"];
var functions = ["none", "sine", "tan"];
var primaryColors = ["#000000", "#ffffff", "#ff0000", "#00ff00", "#0000ff", "#ff00ff", "#00ffff", "#ffff00"];
var Options = function () {

  this.mode = pick(["multiply", "divide", "subtract", "add", "reciprocal", "inverted subtraction"]);

  this.shape1 = tinycolor.random().toHexString();
  this.invertShape1 = Math.random() > .5;
  this.reverseShape1 = Math.random() > .5;

  this.shape2 = tinycolor.random().toHexString();
  this.invertShape2 = Math.random() > .5;
  this.reverseShape2 = Math.random() > .5;

  this.shape3 = Math.random() > .25 ? pick(primaryColors) : tinycolor.random().toHexString();
  this.invertShape3 = Math.random() > .5;
  this.reverseShape3 = Math.random() > .5;

  this.rotation = getRandomInt(-10, 10);
  this.theta = getRandomInt(-12, 12);
  this.time = Math.random() * .015;
  this.reverseTime = Math.random() > .5;

  this.motionIterations = getRandomInt(0, 5);
  this.motionMultiplier = getRandomFloat(0, 2);
  this.extraMotion1 = Math.random() > .5;
  this.extraMotion2 = Math.random() > .5;

  this.colorOperator1 = pick(operators);
  this.colorOperator2 = pick(operators);

  this.motionOperator1 = pick(operators);
  this.motionOperator2 = pick(operators);

  this.thetaFunc = Math.random() > .25 ? pick(["none", "sine"]) : pick(functions); /*tangent only sometimes*/
};

//GUI表示
var gui;
function genGui() {
  myoptions = new Options();
  setValue();
  let wasClosed = !gui || gui.closed;
  gui && gui.destroy();
  gui = new dat.GUI();
  if (wasClosed) gui.close();

  //shapes and colors
  gui.add(myoptions, "mode", modes).onChange(setValue);
  gui.addColor(myoptions, "shape1").onChange(setValue);
  gui.add(myoptions, "invertShape1").onChange(setValue);
  gui.add(myoptions, "reverseShape1").onChange(setValue);

  gui.addColor(myoptions, "shape2").onChange(setValue);
  gui.add(myoptions, "invertShape2").onChange(setValue);
  gui.add(myoptions, "reverseShape2").onChange(setValue);

  gui.addColor(myoptions, "shape3").onChange(setValue);
  gui.add(myoptions, "invertShape3").onChange(setValue);
  gui.add(myoptions, "reverseShape3").onChange(setValue);

  gui.add(myoptions, "colorOperator1", operators).onChange(setValue);
  gui.add(myoptions, "colorOperator2", operators).onChange(setValue);

  //movement
  gui.add(myoptions, "rotation", -10, 10).onChange(setValue);
  gui.add(myoptions, "theta", -12, 12).onChange(setValue);
  gui.add(myoptions, "thetaFunc", functions).onChange(setValue);

  gui.add(myoptions, "time", 0.0, 0.015).onChange(setValue);
  gui.add(myoptions, "reverseTime").onChange(setValue);

  gui.add(myoptions, "motionMultiplier", 0.00, 2.0).onChange(setValue);
  gui.add(myoptions, "motionIterations", 0, 5).onChange(setValue);

  gui.add(myoptions, "extraMotion1").onChange(setValue);
  gui.add(myoptions, "extraMotion2").onChange(setValue);

  gui.add(myoptions, "motionOperator1", operators).onChange(setValue);
  gui.add(myoptions, "motionOperator2", operators).onChange(setValue);


}

function setValue() {

  gl.uniform1i(getUniformLocation(program, "mode"), modes.indexOf(myoptions.mode));

  var s3 = tinycolor(myoptions.shape3);
  s3.red = s3._r / 255;.........完整代码请登录后点击上方下载按钮下载查看

网友评论0