Main

2008年10月:今月のプロジェクトで紹介されました!

3DCGのプログラミングに興味のある人は「For プログラマ」 を,3DCGのデザインに興味のある人は「For デザイナ」を読んで下さい.

For プログラマ

デザインはデザイナーにまかせよう

3DCGアプリケーションには「モデリング」「テクスチャ」「アニメーション」「ライティング」「効果音」などの要素が含まれます.これらを一つのファイルに収めることができるようにしたものがAcerola3Dフォーマットです.

Acerola3Dフォーマットを用いて「モデリング」「テクスチャ」「アニメーション」「ライティング」「効果音」をデザイナに一括して作成してもらうことによって,プログラマがアーティスティックな部分に一切手を付けることなしに質の高い芸術的効果を簡単にアプリケーションに取り込むことができます.

例えば,「ウィザードがサンダーの魔法を使う」場合にはキャラクタが杖を振り下すアニメーションと同時に稲妻を光らせ雷鳴をとどろかせる処理が必要ですが,これを全て Acerola3Dファイルから読み込んでメソッド一つで呼び出せるようになっています.また,一つのファイルの中に歩く,走る,攻撃,魔法などの複数のアクションを含めることが可能で,これもプログラムから簡単に切り替えることができます.さらに,3D空間を明く照明したい時にも3D空間に光源を生成するAPIを用意するかわりに蛍光灯オブジェクトや太陽オブジェクトを読み込んで配置するという操作で代用します.このようにAcerola3Dファイルを読み込み,3D空間に配置してアクションを切り替える処理だけで3DCGプログラムを作成してしまうというコンセプトになっており,プログラミングの初心者でも気軽にトライしてもらえると思います.

現在はJava3Dを用いた実装しかありませんが,適切なAcerola3Dファイルが利用できれば魅力的な3DCGアプリケーションをJavaで簡単に開発できるようになるでしょう.

HelloWorld的プログラム

まず,Acerola3Dを使った一番簡単なサンプルプログラムを示します.

import jp.sourceforge.acerola3d.a3.*;

public class HelloA3 {
    public static void main(String args[]) throws Exception {
        A3Window window = new A3Window(300,300);
        Action3D a3 = new Action3D("x-res:///axis.a3");
        window.add(a3);
    }
}

axis.png

Java3Dを直接使用する場合や,OpenGLを使用する一般的な3DCGプログラミング環境で必要な,細かな設定やセットアップが省略されています.簡単な記述でのプログラムでは当然制限も出てきますが,後述するように高度な3D処理が必要な場合には既存のJava3Dのプログラムの中にAcerola3D の機能を組込むことでJava3Dの全機能を使ってプログラムを作成することも可能です.

あとは以下に示す数個のメソッドを覚えれば3Dオブジェクトのコントロールはもちろん,効果音の再生や,ライト(光源)の配置,ダイナミックな視点の移動など,Acerola3Dのほとんどの基本機能が使いこなせるでしょう.

  • Action3D.change(...)
  • Action3D.setLoc(...)
  • Action3D.setRot(...)
  • A3Window.del(...)
  • A3Window.setCameraLoc(...)
  • A3Window.setCameraRot(...)

もうちょっと高度な例

Acerola3Dの機能を使って少しだけゲームっぽいデモプログラムを作成してみました.

import jp.sourceforge.acerola3d.a3.*;
import java.awt.event.*;
import javax.vecmath.Vector3d;

public class Demo extends KeyAdapter {
    static Action3D a3;
    static Vector3d loc;
    public static void main(String args[]) throws Exception {
        A3Window w = new A3Window(500,300);
        w.setNavigationMode(A3CanvasInterface.NaviMode.WALK);
        w.addKeyListener(new Demo());
        w.setCameraLocImmediately(0.0,1.0,5.0);
        Action3D back = new Action3D("x-res://background7.a3");
        back.setSoundGain(0.1);
        w.setBackground(back);
        a3 = new Action3D("x-res:///footfalls.a3");
        loc = new Vector3d(0.0,0.3,0.0);
        a3.setLoc(loc);
        a3.setEnableBehavior(true);
        a3.setAutoDirectionControl(true);
        a3.setAutoActionControl(true);
        w.add(a3);
    }
    public void keyPressed(KeyEvent e) {
        double speed = (e.getModifiersEx()&KeyEvent.SHIFT_DOWN_MASK)!=0?0.15:0.05;
        switch (e.getKeyCode()) {
        case KeyEvent.VK_RIGHT:loc.x+=speed;a3.setLoc(loc);break;
        case KeyEvent.VK_LEFT: loc.x-=speed;a3.setLoc(loc);break;
        case KeyEvent.VK_UP:   loc.z-=speed;a3.setLoc(loc);break;
        case KeyEvent.VK_DOWN: loc.z+=speed;a3.setLoc(loc);break;
        }
    }
}

モデル・サウンド提供

