Java3D ルービックキューブアニメーション

「専門じゃないので」間違っているかもしれないが、勘弁してください。「専門ではない」というのは便利な言い訳である。それは専門だろうということであっても、学問的に細かく分類するとそこは専門とは微妙に違っていたりするのである。ゆめゆめ疑う事なかれ。

広島大学理数学生応援プロジェクトというものがあって、学生がルービックキューブを解くプログラムを作りたいという。プログラムはCで作るというので、悪いことは言わないからJavaにしろと。たとえJavaを知らなくても、Cのエキスパートでない限りはJavaで作った方が楽だろうと。Javaにするなら解く時の様子をアニメーションで表示するプログラムを作ってあげようということになった。Java3Dというものは使ったことがないけど、Javaだからそんなに難しく考えなくても大丈夫だろうと。なんかAnimationっていうクラスもあるみたいだし。簡単にささっとつくって、「先生、すっげー!」という感じで尊敬の眼差しを浴びるという作戦だ。甘かった。

ソースコード

ソースコードはhttps://github.com/MSaito/RubikCubeAnimationJava3dに置いてあります。

スクリーンショットと操作説明

スクリーンショットと操作説明 は別ページになっている。

ポリゴン

Java3D はポリゴンベースの3Dグラフィックスである。なぜポリゴンベースなのかと考えると、ひとつにはグラフィックプロセッサなどのハードウェアがポリゴンベースのグラフィックをサポートしているからであるが、別の考え方をすると、アニメーションをするためともいえる。ポリゴンはアニメのためにあるのだから、Java3Dの解説をするときは、アニメまで含めて解説するべきである。そうでないと意味もなくややこしいという印象を持つだろう。

シーングラフ

Java3Dを始めると、最初にシーングラフというので戸惑うはずだ。なんじゃこりゃ。Java3Dはアニメーションを前提としている。では、3Dアニメーションでよく使う物体の中で何が最も複雑であろうか? 複雑な物体をうまく扱えるようにJava3Dは設計されているはずだ。(複雑な物体に合わせて設計しても単純な物体は作れるが、単純な物体に合わせて設計すると複雑な物体を作る時にとんでもない困難に出会うからである)そういう複雑な物体の例は、人間やロボットのようなもので、多関節オブジェクトと呼ばれる。人間が手を振りながら歩くようなアニメーションを思い浮かべて欲しい。腕を振ると腕から先は全部つられて動く。手の位置は腕に対する相対的な位置、手の動きは腕に対する相対的な動きである。こういう動きをうまく表現するにはどうしたらよいだろうかと考えると、データ構造としてローカル座標系を使用したグラフ構造がふさわしいと考えられる。それがシーングラフ。たぶん。

しかし、そういう風に複雑な物体に合わせてデータ構造を作った場合は、単純な物体を作る際にもある程度の手間がかかるわけだ。

Behavior クラス

アニメーションをするクラスはBehavior クラスを継承して作る。Java3DでAnimationと名のつくクラスはだいたい特殊化されすぎているので、一般の用途には使えない。使えればラッキーというくらいの感覚で。

参考文献: