胆小的俾格米小人儿!

栏目: 后端 · 前端 · 发布时间: 7年前

内容简介:Dome在这 由于兼容性的问题还没解决,建议某天在观看TED演讲该项目的实物是由来自印度的团队制作的。测试中,俾格米人表现得惟妙惟肖,就像是一群好奇而又胆小的小动物。十分可爱!
胆小的俾格米小人儿!

在线demo

Dome在这 由于兼容性的问题还没解决,建议 Chrome 打开。

灵感来源

某天在观看TED演讲 Aparna Rao High tech Art with a sense of humor 的时候看到里面的一个项目叫做 pygmies ,中文名叫 俾格米人 (图中的小黑人)。他们都很胆小,只要有声音就会被吓到躲到板子后面。

该项目的实物是由来自印度的团队制作的。测试中,俾格米人表现得惟妙惟肖,就像是一群好奇而又胆小的小动物。十分可爱!

于是我想用web技术似乎也能达到同样的效果。只需要浏览器调用麦克风,获取数据,作用于svg元素(当然这是最初的简单想法)。

准备svg素材

作图工具,Mac平台 sketch

胆小的俾格米小人儿!

主要代码

html部分

// 主要是svg代码,量比较大,请在源码中查看
复制代码

css部分

// 主要是基本的定位代码,请在源码中查看
复制代码

js部分

"use strict";

var ctx, analyser, frequencies, getByteFrequencyDataAverage, draw;

// 兼容性
window.AudioContext = window.AudioContext || window.webkitAudioContext;
// 获取音频上下文
ctx = new window.AudioContext();

// 用户获取stream当中的时间、频率信息
analyser = ctx.createAnalyser();
frequencies = new Uint8Array(analyser.frequencyBinCount);
getByteFrequencyDataAverage = function() {
  // 将当前频域数据拷贝进数组
  analyser.getByteFrequencyData(frequencies);
  // 求得频域的平均值
  return (
    frequencies.reduce(function(previous, current) {
      return previous + current;
    }) / analyser.frequencyBinCount
  );
};

// 返回 Promise 对象
navigator.mediaDevices
  .getUserMedia({ audio: true })
  .then(function(stream) {
    // window.hackForMozzila = stream;
    ctx
      .createMediaStreamSource(stream)
      // 连接到AnalyserNode
      .connect(analyser);
  })
  .catch(function(err) {
    console.log(err.message);
  });

var pygmies = [];
for (let i = 0; i < 10; i++) {
  pygmies.push(document.getElementById(`pygmie-${i + 1}`));
}

// 改变小人的位置
(draw = function() {
  var moveValue = getByteFrequencyDataAverage() * 10;
  if (moveValue >= 35) {
    moveValue = 35;
  }
  pygmies[0].style.transform = `translate(51.000000px, ${moveValue}px)`;
  console.log(getByteFrequencyDataAverage());
  pygmies[1].style.transform = `translate(89.000000px, ${0.0 + moveValue}px)`;
  pygmies[2].style.transform = `translate(149.000000px, ${0.0 + moveValue}px)`;
  pygmies[3].style.transform = `translate(218.000000px, ${0.0 + moveValue}px)`;
  pygmies[4].style.transform = `translate(286.500000px, 51.000000px) rotate(90.000000deg) translate(-286.500000px, -51.000000px) translate(275.000000px, ${34.0 +
    moveValue}px)`;
  pygmies[5].style.transform = `translate(286.500000px, 152.000000px) rotate(90.000000deg) translate(-286.500000px, -152.000000px) translate(275.000000px, ${135.5 +
    moveValue}px)`;
  pygmies[6].style.transform = `translate(286.500000px, 196.5000000px) rotate(90.000000deg) translate(-286.500000px, -196.500000px) translate(275.000000px, ${179.5 +
    moveValue}px)`;
  pygmies[7].style.transform = `translate(17.500000px, 173.500000px) rotate(-90.000000deg) translate(-17.00000px, -173.500000px) translate(5.500000px, ${156.5 +
    moveValue}px)`;
  pygmies[8].style.transform = `translate(17.000000px, 106.500000px) rotate(-90.000000deg) translate(-17.00000px, -106.500000px) translate(5.500000px, ${89.5 +
    moveValue}px)`;
  pygmies[9].style.transform = `translate(17.00000px, 252.500000px) rotate(-90.000000deg) translate(-17.00000px, -252.500000px) translate(5.500000px, ${235.5 +
    moveValue}px)`;
  requestAnimationFrame(draw);
})();

复制代码

代码主要是做了两件事:

  • 获取麦克风的音频信息
  • 利用音频信息改变svg的位置信息

只不过需要不断的循环,来获取最新的信息。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ACM程序设计

ACM程序设计

曾棕根 / 北京大学 / 2011-4 / 34.00元

《ACM程序设计(第2版)》详细讲解了ACM国际大学生程序设计竞赛(ACM/ICPC)编程、调试方法,以及提高时间、空间性能的策略,并充分利用了C++泛型编程的高效率、规范化的特性,全部采用C++泛型编程。第1章讲解了ACM程序设计入门知识;第2章讲解了C++泛型编程的容器、迭代器和常用算法;第3章讲解了ACM程序设计的基本编程技巧;第4章讲解了50道原版ACM竞赛题的解题思路,并配有C++泛型编......一起来看看 《ACM程序设计》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

html转js在线工具
html转js在线工具

html转js在线工具