たったこれだけのプログラムですが,キーボードでキャラクタを動かし,マウスでカメラをコントロールできます.特に以下のポイントに注目してみて下さい.

  • 背景に動的な物,BGM,スカイボックスなどが含められる.
  • KeyPressedイベントで座標を変更しているけど補間が効いて いるのでカクカクしない.
  • キャラクタの向きが自動でかわる
  • キャラクタのモーションがスピードに応じて自動的にかわる
    • これを可能にするためのアクション名や適切なスピードの 数値がファイルのメタデータに埋め込まれている (そのデータなどはプログラムで上書することも可能)
  • キャラクタの足音がキャラクタの距離に応じて減衰し, 方向に対応したパン(左からの音は左から聞こえて,右の音は右から 聞こえる)が設定される.
  • 様々な組込みのマウスナビゲーションが一行で設定できる.

キャラクタの向きやアクションの自動制御ははこのデモの場合には効果的なので有効にしていますが,もちろん自分で全てをコントロールすることも可能です.

このプロジェクトで提供しているライブラリを用いると,ゲームなどで重宝する様々な機能が簡単に実現できます.その他の機能としては以下のような物があげられます.

  • 全画面表示機能,Widget機能,マルチキャンパス機能
  • 吹き出し表示機能
  • 着せかえ(武器かえ)機能
  • ピッキング
  • 複数のシーンの生成と切り替え
  • 2D,3Dのユーザインタフェース表示機能
  • モーションの動的な書きかえ
  • その他たくさん

今すぐ試してみたい人

上のプログラムをコンパイルして実行するために必要な物一式をまとめてみました.

最新のJavaJDKがインストールし,javacコマンドなどが使用できるようにPATH環境変数を設定しておいて下さい.以下の圧縮ファイルを解凍すると出てくるバッチファイル (MacOSXの場合は.commandファイル)をダブルクリックすると上のプログラムをすぐにコンパイル,実行することができます.

Acerola3Dのライブラリは環境ごとに用意されていますが,入っているデモプログラムや3Dファイルはどれも同じです.つまりマルチプラットフォームな 3Dアプリを簡単に作成できます.(Linux版は用意しませんでしたが,同様に作成できます.)実行が上手くいったら,プログラムを変更してみたり,3Dオブジェクトファイルを交換したりして遊んで下さい.

プログラミングの詳細は 解説のページを参照して下さい.

高度な応用

初心者用の利用方法だけ紹介してきましたが,Acerola3Dは既存の複雑なプログラムの一部として組込むことも可能です. Action3Dクラス(のスーパークラスのA3Object)のgetNode() メソッドを使うとjavax.media.j3d.Nodeオブジェクトが得られ,これをJava3Dのシーングラフに加えることで既存のJava3D プログラムの中にAcerola3Dの3Dオブジェクトを加えることができます.例えばスクリーンショットのページのページにあるように, Project Looking Glass(LG3D) に組み入れたり, NyARToolkit for Javaを利用して拡張現実(AR)上に3Dオブジェクトを表示できたりできます. Acerola3Dパッケージの提供する機能で不十分な場合は Acerola3Dパッケージの必要な部分だけを利用して残りを自分で作り込むことで高度な応用にも利用可能です.

よくJava3Dでは本格的な3Dゲームを作成することはできないと言われますが,実際の3D表示はネイティブなOpenGLやDirextXを使用するのでそこそこのスピードは出ますし,開発が容易でマルチプラットフォームにできるなどの利点もあります.また,スピードや特殊なレンダリングは必要ないけど3Dでなければ表現・実現できないアプリケーションというのは数多くあると思います.是非,あなたの優れたアイディアをAcerola3Dで実装してみて下さい.

利用できるAcerola3Dファイル

現在,利用することができるAcerola3Dファイルは,このサイトで公開している サンプルのみという状況です(2008,秋現在).デザイナが自分の作品を Acerola3Dフォーマットで公開してくれるように宣伝してゆきたいと思っているので,今しばらくお待ち下さい.公開されているAcerola3DファイルがあればこのプロジェクトのWikiの利用報告のページ(UtilizationReports)にて,紹介してゆきたいと思っています.

その他の3Dフォーマットの読み込み

Acerola3DのJavaライブラリではVersion2.36から Acerola3Dフォーマットのファイルだけでなく,Neverwinter NightsのMDLフォーマットやQuake 3の MD3フォーマットのモデルなども読み込み可能になりました.これらのフォーマットの読み込みに関しては以下のページを参照して下さい.

実際のプログラミング

実際のプログラミングを始めるにあたり,プログラミングの環境をセットアップする方法や,プログラミング方法を説明したドキュメントを作成しました.Acerola3Dの機能を一通り解説していますので,是非参照してみて下さい.

もう少し実用的なサンプルプログラムが欲しい人は以下のページも参照してみて下さい.

For デザイナ

自分の作品の公開

自分のウェブページに以下のタグを貼り付けて「Acerola3Dファイルの指定」の部分だけ編集して,自分で作ったAcerola3Dファイルと一緒にアップロードすれば,自分の 3Dキャラクタを公開できます.

