入力イベントとアニメーション
■ 課題
今回の課題は以下の通り。
  • 放っておいてもキューブ等のモデルが回転しつづけるアニメーションを作成してください。

  • キー入力に応じて一定時間だけ、特定の方向にキューブ等のモデルが回転するアニメーションを作ってください。

  • ウインドウの上をマウスでドラッグすることで、キューブ等のモデルを自由に回転させて閲覧できるようにしてください。

  • マウスの動きに応じた何かオリジナルなアイディアのアニメーションを作成して提出してください。必ず題を付けること。例として、シャワー(shower.c)が今日のテンプレートに入っています。

  • 「手」のモデルの関節をプログラムで計算してスムーズに変化するアニメーションを作ってください。 例えば「グー」「チョキ」「パー」への変化をキー入力に応じてスムーズに見せる。 なお、アニメーションの途中で別なキーが押されたら、即座にその状態から別なアニメーションへ推移するように。 この課題ができれば、上4つの項目はやらなくても良いです。
  • ■ 今回のヒント
    テンプレートを用意しました。今までの解答例も含まれています。

    このテンプレートには、前回終わらなかった人のために、「手」を表示し、操作するのに必要な関数がある程度用意されています。
    構造体 HandModel を利用して手の状態を管理しています。この構造体は、hand.h にあるように、createHandModel() 関数によって生成できます。 ここで得られた構造体を、putHandModel() 関数に引き渡す事で、その状態で手が描画されます。
    この構造体は、いくつか用意された専用の関数によって新しい値を任意にセットする事が可能です。 すなわち、手に新しいポーズを与えられると言うことです。

    この方法であらかじめ「グー」「チョキ」「パー」を作っている例が、handutility.c にあります。
    createHandModel2() は、createHandModel() 関数で得た構造体を指定された形状に修正して返すユーティリティです。参考にしてください。

    さて、今回最大の問題は、線形補間です。イメージとしてはある既知の二点の、変化していく重み付きの平均になります。「グー」から「パー」へ変形するときを例をあげてみましょう。

  • 「グー」×0.8+「パー」×0.2 = モデルは「グー」が少し開いて来た感じに。
  • 「グー」×0.5+「パー」×0.5 = (「グー」+「パー」)÷2 = 中間の形 (すなわち均等な平均)
  • 「グー」×0.2+「パー」×0.8 = モデルは「パー」の指が少し緩んで閉じている感じ。

    これを実現するには色々な方法が考えられますが、「グー」として与えられた各関節の値と、「パー」として与えられた各関節の値それぞれについて、上記の方法で計算してやればひとまず実現はできます。
    割合を rate と言う変数(例えば 0.0から1.0 まで変化する)で用意すれば、「グー」から「パー」へ変形するときの中間の値は以下のように書けるでしょう。

  • (グーの関節の値)×(1.0-rate)+(パーの関節の値)×rate = (中間の関節の値)

    この計算をしてくれる関数として提案してあるのが、hand.c にある interpolationHandModel() です。 実際は、HandModel 構造体は指のデータとして FingerModel 構造体を持っているだけですので、この指の構造体それぞれについてさらに、finger.c にある interpolationFingerModel() を用いると良いでしょう。 中身については各自で考察して下さい。
  • GU
    ↑「グー」の図

    (GU+PA)/2
    ↑「グー」と「パー」の中間となる図

    PA
    ↑「パー」の図

    [ 戻る ]

    Written by Yasuhiro Yamazaki, 2001.
    Modified by Youhei Nishidate, 2003.