silhouette.jpg


シルエット錯視を作ってみる

 今回は、まず、完成動画からご覧いただきましょう。



 有名なシルエット錯視と言う物を作ってみました。人形のシルエットが回転しています。上から見て時計回りに見えますか?反時計回りに見えますか?「見方によって、どちらの回転にも見える」と言うのがこの錯視の特徴です。
 どうでしょうか?両方向の回転で見えましたか?
 「繰り返し再生」みたいなのはできなかったので、1回転分の動画をコピー&ペーストして1分の動画にしてあります。
 以下、データを作成する過程で、ちゃんと色のついた画像で回転させてみるので、そっちを先に見てしまうと、その方向に回転しているようにしか見えなくなってしまうかもしれないため、先にお見せしました。


人型を作る

データを引っ張り出してみた

 まずは、人の形をしたモデルが必要です。何十年か前にX68000で初期のX-TRACEをプログラミングし始めた時に、二次曲面の組み合わせで作った人型があったはず、と思い出し、データを漁ってみたのですが、見つかりません。あの後Macを使ってから、Windows95辺りに着地しているので、さすがにX68000時代のデータが見つからなくても不思議ではないです。

 見つかったのはこれ:lady.xtw

lady.jpg

 二次曲面だった人型を、メタボールで作り直した作品。1つ1つのメタボールの形が見えてしまって、ボコボコだし、ひどいものですが……。
 まあ逆に、元の二次曲面バージョンから、素直にメタボールで埋め直して作っているようなので、ここから元の二次曲面を想像するのはそんなに難しくありませんでした。

 再現した二次曲面バージョンがこちら:lady_0.xitr

lady_0.jpg

ポーズを取らせる

 さて、ゴールはシルエット動画なので、ここから人型にポーズを取らせていかないといけません。現時点では、ポーズを取らせるのに適したデータ構造になっているとは言えません。下図の様に、構造と動かす時の起点を考えながら、データ構造を変えていきました。

model.png

 最終的な原点を腰の位置に置くことにしました。
 ポーズを取らせるときの一次変換は、任意の点を中心とした回転変換が中心になります。回転変換は、基本的に原点を中心とした回転を行うので、回転の中心となる点が原点にあった方が楽です。つまり、データを形成する過程で、部品と部品のつなぎ目(ジョイント)を意識し、ジョイントが原点に存在する瞬間を作り、その場所をコメントで明記しておきます。
 シルエット錯視の画像を参考に、近いポーズを取らせてみました。完成データの中で、「// ジョイント」というコメント行の下に、インデントなしで追加した一次変換命令が、ポーズを取らせるために追加した変換です。

回してみた

 回してみました。



 はい。普通に上から見て反時計回りしています。脚が交差したり、手が体と交差したりしますが、色と陰影がついていて、重なった場所の上下(奥行き)関係がはっきり分かるため、どう見ても逆回転には見えません。
 データの行の上の方に、以下のような記述があります。

  var sil=1;

 この変数をsil=0と設定してレンダリングすると、シルエットの画像が計算できるようになっています。


完成データ

 完成したデータです。

  Xi-TRACEデータ:lady_sil.xitr

 初め、シルエットを作るのに照明を落とそうと考えたのですが、背景となっている地面まで真っ黒になってしまって、ダメでした。結局、物体の色を決めるattr命令で、拡散反射係数と鏡面反射率をそれぞれ0にするとこで、人型だけをシルエットにすることができました。
 どうでもいいことですが、シルエット(silhouette)って、スペルで書くと難しいんですね。


home

download

gallery