三角関数 3 (三角関数の応用問題)

三角関数の応用問題 1

エンジンのピストンが translateY の 2.0 から -2.0 の間隔を、 2 秒の周期で往復運動をする場合のアニメーションを、 三角関数を使って表してみましょう。

0 秒 目の図 (translateY = 2.0)
[0 秒 目の図]
1 秒 目の図 (translateY = -2.0)
[1 秒 目の図]
2 秒 目の図 (translateY = 2.0)
[2 秒 目の図]

このアニメーションをグラフにすると以下のようになります。

[translateY のグラフ]

このグラフを三角関数で表したいときには、 まず、形の似ている三角関数のグラフをさがします。 この場合には cos のグラフの形が同じであることに気がつきます。

[cos のグラフ]

2 つのグラフを 1 つにして比べてみましょう。 (cos のグラフ目的のグラフです)

[cos と 目的のグラフ]

上の 2 つのグラフの違いは縦軸と横軸の範囲です。 アニメーションのグラフは 時間 (横軸)は 0 から 2 まで、 translateY (横軸)は -2.0 から 2.0、 cos のグラフは 横軸が 0 から 2*3.14、 縦軸が -1.0 から 1.0 になっています。

これから 2 つの図の縦軸と横軸の範囲を合わせてゆきます。
まず、縦軸を合わせるために cos の図を縦に 2 倍のスケールをかけます。
縦軸の最大値と最小値に注意してください。

2 * cos(X) の図
[2*cos(X) のグラフ]

次に横軸を合わせるために、角度を 6 倍します。 (360/60 = 6)
すると、cos の周期が 1/6 になります。

2 * cos(6 * X) の図
[2*cos(6*X) のグラフ]

これで 2 つのグラフが同じになったので、 2 * cos(6 * X) が求める式になります。

Maya 上でのアニメーション

実際に上記の式で望んだアニメーションが実行できるかどうか、 Maya 上で確かめてみましょう。

  1. Polygon または NURBS の Cylinder を作ります。
  2. Expression Editor を開きます。
    (Channel Box からの場合)
    1. TranslateY を選択
    2. マウス右ボタンでポップアップメニューを開き、 Expressions... を選びます。
    (Attribute Editor からの場合)
    1. トランスフォームノード(pCylinder1 または nurbsCylinder1 など)の Attribute Editor を表示しておきます。
    2. Transform Attribute → Translate の Y フィールド上で マウス右ボタンによりポップアップメニューを開き、 Create New Expression... を選びます。
  3. Expression Editor の Expression: に以下の式を書き込みます。
    ty = 2 * cosd(6 * frame);
    [Expression エディタ]
  4. Expression Editor の Create ボタンを押します。
    すると、エラーが無ければ以下のように translateY のフィールドの色が変化します。
    [translateY のフィールド]
  5. プレイバックすると、 translateY が 60 フレームの周期で 2.0 と -2.0 の間を変化するアニメーションが再生されます。
    アニメーション

Maya 上での三角関数

上の Expression の式において、 cos ではなく cosd という関数が使われています。
これはなぜかというと Maya の cos 関数では引数の単位が、 円の 1 周を 2 * 円周率(π = 3.14...)で表すラジアンになっているので、 その代わりに今までの説明で使ってきた 弧度法(円の 1 周 360 度)を単位とする関数である cosd を使っているのです。

もし、上の Expression を cos 関数で表したければ、 弧度法をラジアンに変換する関数 deg_to_rad を使います。
具体的には以下のような式を Expression: に打ち込みます。

ty = 2 * cos(6 * deg_to_rad(frame));

sin 関数の場合も、同じ理由で sind を使用します。

三角関数の応用問題 2

赤いライトが点滅するアニメーションを、三角関数によって表してみましょう。
赤色を表す値(アトリビュート)が 120 フレーム周期で 0.0 から 1.0 の間を行ったり来たりするとします。

0 フレーム目
[0 フレーム目]
60 フレーム目
[60 フレーム目]
120 フレーム目
[120 フレーム目]

このアニメーションは、0 フレーム目で 0.0、 60 フレーム目で 1.0、 120 フレーム目で 0.0 となり、後は 120 フレームの周期で同じ点滅をくり返します。
それをグラフで表すと、以下のようになります。

[ライト点滅のグラフ]

このグラフと形が同じグラフが sin または cos のグラフから見つかるでしょうか。
まず、sin のグラフを見てみます。
(このグラフは横軸が -360 から 360 の範囲のグラフであることに注意してください)

[sin の図]

このグラフの中で求めるグラフと同じ形をさがすと、 以下の部分が同じ形になっているのに気がつきます。

[sin の図]

2 つの図を 1 つにしてみましょう。 (sin のグラフ目的のグラフです)

[sin と目的の図]

後は、この sin のグラフを目的のグラフにピッタリ重なるように移動・スケールをかけてゆきます。
以下のグラフにおいては横軸・縦軸の最大値・最小値に注意してください。

移動・スケールどちらからやっても同じですが、ここでは移動から始めましょう。
最初に最小値が一致するように上へグラフを移動します。
目的のグラフは最小値が 0.0、このグラフは -1.0 になっていますから、 上へ 1.0 移動させます。
そのために sin(X) に 1.0 を加算します。
これによって、縦軸の最小値が 0.0、最大値が 2.0 になりました。

sin(X) + 1.0 の図

[sin(X) + 1.0 の図]

つぎに、グラフの始まりが左へ 90 度ずれているので、右へ 90 ずらします。
そのために X から 90 を減算します。

sin(X - 90) + 1.0 の図

[sin(X - 90) + 1.0 の図]

今度は、縦軸の最大値をそろえるために現在までに求めた式全体を 0.5 倍します。

0.5 * (sin(X - 90) + 1.0)
= 0.5 * sin(X - 90) + 0.5 の図

[0.5*sin(X - 90) + 0.5 の図]

最後に、グラフの終りの値をそろえて求めるグラフとぴったり重なるグラフができ上がります。
このグラフは目的のグラフの 3 倍の周期なので X を 3 倍します。

0.5 * sin(3 * X - 90) + 0.5 の図

[0.5*sin(3*X - 90) + 0.5 の図]

Maya 上でのアニメーション

上のアニメーションを Maya 上で確かめるには以下のように実行します。

  1. Polygon または NURBS の Sphere を作ります。
  2. 作った Sphere に Blinn などのシェーダーをアサインしておきます。
  3. そのシェーダーの Translucence アトリビュートの値を 1.0 に設定します。
  4. Point Light を作り、 Sphere の中に配置します。
  5. Expression Editor を開きます。
    (Channel Box からの場合)
    1. SHAPES にある pointLightShape1 の colorR を選択
    2. マウス右ボタンでポップアップメニューを開き、 Expressions... を選ぶ
  6. Expression Editor の Expression: に以下の式を書き込みます。
    colorR = 0.5 * sind(3 * frame + 90) + 0.5;
    上式で sin ではなく sind となっていることに注意してください。 なぜ sind を使う必要があるのかは、 Maya 上での三角関数 を参照してください。
  7. Expression Editor の Create ボタンを押します。
    すると、エラーが無ければ以下のように colorR のフィールドの色が変化します。
    [colorR のフィールド]
  8. このシーンを適当なファイル名で保存して、バッチレンダリングすると colorR が 120 フレームの周期で 0.0 と 1.0 の間を変化するアニメーション画像ができあがります。
    アニメーション例 (360 フレーム)

参考


Prev
Home | Contents
Mail