<script src="http://java.com/js/deployJava.js"></script>
<script>
deployJava.runApplet({code:'jp.sourceforge.acerola3d.a3applet.A3Applet',width:'530',height:'420'},
{jnlp_href:'http://acerola3d.sourceforge.jp/jws/A3Applet/a3applet.jnlp',a3url:'Acerola3Dファイルの指定'},'1.6');
</script>

実態はJavaアプレットなのですが,Deployment Toolkitというツールを使ってJavaScriptで埋め込んでいます.アプレット本体はこのサイトで公開している物を参照するだけなので,アプレット自体は自分で用意する必要はありません.サンプルはこちらで確認できます.

Acerola3Dフォーマットのファイルにはコメントなどのメタデータを保存することができるので,作品の説明,作者の紹介,ライセンスなどを自由に書き入れておけます.

もしAcerola3Dフォーマットのファイルを作成して公開したら,是非このプロジェクトのWIkiの利用報告のページ(UtilizationReports)にリンクを作って下さい.

Acerola3Dの表現力

ごめんなさい,スキンメッシュの機能は無いです.でも以下の機能は様々な応用を可能にしてくれるでしょう.

  • モーション情報(複数も可)
  • 効果音
  • ライト(光源)
  • 複数のキャラクタデザインを 含められる
  • VRMLの持つ表現力
    • テクスチャ
    • 透明度

ジオメトリだけでなく,モーションや効果音ライティングなど総合的な表現を含めることができます.キャラクタだけでなく,魔法などのエフェクトを作って入れておくことが可能です.

Acerola3Dの表現力を実際に確認するためのサンプルファイルを作成しています.まだ解説が書ききれていませんが,以下のページを参照してみて下さい.

再利用性と3Dオブジェクトの規格

現在,まだ実用的なレベルには到達していませんがAcerola3Dのメタデータには,作成されたファイルの再利用性を促進する仕組みを導入しています.我々はその仕組みのことを 3Dオブジェクトのプロファイルと呼ぶことにしました.これは作成された3Dデータがどのような条件を満す物なのかを明示する方法です.

ゲームや3Dアプリケーションの中で3Dオブジェクトを利用するには,大抵なんらかの条件を満している必要が出てきます.それは,そのオブジェクトの大きさであったり,必要とされるアクションの種類であったり,おおまかなポリゴン数であったりするでしょう.

プロファイルはゲームやアプリケーションが必要とする3Dオブジェクトの条件を主にプログラマ側から指定する方法で,このプロファイルに従って 3Dキャラクタやオブジェクトを作成することで,多くのゲームやアプリで再利用できるようしようという仕組みです.さらには,これらのプロファイルは特定の団体や人物が独占的に制定するのではなく,コミュニティが自由に作成して公開することができるようにし,多くのユーザの支持を得た良いプロファイルが普及して広く使われるようにすることで,自然発生的にデファクトスタンダードが形成されるようにしたいと思っています.これを可能にするためにセマンティックウェブの考え方を取り入れています.

これはAcerola3Dフォーマットだけの話ではなく,3Dオブジェクトファイル全般に適用可能な考え方で,かなり大風呂敷ではありますが, 3Dゲームや3Dアプリ開発をにおけるプログラマとデザイナの架け橋となる技術になればと思っています.

キャラクタファイルだけじゃない

現在「アイコン」のファイルフォーマットとしては普通に PNG(Portable Network Graphics)やICO(MS Windows Icon Graphics)を使いますが,近年ではベクター形式のSVG(Scalable Vector Graphics)も使われ始め大きくて美しいアイコンが利用できるようになりました.さらにここ数年3Dデスクトップの進展も目覚しいものがあるので,次のアイコンは3次元形式…ということもありうるかもしれません.

Acerola3Dファイルは,ゲームのキャラクタを保存する形式として考え出されましたが,次世代の3Dデスクトップなどで利用される 3Dアイコンフォーマットとしての活用も視野にいれています. 2Dアプリケーションではjavax.swing.JButtonのような物は基本的な GUIですが,Acerola3Dを使えば3Dアプリケーションでも見栄えの良いボタンが簡単に作成できるようになります.

オーサリング

Acerola3Dフォーマットは既存のフォーマット(VRML97とBVH)を ZIPでかためただけの簡単なものです.VRML97とBVHを作成できる 3DCGソフトがあればWindowsでもMacでもLinuxでも作成可能です. (ちょっと無理をすればテキストエディタだけでも作れます.)

ただ,これら(VRML97やBVHなど)を統合してAcerola3Dファイルにする部分は面倒な作業となるので,その作業をサポートする A3Editorという名前のオーサリングツールを作成しました. (これは,最後の作業をサポートするだけの簡単な物で,実際の作業の殆どは既存の3DCGソフトを使ってもらうことになります.)

実際にAcerola3Dファイルを作成してみたい人はドキュメントのフォーマットのページを読んでみて下さい.