LoginSignup
0
0

More than 3 years have passed since last update.

MathBox でトランジションアニメーション(フェードイン/フェードアウト)を作る

Last updated at Posted at 2019-06-27

 スライドを作ったらトランジションアニメーションも入れたいところです。とりあえず基本のフェードイン/フェードアウトを入れてみます。どんどんメソッドチェーンが長くなるので、一つ一つ区切って理解していくと良いと思います。

フェードイン/フェードアウト

 前回のコードを元に追加していきましょう。
 ふわっと出したり消したい場合は reveal() を使います。 present.slide().reveal().interval() のように適当な位置に差し込みます。スライド開始でフェードインさせたいので、 slide() の後ろに reveal() を入れています。ここで一つ注意が必要で、トランジションの単位でも end() を入れる必要があるということです。ここではスライドが切り替わるタイミングでフェードアウトさせたいので、スライド区切りの end() の手前にもう一つ end() を入れています。

 以下のコードでは一枚目のスライドのみにフェードイン/フェードアウトを適用しています。 end() を削除してみて動作の違いを確認してみて下さい。

 また、同じようにして二枚目もフェードイン/フェードアウトさせるようにしてみて下さい。

present.slide().reveal().interval({
  width: 2,
  expr: function (emit, x, i, time) {
    emit(x, 0);
  },
  items: 1,
  channels: 2,
}).line({
  color: 0x3090FF,
  width: 10,
}).end().end()
  .slide().interval({
    width: 128,
    expr: function (emit, x, i, time) {
      var d = Math.sin((x + time) * 2);
      emit(x, d * .5);
    },
    items: 1,
    channels: 2,
  }).line({
    color: 0xFF3090,
    width: 10,
  });

パラメータの指定

 遷移の期間を少し短くしてみましょう。 reveal({ duration: 0.1 }) のようにパラメータを渡してみましょう。 duration のデフォルト値は 0.3 なので三倍早くなるはずです。他にも色々なパラメータがあるので、ドキュメントを見ながら試してみて下さい。

コード全体

 二枚目のスライドにも reveal() を適用したコード全体は下記の通りです。

<!DOCTYPE html>
<html>
    <head>
    <meta charset="utf-8">
    <title>MathBox - XYZW Test</title>
    <script src="../../build/mathbox-bundle.js"></script>
    <link rel="stylesheet" href="../../build/mathbox.css">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1">
    </head>
    <body>
    <script>
     mathbox = mathBox({
         plugins: ['core', 'controls', 'cursor'],
         controls: {
         klass: THREE.OrbitControls
         },
     });
     three = mathbox.three;

     three.camera.position.set(2.3, 1, 2);
     three.renderer.setClearColor(new THREE.Color(0xFFFFFF), 1.0);

     view = mathbox.cartesian({
         range: [[-6, 6], [-1, 1], [-1, 1]],
         scale: [6, 1, 1],
     });

     present = view.present({
         index: 1
     })

     function prevSlide () {
         present.set('index', present.get('index') - 1);
     }

     function nextSlide () {
         present.set('index', present.get('index') + 1);
     }

     present.slide().reveal({
         duration: 0.1,
     }).interval({
         width: 2,
         expr: function (emit, x, i, time) {
         emit(x, 0);
         },
         items: 1,
         channels: 2,
     }).line({
         color: 0x3090FF,
         width: 10,
     }).end().end()
        .slide().reveal({
            duration: 0.1,
        }).interval({
            width: 128,
            expr: function (emit, x, i, time) {
            var d = Math.sin((x + time) * 2);
            emit(x, d * .5);
            },
            items: 1,
            channels: 2,
        }).line({
            color: 0xFF3090,
            width: 10,
        });

     present.grid({
         stroke: 'dashed',
     });
    </script>
    </body>
</html>

See the Pen fade in and out by Yuichi Sato (@satoyuichi) on CodePen.

0
0
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
0
0