kdenologue

たまに何か作ります。

Java3D使ってあれこれ

授業でJavaを使う課題があり、ゲームみたいなのを提出する必要があったのだが、2Dゲーム作っても面白くないかなーと思い3Dゲームを作ることにした。色々手間取ったので、情報まとめ兼メモを書いておく。

Java3D

古代の3Dグラフィックス用APIラッパー。Javaを使わなきゃならないのでこれ。
Space: Java | Oracle Community

概念の理解は以下のサイトにお世話になった。
Java3D プログラミング
有象無象:Java3D > 視点

IDE

大学の環境はがんじがらめで不便だが仕方ない。Linuxで動くインストール不要のポータブル版があるIntelliJというのを使った。
IntelliJ IDEA the Java IDE

おうちPCではEclipseを使った。実はHelloWorldくらいでしか使ったことない。
Eclipse - The Eclipse Foundation open source community website.

IDEからJava3Dを使えるようにしなければならない。IntelliJの方は何をやったか忘れた。。。Eclipseは以下のサイトを参考にした。今気づいたけど3つめのURLのドメインにびっくり。

Java 3D で地球を回してみるテスト - CX's Hatena Blog
EclipseでJava3Dを使おう!: Turboでめきん++
Java3D を Eclipse で使えるように設定

3Dモデル読み込み

3Dゲームなのだから3Dモデルを用意しなければならない。たまたまパソコンに入っていたAutocad 360を使ったが、あまりオススメしない。Java3DはOBJ形式とlws形式が読めるのだが、Autocad360は直接出力に対応してない。A360 Driveというクラウドストレージ上でOBJ形式に変換ししてダウンロードという手間がかかる。

Eclipseのファイル指定は以下のサイト。
Eclipseでパスの指定方法にハマった。 - OYDY

ファイル指定ができたら以下のサイトを参考に読み込み部分を書いてみる。
OBJ ƒ‚ƒfƒ‹‚ð•`‰æ
Java3Dで3Dモデルを読み込むテスト - ソフトウェア開発したい日記
Atsushi's Homepage ` ƒ‚ƒfƒ‹‚̓ǂݍž‚Ý

ひとつハマったところがあって、何故かOBJファイルが読めなかった。ArrayIndexOutOfBoundsExceptionとか出ちゃう。
[JAVA3D-142] ArrayIndexOutOfBoundsException using obj loader - Java.net JIRA
ここにあったhammerhead4.objは読めたので、自作した3Dモデルと中身を直接比較(テキストエディタで.objを開く)してみたところ、vtとvnのキーワードが悪さしてると判明。手で消してどうにかした。参考: OBJファイルフォーマット

APIのリファレンス読むと別に対応してないことなさそうなんだけどな。

テクスチャとかMaterialの設定は時間がなかったため行わず。

当たり判定

結局3Dモデル同士の当たり判定は利用しなかったが、動作確認はした。
Collision Detection with Java3D - Java Tips

当たり判定が発火したときにEnumeration型でリストがもらえるのはいいんだが、もらえる内容がなんのObjectを指してるのかよくわからずじまい。希望としては、読み込んだ3Dモデルのポリゴンそのもので当たり判定が発生することなんだけど、結構発表まで切羽詰まっていたため、別の方針に転換。結局シンプルにモデルの座標だけに落ち着いた。

JARファイル出力

実行可能なJAR形式で提出する必要がある。とりあえず、Java3Dを含んだ形式での提出をするべきだと判断。外部ライブラリを含む形式での出力、Eclipseではよくわからなかった。以下のサイトを参考にしてまとめる。
エクリプスのプロジェクトからJARファイルを作る。 – よしまさの作業部屋

もう一つ、先のEclipseでのファイル指定方式だとJARで実行させるとファイルのURLがわからずエラーが出て動作しない。同じく以下のサイトを参考に条件分岐を作成。
jarファイルにするにあたってソースを改変する部分 – よしまさの作業部屋

ファイルのパス指定、こちらは未確認だがこういう解決策もあるらしい。
jarにする時の注意:リソースはURL指定
EclipseでgetClass().getResource("ファイル名")でnullが返るのはなぜか - ねぎみそらぼ@はてな


色々手間取ってしんどかった。ただ、チーム制作ということでそこそこいい感じに負荷が分散して作品はできたので良かったと思います。