LoginSignup
13
13

More than 5 years have passed since last update.

おしゃれな3Dメニュー

Posted at

デモ:https://mo49.github.io/qiita/20160908/menu.html
(クリックで表示)

メニューを作る
const imageFiles = [
  "nav_camera.png",
  "nav_phone.png",
  "nav_mail.png",
  "nav_settings.png"
];

this.menu1 = this.createMenu(imageFiles, 10);
メニューを表示する
this.showMenu(this.menu1,0,0,0,50,10); // menu, offsetX, offsetY, offsetZ, radius, space

全体はこんな感じ

createMenu (imageFiles, diameter) {
  this.menus = [];

  for (let [i, src] of imageFiles.entries()) {
    const geom = new THREE.PlaneGeometry(diameter,diameter,20);
    const plane = this.createMesh(geom, src);
    plane.visible = false; // 一旦非表示
    this.scene.add(plane);
    this.menus.push(plane);
  }

  return this.menus;
}

createMesh (geom, imageFile) {
  const PATH = './img/texture/';
  const textureLoader = new THREE.TextureLoader();
  const texture = textureLoader.load(PATH + imageFile);
  const mat = new THREE.MeshBasicMaterial({transparent:true});
  mat.map = texture;

  const mesh = new THREE.Mesh(geom, mat);
  return mesh;
}

showMenu(menus, offsetX, offsetY, offsetZ, radius, space) {

  const that = this;
  let degree = 0;
  let loopId;

  update();
  function update() {
    loopId = requestAnimationFrame(update);
    for (let [i, menu] of menus.entries()) {
      menu.visible = true; // 表示
      if (degree > i*space) {
        continue;
      }
      const pos = move(radius, i+1); // radius, index
      menu.position.set(pos['x'] + offsetX, pos['y'] + offsetY,  offsetZ);
    }
    degree++;
    if (degree > menus.length * space) {
      stop();
    }
  }

  function stop() {
    cancelAnimationFrame(loopId);
    console.log("stop");
  }

  function move (radius, index) {
    // speed = speed || 1.0;
    const rad = (degree * Math.PI / 180) * 2;
    const x = radius * Math.sin(rad);
    const y = radius * Math.cos(rad);

    return {'x':x, 'y':y};
  }

}
13
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13