title: Acerola3D ChangeLog

2012,12/11
========================================

Java3D 1.5.2のバイナリの配布物には何か独自のライセンスが
同梱されているのですが、よくよく調べるとJava3DはGPLだと
いうことに最近気が付いたんで、Acerola3DもGPLで配布する
ことにします。

厳密なことを言えば1.5.2の配布物に入っているライセンスでも、
変更して配布するのはダメなのかもしれず、悪意は無いにしても
Zバッファのパッチをあてていたのも良くなかったかもしれない。
GPLだったというのも良く調べればわかったはずだけど、バイナリの
配布物の中に入ってるのがGPLのライセンスじゃないので何か変じゃ
ないっすか?今日はとりあえずSubversionリポジトリ、ソース配布物の
範囲での修正。後日リリースする時に全部修正しないといけない。
Webページの方の修正もしないと。

前からLGPLで公開してしまっているので、今さらかえてもダメかも
しれないけど、そのままにしておくよりは良いと思うんで。。。

2012,12/04
========================================

PickingBehaviorのlphysicalCSToVirtualCS(Point3d)
とvirtualCSToPhysicalCS(Point3d)の引数が内部で書き換え
られてしまうバグを修正。これらのメソッドは他のメソッドからも
利用されているので間接的に他のメソッドも修正されることになる。
10/28の時と同じ系統のバグだなぁ。他に無いといいけど。

2012,10/28
========================================

A3ObjectのRevをVector3dでセットするメソッドにバグがあった
ので修正。(引数でわたしたVector3dを書き換えてしまっていた。)
それから、A3CanvasInterfaceにカメラをRevで操作するメソッドを加えて
実装した。いつものように、この実装部分は設計のまずさにより膨大な
作業量なのでバグがないかのチェックが必要。

2012,07/12
========================================

06/26のmulRev(...)の件だけど、たんにテストプログラムの間違いだったorz。
いらないかもしれないけど、Utilクラスにrev2rotとrot2revという
staticメソッドを付けた。一応一段落かな。

2012,06/27
========================================

昨日のサウンド関係の修正だけではたぶんだめ
だったので，追加の修正をした．初期化されな
かった場合は意図的にA3SoundSystem.al=nullと
しておいて，多くのメソッドの最初に
「if (al==null) return;」みたいなコードを
入れた．まにあわせてきだけど一応だいじょぶっぽい．
正しくはどうするのか．．．？ちなみに初期化失敗を
再現するためにlinux上で「libjoal_native.so」を
削除して無理矢理エラーを発生させてテストした．

mulRev(...)の件はまだ手をつけていない．

2012,06/26
========================================

本当に久々の更新。今まで、サウンド関係の初期化に失敗してAcerola3Dが
起動しないということがあった。なので、A3SoundSystemの初期化の時に
RuntimeException(具体的にはnet.java.games.joal.ALException)
がスローされた時に、これをキャッチしてシステムが終了
しないようにした。ただし、手元の環境で再現できていないので
まだまだテストが必要。

それから、より初心者に使ってもらえるように、
A3ObjectにsetRev(Vector3d)などのメソッドを
追加して、ラジアンではなくデグリーで角度を指定できるように
した。しかし、mulRev(...)をテストしてみたら、自分が思って
た角度の半分しか回転してくれないバグが発生。mulRot
でも同様なので根本的な間違いがあるみたい。でも、とりあえず
コミットして続きは後で。。。

2011,10/29
========================================

久々の更新．Action3D.getActionName(int)が
未実装だったので実装した．なんで未実装だったか
不明．

2011,07/13
========================================

昨日の件、やっぱりあきらめきれなくて再考してみた。あまり
良い解決策ではないけど、一応振動はなくなった。揺れの原因の
大部分は、一つのAction3Dオブジェクトに関連付けされている
A3BehaviorとActionBehaviorの起動の順番が、前後すること。
これはtransControlUsingRootBone==trueな場合のみの話だ
けど、ActionBehaviorで計算されたオブジェクト座標が、ActionBehavior
起動後に、A3Behaviorが起動後すれば上手く反映されるけど、
逆の場合は次のフレームにで反映されるというのが理由。そこで、
ActionBehaviorの中で対応するA3Behaviorのメソッドを呼び出して
絶対反映されるようにしておいた。A3Behaviorの処理が重複することに
なるので無駄が生じるけど、これで解決する。まにあわせの対応なので
なんとかしたいところだけど、かなり根本的な設計の変更になるので、
難しいところ。

本当はCameraBehaviorとの同期も必要な気がするけど、なぜか
影響は無いっぽい。影響があったとしても補完されているので、
大きな揺れにはならないはずなので、とりあえずActionBehaviorと
A3Behavior間の対策だけにしておく。

2011,07/12
========================================

先日のinsertTaskIntoRenderingLoop()では
a3testにある簡単なテストプログラムなら大丈夫だけど
重いプログラムでは、上手くいかないことが判明。
それならばということで以下を追加。

* A3CanvasInterface.insertTaskIntoTimerLoop(Runnable task);
* A3CanvasInterface.removeTaskFromTimerLoop(Runnable task);

これはAcerola3DでメインとなるBehaviorのTimerBehavior
のprocessStimulusメソッドの中からRunnableを実行する実装に
なっている。

これをテストしていて気がついたのだが、発生する揺れには
2成分あって、常に細かく振動している揺れと、数秒間に1回
程度で少し大きくずれる揺れがある。実はこの細かい振動は
ChaseControllerなど内部でThreadを生成しているA3Controller
が原因だった。なのでこれらをThreadでなく今作ったばっかりの
insertTaskIntoTimerLoop()などで実装しなおしたら
細かな振動はなくなった。

そして、数秒おきの大きな振動も今回のAPIを使ったら直るか
と思ったけどだめだった。MacOSXでしか試してないけど、
再現性のないバグで、ごく稀にOKでほとんどはダメだった。
a3testの方でなんとか再現できないか負荷をかけてやってみたけど、
こっちでは問題がおこらない。さらに良く調べてみたとろこ、
複数あるJava3DのBehaviorの起動の順番が、毎回ちょっとずつ
異なることに起因するみたいだ。これはBehaviorを大胆に統合
するなどの大規模な変更が必要そう。とりあえず、今はこれが
精一杯。

2011,07/09
========================================

どうもJava3DのWakeupOnElapsedTimeでは本当に正確に
定期的な呼び出しができないみたいで、先日のwaitForUpdate
メソッドでも上手くいかない場合があるみたい。
そこで、レンダリングループに独自の処理を割り込ませるための
APIを提供することにしてみる。

* A3CanvasInterface.insertTaskIntoRenderingLoop(Runnable task);
* A3CanvasInterface.removeTaskFromRenderingLoop(Runnable task);

この実装はJava3DのCanvas3DのpostSwap()の中からRunnableを
実行することで実現している。
ユーザに内部の実装を意識させるAPIなので作りたくはないAPIだった
けど、実用的なことを考えると便利ではある。

ただ、今回の問題を解決するのに使えるかなぁ？

2011,07/05
========================================

特にJBulletの物理計算などでコントロールされている
物体をCHASEナビモードでカメラがおきかけるような場合、
物理計算と、表示のスレッドの同期が行われていないと、
けっこうカクカクしてしまう。一応これの解決策として
A3CanvasInterface.waitForUpdate(long timeout);
を追加した。これは、このライブラリの多くのオブジェクトが
同期をとっているTimerBehaviorの起動の時までwait
して、そのタイミングで復帰するメソッド。
TimerBehaviorは
A3CanvasInterface.setUpdateInterval(long t);
でコントロールする。

ほんとうは、このメソッドで復帰した瞬間からJava3Dの
処理が始まるので、復帰直後少し待ったほうが良いかも
しれない。マルチスレッドだから、細かいとこまで
考えるとやっぱり面倒なこともででくる。でも、そこまで
追求する人なら使いこなせるはず。

2011,06/15
========================================

06/07の件原因は、またしてもjavax.vecmathパッケージの
3x3行列の処理の実装の問題が大きいみたいだ。自前実装の
Util.matrix2quat()のfloat版を作成してこれを使うことに
したら症状がだいぶ改善された。実際クリティカルな計算なので
完治はしなかったけど、今回はこれで勘弁してもらうことにする。

2011,06/07
========================================

ActionBehavior,CameraBehavior,SubCameraBehavior,
のprocessStimulus()内とA3Behavior内のsetNow()内で
TransformGroupにTransform3Dをセットしている所で
BadTransformExceptionが発生して停止することがあったので、
とりあえずキャッチして停止しないようにした。
原因はこのライブラリの外だと思うけど停止しないように
しておくのは適切だと思う。

2011,05/14
========================================

WindowsのCommandPrompt.batをCommandPrompt32.batと
CommandPrompt64.batに変更。それだけ。
時間がなくて更新できんなぁ。

2011,04/15
========================================

コードは全然変えてないけど、TODO.txtに項目を追加した。

2011,03/16
========================================

実際には2011,01/23にやっていた作業だけれど，
完全な対処方法ではないので，どうしようか
迷っていた．でも，完全でないけど大抵の場合は
有効だと思うので，この変更を反映させることにする．

NeverWinterNightsのJava3Dローダの話なんだけど，
読み込んでみると，どうもいつもテカテカ
しているので調べてみると，Modelという
クラスのisMetallic()というメソッドの
返り値が変なんじゃないかという気がする．
しかもisMetallic()がtrueを返すと．
chrome1.tgaという画像ファイルが必要に
なり，これがNWM.jarには含まれていない．
で，この問題は自分が見たモデルでは
かなり，頻繁におこる．

この問題に一時的に対処するためにNWM.jarを
作りなおした．コンパイルするのにJava3D以外の
何だったかにも依存していてけっこう大変．
二つ変更がある．1)Model.isMetallic()の返り値は
常にfalseに変更．2)念のためNWN Model Viewerに
同梱されているchrome1.tgaと，W_metal_tex.tgaと
blur_01.tgaが含まれている．

Model.isMetallic()の本来の機能が再現できれば
いちばん良いのだけど，そこまでは行けなかった．

2011,03/11
========================================

A3Filterの件a3testの方でいろいろ試したところ、
300x300ぐらいの表示では、何も考えずに使えそうだけど、
それ以上の表示の場合、何らかのアクセラレーションが効くような
フィルタでないと非常に重くてFPSが出ない。でもアクセラレーション
が効くフィルタなら使えなくも無いという感じ。視覚効果としては
面白いものが作れる。

それからマウスのイベントが処理されない問題も一応対処。
原因はPickingBehaviorの中にあった。eventMakerというやつ
が正しく設定されていなかった。でもMacOSXでは依然、マウスイベントが
どっかに横取りされることが50%ぐらいの再現率で起きる。

あと残りの問題は、TransCanvas3Dが重いこと。
TransCanvas3D.paintComponent()内のcanvas.waitForSwap();
とかcanvas.stopRenderer();canvas.waitForOffScreenRendering();
canvas.startRenderer();あたりが悪いという検討はついている。
環境依存なところがあると思うので、十分テストして実装するべし。

2011,03/10
========================================

03/08に作成開始したフィルタ処理だけど，
一応の実装はできた．でも，実用的なスピードが
出るのか，あやしくなってきた．フィルタの書き方が
悪いだけか？どうだろう？

2011,03/08
========================================

Youtubeでゲームのプレイ動画とか眺めていて、あったら
結構使えそうだと思ったので、3D表示を行う前にフィルタ
処理を行うことを可能にするための拡張を書きはじめた。

変則的だけどJA3Canvas2というテストのためのクラスを
導入して、これで上手くけばJA3Canvasと置き換える作戦。
また、JA3Canvas2の実装にはTransCanvas3Dクラスと
同様なクラスが必要なのだが、新しクラスを作るのではなく
TransCanvas3Dを拡張することで対応させることにする。

でも、まだ拡張のための準備が終っただけの段階。

2011,03/03
========================================

A3CanvasInterfaceを実装するオブジェクトに
pick(Vector3d origin,Vector3d dir)メソッドを
追加した。いろいろ使い道はあると思う。

2011,03/01
========================================

昨日のバグ、なんとか回避。根本的な原因はBehaviorの
initialize()メソッドの中でシーングラフの構造を変更する
処理をしていたからだと思う。いや、もっと正確には簡単な変更は可能
だけど、特殊な変更はダメということみたい。具体的には、Behavior
のinitialize()の処理中に、新しBehaviorが追加されると、
Java3Dの実装の中でArrayListのループ処理中にそのArrayListが
変更されておかしなことになるということみたい。

それでinitialize()でシーングラフを変更しないように変更して
みたら、表示はできるようになった。でも最初の表示の時に確実に一瞬ちらつく。
ならば、なるべく早くってことで、WakeupOnElapsedTime(1)でやってみたら
多少症状は改善されたけど、やっぱりちらつくことが多い(MacOSXにて検証)。
実際もともとちらつくことがあるので追加した処理だったはず。
ちらつくってのをもう少し正確に説明すると、Action3DがA3Window
などに追加される前にchangeしてある場合、表示された最初の一瞬だけ
デフォルトのアクション(アクション番号0のアクション)が表示されて、
その後に実際にchangeしたアクションが表示されるという物。

あきらめるな！！！ってことでさらに改良、A3Objectには
component2DContainerという変数があって、A3Windowなどに追加された
時に登録される。この変数を、そのA3Objectがシーングラフに追加されて
いるかどうかの判定にも使用するものとしてA3Object.dispose()を修正。
そして、ActionBehavior.change()とchangeImmediately()の中で、
このcomponent2DContainerがnullかどうかを見て、nullの場合はその場で
シーングラフを直接変更する処理を追加した。いちおう、これで問題は全て改善
されたと思うけど、いろいろチェックするべし。

ついでにAction3DにsetBalloonLocAll()とsetBalloonDirAll()を追加して
全てのアクションの吹き出しを一括で変更する機能を追加した。

2011,02/28
========================================

SimpleDCを作って発覚したわけだけど、実際に着せ替え、
武器替え機能を使おうと思ったらAction3D.setShape()
だけでは大変すぎる。なのでAction3Dに以下のメソッドを
追加してみた。

* getShapeFilenames()
* replaceShape()
* replaceShapeWithA3()
* shapeChange()

SharedGroupの問題で、Action3Dを使いたい場合には
一般的にアクションの個数分のインスタンスを生成して、
それぞれ追加する実装になっており、スマートさに欠けるけど、
今のところしょうがない。

それは良いのだけれど。重大なバグが発覚！！！！！！！！！
Action3D.change()の実装をSwitch実装から、addChild,
detach実装に戻した時点で、着せ替え機能が正常に動作しなく
なっていた！！！！！！！！！！気が付くのが遅い！！！！！
詳細はまだ調査中だけれど、非常に嫌な感じがする。

2011,02/26
========================================

Action3DData.javaで，生成されているAction3Dの
シーングラフに余計なTransformGroupが入っていた．
それもパーツごとに入っていたので，かなり無駄だった．
これを削除した．

2011,02/24
========================================

このAcerola3Dライブラリをそのまま簡易開発環境として
利用することができるようにするためのファイルを追加した。
オープンソースのJDKも出てきていることだし、JDKをバンドル
できるようにするための設定も含めてある。でも、まだ全然
テストしてない。実際テストしてみるべし。これ、誰か活用して
くれないかなぁ。

2011,01/21
========================================

Action3Dの音声の位置・回転などの情報が
反映されない場合がある気がついた．
良く考えたらAction3D.change(...)で，音声の
位置や回転をセットしてやらないといけない
ことに気がついた．ActionBehavior.javaを
変更して対応したら，一応上手くいっている
みたい．他に影響がないか，また確認するべし．

2011,01/12
========================================

A3EyeとA3VideoCameraを追加した．これらは，
仮想空間内に配置することで，配置した視点
からの視野をBufferedImageとして取り出すことが
できる物．A3Eyeの方はjavax.media.j3d.Nodeの
サブクラスで，A3VideoCameraの方はA3Objectの
サブクラス．これ(特にA3Eye)を作った意図はロボット
シミュレータを作成した時の，ロボットビジョンを
シミュレートできるようにするため．

なかなかいいかんじ．

2011,01/02
========================================

Action3D.transControlUsingRootBone(boolean b)
というメソッドを追加した．このメソッドで
trueを設定すると，BVHなどのMotionデータの
ルートの骨の情報を，Action3D内部のTransformGroupに
適用するのではなく，Action3D全体の変換として
適用するようになる(setLotメソッドとかと同じ所に作用)．
互換性のためにデフォルトはfalseにしてある．
aloreca3dではデフォルトtrueだな．

これにより，Action3Dを完全にMotionオブジェクト
だけでコントロールすることが可能になる．
ちょっと試してみたところ，上手くいっている
感じ．単純な改良だけど，かなり興味深い改良
なんじゃないかと思う．ただCHASEナビゲーションと
組合せると，なんだか少しガクガクする．
このへんは調査して改善すべし．

(2011,01/04追記)うぅぅん。。。メソッド名を
setRootBoneControlからtransControlUsingRootBone
に変更した(上の文章も書きかえた)。このあたりはaloreca3dでは
A3ObjectのsetAutoDirectionControlとかなんかとあわせて
整理しないといけない。それから良く考えたら上の文章で書いた
「aloreca3dではデフォルト」ってのはダメだね。

2010,12/30
========================================

Util.makeBvhTriangleMeshShape(Node n)と
Util.makeConvexHullShape(Node n)の両方で，
SharedGroup(Link)の処理を修正．具体的には
SharedGroupが使われている時に，その中の
Shape3DなどではgetLocalToVworldメソッドが
意図どうりの値を返さず，たぶんSharedGroup内
における座標が返される．なので，SharedGoup
外のTransform3Dをわたして合成することで対処．
たぶん上手く行っている．SharedGroupが入れ子
でも大丈夫のはず．

でも，Action3Dは，骨による配置が行われるのが
A3CanvasInterface.add()以降なので，Action3D.getNode()
でえられるNodeは，一般的には使えないだろう
ということも判明．とりあえず，これは
しょうがないなか．

2010,12/24
========================================

Util.makeBvhTriangleMeshShape(Node n)メソッドを作成．
まだまだ足りないところはあるけど，一応動くところまで
到達．これは使える機能になるはずなので，どんどん
改良してゆくべし．
Util.makeConvexHullShape(Node n)メソッドもちょっとだけ
修正．

2010,12/15
========================================

JBulletの更新に対応していなかったので対応。実質使ってないので、
問題がないけれど。見落していた。

2010,11/26-2
========================================

そういえば、チケット#23701のバグのことをここにメモしてなかったのでコピー。

-----

同じa3ファイルから生成したAction3Dを同時に表示し、
その中のいくつかをA3CanvasInterface.del(A3Object)でデタッチ
した時に、残りのオブジェクトが時々表示されなくなる。
なんとなく表示判定のカリングがおかしくなっているような気がする。
症状を詳しくメモしておく。

 * いつでもおこるわけではない。
 * Windows,MacOSX,Linuxの全てで同じ症状
 * 特にメッシュ数が多いオブジェクトで頻発するみたい。
 * カメラの方向を変えると、出たり消えたりするので、
   カリング判定がおかしくなっているのかもしれない。
 * a3ファイルの読み込み前に毎回Action3Dのキャッシュを
   クリアすれば発生しないので、!SharedGroupあたりの扱いに
   関係しているかもしれない。
 * 全然移動しないオブジェクトではバグが発生しないのかもしれない
   (正確なところは未確認)。そうだとすれば!A3Object.setLoc()
   あたりに問題がある可能性もあるかも。
 * 今思いついたのだけれど、バグが発生するものとしないものがあるのは、
   シーングラフへのオブジェクトの追加の順番が関係しているのかも。
   要確認。

チケット#22338(表示されない要素)と関係があるかどうかも
知りたいところ。

-----

このバグの件で、もっと早くにチェックするべきだったけど、Switchを使った
アクションの切り替えでなくaddChildとdetachを使った実装にしたら、
100%ではないものの、かなり症状が改善されることが判明。100%ではない
のでSwitchが悪いとも言いきれないが、せっかくSwitchに完全以降できると
思ってたので残念。なので、また、Switchの実装とaddChild,detachによる
実装を両方書いておいて簡単に実装を切り替えられるようにしておいて、今は
addChild,detachによる実装を有効にしておくことにした。変更したいときは
Action3DDataのconstruct3DNode()とchange()のコメントアウトを
チョコっと変えれば良いようにしておいた。

さらに、気がついたことをメモしておくと、チケットに書いたシーングラフへの
オブジェクトの追加の順番は関係が無いみたい。それとチケット#23701のバグとは
無関係かもしれないけど、wether.a3というファイルのRainとSnowのアクションは、
Switch実装の時はCloudy.wrlの部分が表示されないというのがつい最近判明。

うぅぅぅん。実際使った感じではaddChild,detach実装も、そんなにパフォーマンスが
悪いとは感じないけど、Switchの方が良いはずなんだけどなぁ。
でも、これだけ不具合が見付かってしまったのでaddChild,detachによる実装にするしか
ない。時間があれば、また追求したいところ。

2010,11/26
========================================

setDepthBufferFreezeTransparent()の件だけど，
デフォルトの値を2010,08/25にfalse，
2010,11/14にtrueと，いろいろ変更してきたけど，
やっぱりそれぞれ問題がある．現在わかっている
範囲で整理しておくと，

* trueにしておかないと，透明物体が重なった時に
  後ろの透明物体が非表示になってしまうみたい．
  結構このような状況は多発しそうな気がする．
  例えば，透明テクスチャで作った木とか．．．
  特にNeverwinter Nightsのエフェクトはtrueが良い．
* Metasequoiaのローダを使う場合はfalseにしておかないと
  見えてはいけない物が表示されちゃったりする．
  Metasequoiaのモデルが透明テクスチャ前提のモデル
  ということなのかな？(テストで使ってる3Dモデル限定？)
  自信ないけど裏表とか考慮してローダを改良したら直るかも．．．
* A3Widgetではデプスバッファの値で描画するかしないか判定する
  ので，falseにしておかなければ透明物体は基本的に
  表示されなくなってしまう．

デプスバッファをフリーズさせるっていう意味がわかってきた．
それで，結局通常のデフォルトはtrueということにしてA3Widget
だけ例外的にfalseにするということに，またまた変更することに
します．

2010,11/24
========================================

このAcerola3Dライブラリではないけれど，これが
利用しているa3-vrml97.jarについて．．．
a3-vrml97はj3d-vrml97の...impl.Background.javaに
少し手を加えたものだが，このj3d-vrml97が
Windows版Octaga Playerと同居できない問題があり
a3-vrml97でもその問題をうけついでいる．問題の
原因はVRMLのSAI(Scene Access Interface)や
EAI(External Authoring Interface)で使われている
vrml.で初まるパッケージのJavaクラスで，たぶん
Octagaが独自実装のパッケージをOctagaSAI.jarという
JARファイルにまとめて，Windowsにインストールされて
いるJavaに入れてしまうから．j3d-vrml97でも同じ
部分の自前の実装があるわけだけど，これがOctagaSAI.jarと
ぶつかってAcerola3Dがまったく使えなくなる．ちゃんと
調べていないので，確証はないけどOctagaが行儀の
悪い方法でOctagaSAI.jarを入れているのが悪いのだと
思う．とはいってもどうしようもないので，j3d-vrml97の
SAIとかEAIの実装部分を名前がvrml.で初まるパッケージから
a3vrml.で初まるパッケージに移してa3-vrml97.jarを
作りなおした．これにはeclipseのリファクタリング機能を
使って一発でやった．当然このa3-vrml97ではSAIとかEAIの
機能が使えなくなるけど，Acerola3Dでは利用する予定がないので
問題がないはず．これでOctaga PlayerとAcerola3Dが
共存できるようになったと思う．


2010,11/22
========================================

チケット#23701のバグを追求する前に，
Action3DData.Action.construct3DNode()の
実装をリファクタリング．そしたらバグも見付かった
ので，それの修正もした．リファクタリングは
かなり進んだ，というか今までの実装がひどく
下手だった．そして今回のリファクタリングで
アクションの切り替えはSwitchグループの実装
固定で行くことにして，デタッチによる実装の
コードは完全に削除した．それから着せ替え機能を
便利にするために入れたけど，未完成で結局使って
なかった余計なBranchGroupを削除した．なので，
着せ替えはデタッチした状態でしかやれないという
ことで固定する．バグというのはルートの骨の
TransformGroupの下に全てぶらさがっていたという
ことで，これを修正した．

次はScene.add()とかdel()の実装をNEWなやつに
変更して，それでまともに動くようにする．
たぶんA3VirtualUniverse.addA3SubCanvas()とか
A3VirtualUniverse.changeActiveScene()を
Behaviroのスレッドでの処理に移すことが必要かも
しれず，必要でなくてもしておくべき．
他にもあればBehaviorのスレッドに処理を移して
おく．それがすんだらチケット#23701のバグを
調査するべし(かなり難しそう)．

2010,11/14
========================================

2010,08/25の修正で
view.setDepthBufferFreezeTransparent(false);
をデフォルトにしたけど，やっぱり
view.setDepthBufferFreezeTransparent(true);を
デフォルトにする．透明テクスチャで結構影響
あることが，いろいろな場面で出てきた．

2010,11/10-2
========================================

WindowsでOpenALのソースのリソースが256ぐらいで
枯渇する問題に対応した。リソースの開放のタイミングだけど
Action3Dオブジェクトがデタッチされるタイミングが
楽で問題も少なかとも思ったけど、やっぱり256は少なすぎる
と思うので、A3Sound.stop()のタイミングで開放して
A3Sound.start()で毎回ソースを初期化する実装にした。
とはいってもbullet.a3のような使い方をするなら、やっぱり
256個以上で音が出なくなるので、256を越える前にbullet.a3
をA3Windowなどからdelしてもらうしかない。A3Soundの
startとstopで初期化と開放の処理が入るので、
あんのじょうWindowsでは重いのか時々再生がとぎれるけど、
音が出なよりはだいぶましということで、これで行く。

それからサウンドのオフセットとコーンサウンドのディレクションの
設定がきちんと反映されるようにした。けっこうな書き換えになって
いるけど、これについてはまだテストしていない。

MacOSXではあいかわらず調子が良いみた。Linuxのテストは
これから。とにかくだいぶ変更したのでテストを十分におこなうこと。

またSoundsクラスの名前をA3Soundsクラスに変更。

2010,11/10
========================================

LongSoundで，loop再生がされずに止ってしまう
場合があるバグを修正．もっと良く聞いてみないと
わからないけど，loopで2回目の再生に入る
タイミングで1回目の音の最後の一瞬が切れてしまう
不都合も解消されているはず．

ただ，この修正部分，JOALのストリーミング
のキューイングのプログラムで非常にデリケートな
ところなので，もうすこしテストしてからリリース
すること．

また，Windowsの環境で途中から音が出なくなる原因は，
実験の結果，OpenALのソースのリソースをきちんと開放して
いないということで間違いなさそう．だいぶ目処がたってきた．

2010,11/09-2
========================================

最近のA3Objectの変更(addLocメソッドの追加など)は
A3Objectの保持する情報を積極的に利用してもらうという
方向性だったので，その延長ということで
強調表示(emphasize)とポリゴン表示(polygonize)に
関しても，その状態を読み出すメソッド(isEmphasizedと
isPolygonized)を追加した．これに付随して
emphasizeとpolygonizeは同時に指定できないという
ことを明示的なものとして実装．

2010,11/09
========================================

A3CanvasInterface.setNavigationMode(...)を
変更して、ナビゲーションのパラメータを指定できるようにした。
可変引数でパラメータを指定することにしたので、APIとしての
互換性は問題ないと思う。ただし、パラメータが指定できるのは
ナビゲーションモードCHASEとSIMPLEのみ。SIMPLEのパラメータは
今のところdistanceだけだけれど、もうすこし拡張しても良いかも。
とりあえずはここまで。

追記：ああ，APIとしては互換性があるけどコンパイルしなおさないと
上手く動かないということに気がついていなかった．なので
acerola3dのjwsのjnlp使っている人全員に影響がある．猛烈に反省．

2010,10/29
========================================

A3CanvasInterfaceにaddCameraLoc()などの相対的な
操作をするためのメソッドを追加。これが非常に面倒。
やっぱり、シーンの追加と複数のカメラに対応したうえで、
互換性を維持するのは大変。次のバージョンではどうにか
するべし。

2010,10/25-2
========================================

サウンドの生ファイルを読み込んで再生するためのSounds
オブジェクトを追加。Acerola3D的には本当は、この
オブジェクトよりサウンドが埋め込まれたAction3Dを
使って欲しいところだけれど、やっぱりこれも無いと不便。

このSoundsオブジェクトも10/23のAction3Dと同様の
問題があるので、あわせて直さないといけない。

2010,11/10追記：Soundsクラスの名前をA3Soundsに変更。

2010,10/25
========================================

A3Widgetのマウスリスナーの登録のメソッドを
実装していなかったのを追加．あっ、これってA3Window
とかと整合性が取れていない。どうしよう。

2010,10/23
========================================

lockedA3==trueなAction3Dオブジェクトのサウンドの
座標変更とかが，考慮されてなかったので応急手当．
応急手当の方法は，Action3DがA3CanvasInterfaceに
addLockedA3()される時にAction3D.setSoundTypeLocked();
という非公開メソッドを呼び出すようにしている．
意味不明なメソッドだし，デタッチして
Lockedでない方法でaddした時に対応していない．
暇を見てなおすべし．

ついでにAction3D.setAllSoundGain()メソッド追加．

2010,10/19
========================================

COLLADAとX3Dのローダ追加．

2010,10/17
========================================

座標、回転(Quat,Rot)、拡大率のそれぞれについて
差分を加える(もしくは合成)するメソッドを追加。
そして、getLoc()などのメソッドに現在の値ではなく、
目標値を取得するgetTargetLoc()などのメソッドを
追加。

追加したメソッド

* A3Object.addLoc(***)
* A3Object.addLocImmediately(***)
* A3Object.mulQuat(***)
* A3Object.mulQuatImmediately(***)
* A3Object.mulRot(***)
* A3Object.mulRotImmediately(***)
* A3Object.mulScale(double)
* A3Object.mulScaleImmediately(double)
* A3Object.getTargetLoc();
* A3Object.getTargetQuat();
* A3Object.getTargetRot();
* A3Object.getTargetScale();

2010,10/05
========================================

A3ObjectにgetUnitVecX();getUnitVecY();getUnitVecZ();
を追加。あとEclipseのビルドパスちょっと変更。

2010,08/31
========================================

各種Java3Dローダを使ったA3Object拡張クラスを追加。
まだまだテスト版。とりあえずということで。

* NWN: Neverwinter Nights(MDL)
* MD3: Quake 3(MD3)
* MD2: Quake 2(MD2)
* Max3DS: Max3DS(3DS)
* Metasequoia: Metasequoia
* MilkShape3D: MilkShape3D(MS3D)
* AC3D: (AC)
* LightWave()
* Wavefront(OBJ)
* Quake 2背景(BSP)


2010,08/28
========================================

先日08/25の変更は，Neverwinter Nightsの
モデルローダと相性が悪いことが判明．
全然表示されないわけではなく，エミッター
(炎とかのエフェクト)の表示が少し崩れる
程度なのでデフォルトは
setDepthBufferFreezeTransparent(false);
にしておくけど，A3CanvasInterfaceに
setDepthBufferFreezeTransparent(boolean);
を追加して何時でも変えられるようにしておいた．

2010,08/25
========================================

Metasequoiaのローダを試してみたところ
Zバッファが変になるので，その対処をした．
ただし，これが他に影響を与えるかどうか
不明なので，チェックするべし．

変更したのはA3VirtualUniverse.javaのコンストラクタで
次の2行を追加．

    view.setTransparencySortingPolicy(View.TRANSPARENCY_SORT_GEOMETRY);
    view.setDepthBufferFreezeTransparent(false);

2010,07/26
========================================

ひさびさに更新。A3Editorの不具合を修正していたら
変なところがみつかったので、こちらも修正。
BVHのボーンに関連付けされていない
VRMLの追加がアクションのオフセットやスケールの影響の
外のrootGroupにaddChildされていたけど、他の物と
同じ扱いとなるように修正した。互換性の無い変更だけど、
やはりこのほうが良いと思う。
ただ、A3Editorのほうのずれはまだ直ってない。
(なんか回転が変みたい。)
2010,07/27追記：回転が変なのはA3Editorに食わせた
データが特殊だったので勘違いしていただけだった。

2010,05/24
========================================

CATALOG.XMLの<a3>の中の<a>の中の<p>で，
nameが存在しない場合は，VRMLをBVHと
関連ずけせずに表示する機能にバグ．
BVHのrootボーンに関連付けされて表示
されていたので修正．

それとVRMLのBackgroundノードやFogノードは，
なぜか今までなぜかボーンに関連付けさせて
いなかったけど，させるように変更した

2010,05/11
========================================

Behavior内で実行させなければならない処理を
A3Objectのコード内から登録するための
runInBehavior(Runnable)メソッドを追加。
試しにA3Text3Dの処理をこれを使って修正
してみた。その結果この仕組みがちゃんと動作する
ことは確認できた。

でもA3Text3Dで、文字がずれる現象はなおらな
かった。そこで、もう少し試しているうちに
Text3D.setPosition(Point3f)とText3D.setString(String)
の順番を変更すればちゃんと表示されることを発見。
Java3Dの方のバグということなのかな？
再現性のないバグなので確証はないけど、たぶん
Behavior以外のスレッドからのアクセスの問題とは関係
ないみたい。でもせっかくなのでrunInBehaviorを使う
実装のままにしておく。

本当は他のA3Objectサブクラスでも同様の変更をした
方が良い所もあるのだけれど、問題が起きていないので、
とりあえず保留。

さらにTimerBehaviorにも同様の機能を作成して実装した。
Sceneのadd(A3Object)とdel(A3Object)メソッド、
A3VirtualUniverseのemphasize(Group)と
unemphasize(Group)とpolygonize(Group)と
unpolygonize(Group)メソッドのをこれを使って
修正してみたところA3SubCanvas関係であまり良くない
ことが発生(詳しくはa3test.debug.A3SubCanvasDebug
参照)。ということで、これらのメソッドは_NEWバージョンと
_OLDバージョンを書いておいて今のところ_OLDの実装を
使用するようにしてある。

2010,05/06
========================================

Action3Dのアクションの変更をGroupのdetachとaddChildで
実装する方法からjavax.media.j3d.Switchを使う実装に変更
(というか戻した)。MacOSXではとりあえず動作に問題はないみたいだが、
WindowsとLinuxでもテストすべし。

シーングラフに追加したまま表示・非表示を切り替える機能を実装した。
でも、実装の方法は非常にかっこわるい方法で実際には非表示にするかわりに、
サイズを0.0倍して表示しているというもの。本当はRenderingAttributes
なる機能を使いたかったけど、Action3DはSharedGroupを使っているので、
断念した。

2010,04/30
========================================

バックグラウンドに設定したAction3Dのサウンド再生が
変だったのでA3CanvasInterface.setBackground()
の実装を見てみたら無駄の多い実装になっていたので修正。
サウンドの再生も修正されたし他に問題も無いようだが、
何かあった時に思い出せるようにメモ。

2010,04/29
========================================

A3Editorに必要な機能をいくつか追加。

* A3CanvasInterface.snapshot()
* A3Label.getOffset()
* A3Balloon.getOffset()
* A3Object.getLabelLoc();
* A3Object.getBalloonLoc();
* Action3D.getLabelLoc();
* Action3D.getBalloonLoc();
* A3VirtualUniverse.emphasize(Group)とか
    + 結局使わなかったけど
* Skeleton.getBones()
* Skeleton.resetSelected()

2010,04/14
========================================

Skeleton.getMotionLength()を追加。

2010,04/13
========================================

BVHの回転のチャンネルの順番がZ,X,Yでない物も多数ある
ということに今ごろ気がついた。Z,X,Yの順番でない場合でも
きちんと読み込めるように対応した。ついでに回転以外の
変換の順番もBVHのチャンネルの宣言どうりの順番で適用する
ようにしてある。問題ないとは思うが気をつけておくこと。

なんか非常にカクカクしてしまうBVHもあったような気がするが、
今回は気がつかなかった。TimerBehaviorのデフォルトの
インターバルを変更したからだろうか?

2010,04/08
========================================

あれ?2009,12/07に改良したRZipURLConnectionの
キャッシュがまったく働いていなかった。働いていない
だけでなく改悪になってた。一行追加して修正。
やっぱり実際に実行して確認しないとダメだね．
ということでa3testパッケージにRZipCacheTestという
debug用プログラムを作成してテストしてみた．
3回の平均値と不偏分散．

* Var.A: 2009,12/07以前の実装
* Var.B: 2009,12/07の改悪後
* Var.C: 2010,04/08の修正後

* <http://acerola3d.sourceforge.jp/samples/a3/axis.a3>
    + Var.A: 平均  0.08秒，分散 0.00， 差 0.09
    + Var.B: 平均  0.08秒，分散 0.00， 差 0.08
    + Var.C: 平均  0.06秒，分散 0.00， 差 0.09
* <http://acerola3d.sourceforge.jp/samples/a3/vesma9.a3>
    + Var.A: 平均  2.54秒，分散 0.00， 差 0.48
    + Var.B: 平均  2.68秒，分散 0.00， 差 0.60
    + Var.C: 平均  0.53秒，分散 0.00， 差 0.63
* <http://acerola3d.sourceforge.jp/samples/a3/ExpAtCE.a3>
    + Var.A: 平均 11.17秒，分散 0.00， 差 0.27
    + Var.B: 平均 38.21秒，分散 0.05， 差 0.67
    + Var.C: 平均  1.78秒，分散 0.00， 差 0.58
* <x-res:///vesma9.a3>
    + Var.A: 平均  1.64秒，分散 0.01， 差 0.51
    + Var.B: 平均  1.79秒，分散 0.00， 差 0.56
    + Var.C: 平均  0.53秒，分散 0.00， 差 0.52

実際には4回ロードして1回目は捨てて2,3,4回目の数値で計算している。
というのも1回目の数値はあきらかに長いので何かの初期化で時間を消費して
いるのだと思う。大学の学内LAN上での数値なのでファイアウォールの
キャッシュが効いてるはずだけど、何回やっても同じだけ差が出るので
キャッシュじゃないはず。自分でも何の初期化かは不明。「差」という数値は
平均と1回目の差。でも、デカいファイルのネットワーク経由でのロードでの
効果が絶大だということが確認できた。ローカルでも内部要素の多いファイルでは
かなり効果がある。とりあえず良しとするか。

2010,04/01
========================================

このライブラリ自体はまったく変更していないけど、この
ライブラリに依存するJava3DとかJOALとかのライブラリを
整理したので、ここにメモしておく。

まず、64ビットOSに対応できてなかったのでWindowsと
Linuxに64ビット版のバイナリを用意することにした
(MacOSXはユニバーサルバイナリなので最初から64ビット
対応済み)。ただ、自分で対応しないといけないのはJOAL
のみで他のJava3Dとかはamd64対応のバイナリがあるので、
それを利用。WindowsもLinuxもVirtualBoxで、64ビット
OS環境を用意してJOALをビルドした。WindowsはWindows7
の64ビット版、LinuxはUbuntu9.10の64ビット版を使用。

Linuxの方は特段変なことはしなくても良くてほぼJOALの
README.txtどうりにビルドできた。VirtualBox環境では
雑音やテンポの遅れの問題があったけど使える物にはなって
いるので深追いしてない(VirtualBoxの方の問題じゃない
かなぁ)。

WindowsはそのままビルドするとVisual C++ランタイムに
依存するDLLが作成されてしまう(しかもランタイム入れて実行
してもなぜか動作しない)。antのビルド時のログを見ると「/MD」
というスイッチ付きでDLLがコンパイルされているのが原因の
ようだった。このへんはgluegenの設定で何かできるのかも
しれないけどまったくわからずで、結局antのビルド時のログを
参照して「/MD」の部分を「/MT」に変更してコマンドプロンプトから
直接コンパイルし、DLLを作成した。関係ないけどWindowsで
64ビット版バイナリを作成するには色々と必要なことがあって
勉強させてもらった。

それからJava Web Startのバイナリパッケージを見直そうと
思ってろいろ調べてみたら、Java3Dのサイトで公開されている
各種OS用のバイナリパッケージに含まれるjarファイルが全て
同じ物であることに気がついた。さらに調べてみるとJava3Dの
build.xmlにはshared jarなる物をビルドするためのタスクが
存在することを発見した。つまり全てのOSで共有できるJARファイルが
作成可能ということ。そこで以前作成したj3dcore.jar
からZバッファ読み出しのパッチを当てて作成したGraphicsContext3D.class
を抽出してJava3Dのウェブサイトで公開されているバイナリパッケージの
GraphicsContext3D.classだけを交換したj3dcore.jar
ファイルを作成した(当然j3dcore.jarのSUNによる電子署名の情報も
削除)。かなり強引だけど、これが上手く動いたのでこれを使うことにした。

調子にのってJOGLやJOALも同じ共通のJARファイルで実行してみたところ
全て上手くいったのでダイナミックリンクライブラリ以外の全てを共通化
することに成功。これのおかげでJava Web Startのバイナリパッケージの
単純化と大幅な容量削減に成功した。

2010,03/12
========================================

Java Web Start,Windows,MacOSX,Linuxのそれぞれの
バイナリパッケージも簡単に作れるようにbuild.xmlを
工夫してみた。

2010,03/11
========================================

exampleに入っていたテスト用のプログラムを
別パッケージ(a3test)に移動して削除しました。

2010,03/09
========================================

物理エンジンのjbulletを組み込めるように準備だけした。

2010,03/01
========================================

一応、四元数とかオイラー角とか回転行列関係のリファクタリング
終了。バグが無いか引き続きチェック。

A3BehaviorのsetLocImmediatelyなどのメソッドで、
Behavior外のスレッドからの呼び出しでTransformGroupを
書き換えていたが、これをしないように改良した。

それとTimerBehaviorのデフォルトのインターバルを100ミリ秒
から33ミリ秒に変更した。これによってA3BehaviorとCameraBehaviorの
補間スピードが速くなってしまったので、ちゃんとelapsedTimeを
考慮した補間計算にした。その時に1秒で行われる補間の率をそれぞれの
Behaviorで持つようにしたので、A3ObjectとA3CanvasInterfaceに
これを変更するAPIを付けた。同様の理由でWalkControllerとFlyController
もTimerBehaviorのインターバル(実際にはA3VirtualUniverseのelapsedTime)
と同じになるようにした(同期まではしていない)。

さらに、これにあわせてActionBehaviorもTimerBehaviorと
同期するように変更した。

2010,02/24
========================================

A3UtilクラスをUtilにリネーム。そして
このクラスに四元数やオイラー角の計算のための
メソッドを追加した。でもまだデバッグ中。
これができたらA3Object.getRot()を実装して、
計算の重複しているところをリファクタリング
してゆこう。

2010,02/23
========================================

BVHデータを表示するためのSkeletonクラスの表示を
改善した。理由はA3EditorでBVHをドラッグできるように、
骨に太さを持たせるため。

2010,02/19
========================================

02/09に追加したポリゴン表示と強調表示の機能をA3Objectの
標準の機能に格上げした。よってPolygonizerクラスと
Emphasizerクラスは廃止した。

さらに、いまさらだけど、A3ObjectをA3CanvasInterfaceに
addした時にA3Objectのシーングラフをcompileするようにした。
Action3Dの方にはcompileしてもsetShapeが上手く動作
するように余計なBranchGroupを追加して対応した。
これでパフォーマンスがどうなるかな?

2010,02/12
========================================

A3CanvasInterfaceにFPS(Frame Per Second)を取得する
ためのメソッドを追加した。でも、A3WidgetのFPSだけは、
たぶん正しい値が取得できていない。

それと、TimerBehaviorのelapsedTimeを各A3VirtualUniverseごとに
設定するためのメソッドもA3CanvasInterfaceに追加した。
これは、カメラやA3Objectの座標などの更新インターバルに相当する。
今まで、100ミリ秒決め打ちでやってきたので、結果10FPSの3DCGにしか
なっていなかった。ただ、この更新インターバルはBehaviorの更新インターバル
というだけなので、負荷が高い時などは必ずしも「FPS=1000ms/更新インターバル」
とはならないので注意。

2010,02/09
========================================

ポリゴン表示機能を追加。ちょっと使い方が直感的じゃないけど、
たぶんJava3D的に負荷が少なくAcerola3D的にAPIの変更の必要が
無い方法で実装してみた。負荷が少ないならA3ObjectのAPIを追加する
ことでA3Objectのデフォルトの機能にしても良いけど、わからないので
とりあえずこの方法にしておく。

強調表示機能を追加。去年の12月8日、A3Objectに
setSelected3D()の機能を付けたけど、こっちの方が良かった
かなぁ？実現方法は上のポリゴン表示方法と同じなので、
上と同様なことが言える。

2010,02/05
========================================

サウンドの音量調節のためのAPIをA3CanvasInterfaceと
Action3Dに追加。A3CanvasInterfaceは全体の音量。
Action3Dの方はアクションごとに音量調整できるように
してある。ただ、OpenALの実装で1.0以上の音量設定に
違いが出るかも。

2010,01/29
========================================

A3SubCanvas,JA3SubCanvasの実装をひととおり完成させた。
A3CanvasInterfaceをどうするか非常に迷ったけど、結局
そのまま使って、A3SubCanva,JA3SubCanvasもA3CanvasInterfaceを
実装させることにした。これは、互換性のためであって、
ベストな方法ではないので、特にA3SubCanvas,JA3SubCanvasに
大量のダミーのメソッドが必要になった。

これの本来の解決法はTODO.txtの方で考察している。やっぱり、
Version3系列は考えとかないといけないかもしれない。

2010,01/26
========================================

A3SubCanvas,JA3SubCanvasの機能を充実させているところ。
まだ途中。でも、だいぶ実装が汚くなってきているので、
なんとかしたい。

2010,01/18
========================================

大変申し分けない。
Acerola3Dフォーマットの<a>タグ、<p>タグのrot属性
で指定する回転の適用順番を変更しました。そして
A3Object.setRot()やA3CanvasInterface.setCameraRot()
などの回転の適用順番も同様に変更しました。これは仕様の
重要な変更になってしまうのですが、傷が浅いうちに変更して
おきます。具体的には回転の適用がZ,Y,Xだったのを
Z,X,Yの順番に変更しています。この順番は、オライリーの
「ゲーム3D数学」という本で最も実用的で広く使われていると
書かれている順番で、確かに実用的だと思う。XとYの順番が
入れかわっているわけだが、実際XとYの両方の回転を指定する
ような場面はめったになかったため、それほど大きなダメージは
無いと思うが、とにかく重要な仕様変更になってしまった。

2010,01/15
========================================

投影法として、デフォルトの透視投影以外に、平行投影
が選択できるようになった。透視投影では画角(FieldOfView)、
平行投影では物理座標系でのCanvasの大きさ(幅)が、
設定できるようになった。これらの機能へのアクセスは、
A3CanvasInterfaceとA3SubCanvasInterfaceの、
setProjectionMode(),setCanvasWidthInPWorld(),
setFieldOfView()の三つのメソッドを使う。

この変更に対応するために、座標変換のメソッドに
拡張をほどこしている。ピッキングなどで影響ないか
気をつけておくこと。

それとA3SubCanvasInterfaceの実装(A3SubCanvasと
JA3SubCanvas)を完成させた。
(2010,01/29:A3SubCanvasInterfaceは廃止)

2010,01/12
========================================

A3SubCanvasInterfaceというのを新しく導入して、
既存の仮想空間に、別の視点からの描画を可能にする
キャンバスをバインドできるようにした。
(2010,01/29:A3SubCanvasInterfaceは廃止)

2010,01/11
========================================

VRMLクラスにキャッシュをクリアするメソッドを追加。
A3CanvasInterfaceにgetCanvasSize()を追加。
A3CanvasInterfaceとA23そして新しいクラスA3Utilに
cleanUp()インターフェースを付けたけど未実装。

2010,01/08
========================================

一部の環境でMP3,OGGの再生が早送りやレコードの音飛びの
ような感じになってしまう。新しい音声再生の機構と、JOALMixer
が何かバッティングをおこしている感じがする。なので、とりあえず
Java3DのサウンドミキサーのデフォルトをJOALMixer2から
JavaSoundMixerに変更することにした。

2010,01/07
========================================

A3CanvasInterface.delAll()がシーン対応になって
なかったので、対応させた。

2010,01/04
========================================

a3-vrml97のBackgroundのテクスチャ画像の貼り付け方
が微妙に違ってたので修正．具体的にはtopの画像が
180度回転する必要があった．これでスカイボックスが
綺麗に表示できるようになった．

2009,12/25
========================================

CATALOG.XMLの<a>タグと<p>タグで指定される
scale,rot,offset属性で指定される座標変換処理を
良く見直したらバグ発見。変換はscale,rot,offsetの
順で行われるように変更したのと、rotに関してはz,y,xの
順で変換されるものとする。これをフォーマットの仕様書にも
反映させた。

2009,12/25
========================================

Action3Dの効果音をJOALに直接アクセスして再生
するように変更した。これでMP3などの再生にも
対応したし、今のところ非常に調子がよいようだ。
しかし、Java3DのAudioDeviceと共存させているので、
非常にコードが汚くなった。おりを見てリファクタリング
すべし。

それから，先日廃止した<s>要素のloop属性だが，
BGMをループ再生するのに必要だったので復活させる．

2009,12/21
========================================

CATALOG.XMLで、サウンドを設定する<s>要素の
loop属性を廃止することにした。かわりにアクション
(<a>要素)のloop属性で設定する。

2009,12/20
========================================

Action3D.getActionNo()とAction3D.getActionName()が
実装されてなかったので実装した．

A3CanvasInterface.setA3Controller()の引数に
nullを与えてやれば，コントローラのリセットが
できるように修正した．

2009,12/19
========================================

多分うまくいっていると思うのだが、Acerola3D
ライブラリに広告を付ける機能を追加した。
Acerola3DライブラリをJava Web Startで配備する
時のjnlpファイルでJavaのシステムプロパティーとして
「acerola3d.advertisement=クラス名」と言う形で、
Component2Dを拡張したクラスを指定して、実際その
クラスを含むjarファイルも一緒にアップロードすれば、
そのComponent2Dは常に最前面に描画される。
Component2Dの拡張クラスには引数なしのコンストラクタ
がなければならない。

2009,12/08
========================================

A3ObjectにsetSelected3D()とisSelected3D()を
追加して、オブジェクトが選択されていることを3D表示で
表現できるようにした。

A3CanvasInterfaceを実装するクラスに
setCameraLookAtPoint()系列のメソッドを追加した。
A3ObjectにもsetLookAtPoint()系列のメソッドを
追加した。特にA3Objectの方はリファクタリングもした
ので、従来の機能に変化が無いかチェックする必要がある。

2009,12/07
========================================

x-rzip:プロトコルの読み込みの実装のところに、
キャッシュをもうけて読み込みを速くするようにしてみた。
Appletとかでネット経由で読み込む時には特に効果がある
はず。

2009,12/01
========================================

ビルボード機能を追加，A3Object.setEnableBehavior(true);
してからA3Object.setBillboardControl(true);で有効に
なる．それとAcerola3DファイルのCATALOG.XMLのa3タグの
billboard属性でも指定できるようにし、その場合は自動で
ビルボード機能が有効になるようにした。

2009,11/30
========================================

Smiley.a3で、一番最初のフレームがきちんと表示されていない
ことが判明した。たぶん、最初のフレームでBVHの情報が
反映されていないのが原因で、表示位置がずれるのと、
Angryが表示されないという事態に陥っている。
そこで、ActionBehaviorのinitialize()でprocessStimulus()を
呼ぶようにしたらなおったようだ。他に影響がないかチェックするべし。

それから、11/20の変更のせいで、音声の再生がおかしく
なっていた。これもActionBehaviorの修正で対応した。多分
大丈夫だけど、もう一度チェックすべし。

2009,11/20
========================================

JA3Canvasでは大丈夫なのに、A3Canvasで吹き出しの
三角が表示されなかったのを修正。原因不明。
それと再生時間が1フレーム以下のアクションの効果音が
出ていなかったのを修正。

2009,10/27
========================================

SimpleControllerのバグ修正。難しいバグだった。
実は100%理解してないのだが、PickingBehaviorの
physicalCSToVirtualCSで使用している
TransformGroup(変数名vptg)の値は
a3CanvasInterface.setCameraLocImmediately()を
実行してもすぐに反映されるわけではないことに起因している
と思う。別の計算法で逃げたけど、これはどうしたら良い物
だろう？

それに加えてA3CanvasInterface.getCameraUnit*()
メソッドのバグも修正。

2009,10/26
========================================

A3Widgetでキーイベントとマウスイベントが機能して
いなかったのを修正。LinuxとWindowsでは正常に
動作している模様。でもMacOSX上ではマウスドラッグで、
ウィンドウ自身が移動してしまい完璧には動作していない。

デフォルトのナビゲーションスピードを4.0m/sから
1.0m/sに変更。EditControllerのバグ(カメラの
向きが正面でないときの平行移動の方向が変)を
修正。

2009,10/13
========================================

署名無しのアプレットを作ることができるように
AccessController.doPrivilegedWithCombiner
を使ってセキュリティ例外が出ないようにした．
今回対応したのは

* A3VirtualUniverseの中のSystem.getProperty()
* A23の中のURL.setURLStreamHandlerFactory()
* Action3DDataの中のloadCatalog．というか
  その中のJAXBContext.newInstance()

これ以外でも必要なところがあるかどうかはまだ不明．

2009,10/12
========================================

A3Widget一応完成。それとMotionCameraController
というので、モーションキャプチャデータを元にカメラを
自動制御する方法を追加。

2009,10/11
========================================

まだ未完成だけど、A3Widgetを追加。
背景が透明なウィンドウで3Dオブジェクトを
表示できるようになる。

未完成だし、Java3D1.5.2のバグをパッチをあて
て直さないといけない。

* <https://java3d.dev.java.net/issues/show_bug.cgi?id=593>

2009,09/30
========================================

Component2Dをinterfaceからabstractクラスに変更。
仕様の変更になってしまったけれど、カメラの背後にあるはずの
Component2Dが表示されてしまうバグと、Component2Dの奥行が
考慮されて表示されるようになった。また吹き出しの表示を
少し見易く改善した。

Marionetteの情報をMotionオブジェクトから取得して
構築するコンストラクタを追加した。BVHのデフォルト
ポーズの情報でMarionetteの内部情報を構築するメソッドも
追加した。

2009,09/28
========================================

segno(セーニョ),dalsegno(ダルセーニョ)機能を
実装した(詳しくはAcerola3Dフォーマットの仕様書
参照)。ただ、segno前の音声は無理っぽいのであきら
めて、segno後の音声だけに対応している。

2009,09/26
========================================

まだまだ足りないところは多いけど動画を表示させる
ためのA3Videoを作成した。ソースのほとんどはJMF
のサンプルから拝借している。JMFを使っているので、
jmf.jarの設定が必要。

2009,09/24
========================================

3次元座標の上方向をY軸にするかZ軸にするかとかの話。

デフォルトはY軸が上。このデフォルトの変更を
A23.setDefaultUpperDirection()で行えるようにした。
新しいSceneが生成される時に、このデフォルト値が
Sceneにコピーされ、この値を元に、カメラの位置と
回転が初期化される。そしてこのシーンにaddされる
A3Objectは自動的に回転されて正常な向きになるように
表示される。

A3ObjectにあったupperDirection変数は廃止となり、
かわりにupperVectorが新設された。これは
オートコントロールの正面自動計算の機能で使われる
上方向ベクトルでA3Objectオブジェクトごとに保存する
こととなった。setUpperVector()メソッドなどで
アクセスする。

でも、まだ全然テストがすんでいない。十分にテストすること。

2009,09/20
========================================

吹き出しとラベルの表示とAPIを大幅に変更した。
でも、これで良くなったと思う。

2009,09/18
========================================

Acerola3Dファイルから各種メタデータを取り出せる
ようにした。そしてAcerola3Dファイルの省略形として
動きの無いアクションでBVHファイルを省略できるように
した。まだ、上手く音声が再生されないようだがConeSoundの
効果音にも対応した。

2009,09/17
========================================

A3Object.getSpeed()の返す値が間違っていたのを
修正。そしてオートアクションコントロールの動作も
少し修正してA3Autoのサンプルが正常に動作するように
した。

2009,09/14
========================================

Action3DのsetMotion()を実際に動くようにした。
サンプルファイルはOverwriteMotion.java。
Marionetteを動くようにした。サンプルファイルは
MarionetteTest.java。Action3DのsetShape()を
実際動くようにした。サンプルファイルはOverwriteShape.java。
ただsetShape()が上手く動作するには条件がある。詳しくは
サンプルを参照。

2009,09/07
========================================

PickingBehaviorの中でやっている座標変換のバグ修正。
Transform3Dのtransformメソッドの変換は、引数が
Point3dの時とVector3dの時では異なる動作をする
という所がポイントだった。その他座標変換のいろいろな
細かいバグは多数あった。これにしたがいpickingの
コードも修正。そしてA3Objectに新たな属性を加えて
ピッキングできないオブジェクトを来ることができるように
した。

それと、なんとなく、マウスのクリックはリリースイベント
時に同じオブジェクトにマウスがのっかっていれば良い
というアルゴリズムに変更してみた。

2009,09/04-2
========================================

カメラに対して常に固定された位置にオブジェクトを表示
するための機能を追加した。A3CanvasInterfaceの
addLockedA3()やdelLockedA3()メソッドから使用する。
この過程でphysicalCSToVirtualCS()などの座標系の変換の
計算が正しいのか疑問が生じたので、確認すべし。

2009,09/04
========================================

Action3DData.javaに手を加えてフォルダからデータを
読み込めるようにした。つまりzip圧縮前のデータの入った
フォルダを指定することで、圧縮しなくても表示の確認が
できるようになった。サンプルはexamples/DirA3.java。

2009,09/03-3
========================================

A3ScreenをJA3Canvasベースにしたら、Windowsでも
動かない環境が出てきた。やっり、安全のために元に
戻すことにする。かわりにComponent2Dをpublicな
インタフェースにして、これをA3CanvasInterfaceに
加えて2D描画ができるようにした。

2009,09/03-2
========================================

A3ScreenをA3CanvasベースからJA3Canvasベースに
変更した。これによってSwingコンポーネントを表示
できるようになった。examplesにサンプルも付けた。
(自分のマシンでA3Screenが動かなくなったけどね。)

2009,09/03
========================================

シーンのためのAPI一応完成．引き続き動作確認を
してゆくこと(アバタと背景のテストはまだ)．

2009,09/02
========================================

シーンの概念を導入してA3CanvasInterfaceに以下の
メソッドを定義して実装した。

* void changeActiveScene(int s);
* void add(A3Object a3,int s);
* void del(A3Object a3,int s);

これ以外にもシーンを指定して処理できると便利な
メソッドなどがあるので、随時追加してゆくべし。

そして、十分にテストするべし。

2009,08/28
========================================

Action3DのVRMLに入っている背景と霧の設定が反映
されるように変更した。デフォルトのj3d-vrml97では
画像を使った背景が反映されなかったので改良して、
これを読めるようにして、a3-vrml97という名前にして
おいた。lib/a3-vrml97.jarに入っている。

2009,08/25
========================================

A3Text3Dというクラスで文字を表示することが
できるようになった．それとA3Screenのディスプレイ
モードの変更の機能の追加と，ショートカットキー
(Ctrl+Alt+C)で強制終了できるようにした．

2009,08/24
========================================

終了処理や解像度の選択など、不足の機能は多数ある
けど、とりあえずA3Screenで全画面表示のプログラムを
簡単に作成できるようにした。

2009,08/14
========================================

A3CanvasInterface.setCameraLoc(0.0,0.0,100.0)とかにすると
かたまるバグをA3VirtualUniverse内のpickingBehavior.setSchedulingBounds()
で設定するBoundingSphereの半径をDouble.MAX_VALUEにして回避
した。なんとなくついでに、他の場所でBoundingSphereを使用して
いる場所でも半径をDouble.MAX_VALUEにしておいた。これは
パフォーマンスの視点では最悪の方法なので
根本的にBoundingSphereの使い方を整理しないといけない．

javax.media.j3d.ViewのsetFrontClipDistanceと
setBackClipDistanceの値を適切に設定して、
ExamControllerとSimpleControllerでは
きちんとカメラのスケールを設定するようにすることで、
拡大、縮小時にオブジェクトが切れてしまうのを回避した。

BoundingSphereとカメラのスケールの扱いは、まだ
考慮すべき点が多数ある。それとナビゲーションのスピードも、
まだ手をつけていないので、どうにかすべし。

2009,08/07
========================================

A3Backgroundで背景のジオメトリを指定する方法が
いまいちわからなかったので、これをあきらめて代わりに
背景画像を指定すると球面に貼り付けて背景として表示する
機能を付けた。ジオメトリを背景に使用する方法としては
VRMLクラスやAction3DクラスをA3Canvasなどの
setBackgroundメソッドで可能なので、とりあえず
これでよしとする。だた、一応ジオメトリをセットするための
メソッドは残しておいたので時間があれば研究してみるべし。

2009,07/19
========================================

Action3DやVRMLでは霧や背景が扱えないことが
判明したのでA3FogクラスとA3Backgroundクラスを
作成してみた。A3Fogは使えなくも無いかもしれないが、
A3Backgroundは背景の色の指定ぐらいにしかつかえなさ
そう。

2009,07/17
========================================

2009,07/10および10-2のテストを行ったけど
たぶん大丈夫だと思う。

2009,07/10-2
========================================

補間が無効のA3ObjectでA3Canvasなどにadd前に
setLocしておき，その後A3Canvasなどにaddした
時の動作は，最初の瞬間からsetLocした場所に
表示されるべきだが，一瞬原点に表示されるという
バグがあった．このバグに対処した．

A3Canvasにaddする前にchangeImmediatelyしたて
おいたAction3DオブジェクトがA3Canvasにadd
した瞬間，一瞬だけデフォルトのアクションが
表示されてしまうバグにも対処した．

でも，念のためテストをする必要があると思う．

2009,07/10
========================================

loopしないアクションが、まれに最後のフレームまで進む
前に停止してしまうバグに対処した。たぶん大丈夫だと思う
けど念のためテストをする必要がある。

2009,06/28
========================================

BVHクラスにgetOffset(String bonaName)メソッドを追加。
BVHを表示するためのSkeletonクラスを作成した。

2009,06/27
========================================

BVHの情報を骨として表示する時に必要となるデータを
BVHオブジェクトから取得するgetBoneTailsメソッドを
追加した。BVHの構成上の特性により、一つの骨が一本の
線に対応付けられないので複数の座標を返す点に注意。
(普通の骨なら複数の座標が帰ってきても全て同じ
座標になるが、骨と骨が離れているような構造のBVHの
場合は本当に複数の骨を書かざるをえない状況もありえる。)

2009,06/03
========================================

やはりマニュアルを書くと，いろいろ細かい
バグや変なところが見付かる．修正して
バージョン2.18としてリリースする．

2009,06/02
========================================

 オートコントロールのところのマニュアルを書いていて気が付いた。
 歩行スピードのデフォルト値は1.0m/sということに変更
 (今まで4.0だった)。 それとCATALOG.XMLで
 autoActionControlの指定ができるのは変な感じなので
 廃止することにする。

2009,05/18
========================================

A3CanvasやA3Windowから登録したアバタを追従する
ようにカメラを自動的に制御するChaseControllerを
実装してみた。チェックするべし。最低限の機能しか
実装してないので、作り込みをして使いやすくすること。

2009,05/08
========================================

UpperDirectionの意味を再定義する必要がありました。
具体的にはUpperDirectionを設定する対象が仮想空間
ではなく、各A3Objectに対して設定するようになります。
APIの変更にはなってしまうのですが、モヤモヤが取れた
気がします。

しかし、任意の方向ベクトルを上方向に指定できるような
APIの方が良いだろうし、現在の実装も中途半端な所があります。
ですが、今回は無理せず見送ります。(2009,05/18追記:
これについてはTODO.txtに少しメモした。)

これでやっとlightweightの準備が整ったんで、これから
じっくりテストしてバグを潰すべし。

2009,05/01から07
========================================

やっぱりlightweightにしてswingで使いたいという
要望がまわりから出てきたのでJCanvas3Dに再チャレンジ
することにした。この実装はJA3Canvasというクラス名に
して、従来のA3Canvasはそのまま残すことにすれば
そんなに問題ないかと思ったら、結構大規模な変更が
必要だった。どうしようか迷ったけどNaviModeと
UpperDirectionの列挙型をA3CanvasInterfaceという
クラスに移動したので、その部分だけインタフェースの
変更になると思う。で、しかもまだ途中。

JA3CanvasだけでなくUpperDirectionのテスト用
プログラムを作成するべし。

2009,04/06
========================================

その場しのぎのヘンテコな手を使って
SableCCのバージョンを2.18.2から3.2にむりやり
上げてみる実験をやった。前のように極端に遅くなる現象は
無くなったようだけど、良く考えてみると改善された
項目は一つもなく、実質的に改悪だね。ということで
やっぱり2.18.2を使うことにした．でも，忘れてまた同じ
ことをしないように，sableccの文法ファイルやParserBVH.javaに
ヘンテコなコードをコメントアウトして残しておくことにする．

2008,10/01
========================================

CATALOG.XMLからコメントが読み出せないことが
判明したのでいろいろ試してみたらXML Schemaの記述で
`<c>`要素の宣言を`<a3>`の中から外に出してrefで参照
するようにしたら上手くいった．でも，理由は不明．
さらに，antでコンパイルすれば上手くいくけど，
javacコマンドで手動でコンパイルすると実行時に
ネームスペース関係のエラーが出る．これも原因不明で
非常に不安．でも，待ってられないので強行突破．

2008,09/30
========================================

CATALOG.XMLの読み込み部分の実装をDOMから
JAXBに変更した。この変更による問題が2つ。
1つ目はCATALOG.XMLの記述できちんとnamespace
の宣言をしてやる必要が出てきた。2つ目はJAXB
なので、素のjava5では動かないと思う。

2つ目の問題はともかく、1つめの変更はまた互換性
の無い仕様の変更ということで、これが最後であって欲しい。

2008,09/29
========================================

書き忘れていたのですが，CATALOG.XMLで
プロファイルを記述する専用の場所として`<profile>`要素
を加えました．

2008,09/20
========================================

`<p>`要素に付けるoffsetとrot属性のバグ修正。

2008,09/19
========================================

SimpleControllerを作って、A3Canvas.NaviModeに
SIMPLEを追加。このモードはEXAMモードに似てる。
違いはEXAMモードでは、注視点があるオブジェクトに固定される
けど、SIMPLEモードでは注視点を平行移動できる。

2008,09/10
========================================

defaultActionとかdefaultActionNoという名前の
変数やメソッドがあったが，これを廃止してhaltAction
とかhaltActionNoとすることにした．
これは以前あったdefaultActionの用法の混乱をひきずって
いた問題の訂正で，互換性の無い訂正となる．

2008,09/02
========================================

CATALOG.XMLにタグ情報を付けることができるということにした。
やっぱりRDFは敷居が高すぎるでしょう。ただ、これを読み出す
APIは未実装。ついでになんとなくRDFとthumbnailの順番を入れ
替えた。それと、先日作ったActionObjectインタフェースは
これで良いのかも。AutoActionControlを機能させるにはminRunSpeed
とかの情報も必要だけど、これを必須とするのもどうかということで、
AutoActionControlの機能はAction3Dの便利な機能ということに
しておこうと思う。

2008,09/01
========================================

一応、ActionObjectという名前のインタフェースを
作って、これをアクション付き3Dオブジェクトの
共通のAPIということにしてみた。でも、実験的なもの。

今の問題点はAutoActionControlの扱い。今はこの機能は
APIから抜いておいた。でも、それが正解かどうかわからないし、
この機能はどんなアクション付き3Dオブジェクトでも共通化
できそうだ。InterfaceでなくAbstractクラスの方が良いのかな？
ということで、まだまだ考察が必要。

2008,08/09
========================================

Action3Dのデータを読み込む時に使用している
キャッシュを空にするためのメソッドを用意した。
A3Viewerなどで、ファイルを作り直して、再確認する
ためにもう一度読み込む必要がある時などに使用する。

2008,08/05
========================================

CATALOG.XMLのSchemaのデータを修正して、アクションに
balloonOffset属性を付けることができるようにした
(実装はしてないけど)。それと若干のバグ修正。

Action3Dと同じようにA3Arc,A3Image,VRMLオブジェクト
にも使いやすいコンストラクタを追加。

grammar/a3format.txtにAceorla3Dファイルのフォーマット
の仕様書を置くことにする。まだ簡単な物なので、もっと詳しく書いて
ゆくべし。

2008,06/26
========================================

Action3Dクラスに文字列を引数にとるコンストラクタと
URLオブジェクトを引数にとるコンストラクタを追加しま
した。「new Action3D("x-res:///test.a3");」という
感じでオブジェクトが生成できるようになったので、
オブジェクト指向の初心者にとってわかりやすい形で
プログラムを書けるようになったと思います。

2008,03/27-2
========================================

パッケージ名をjp.sourceforge.acerola3d...に変更しました。
互換性を無視したわけですが、基本的にimport文の書き換えだけで
対応できるはずです。そしてどさくさにまぎれてA3Arc,A3Image,Action3D,
VRMLのコンストラクタとupdateメソッドの引数からisEnableBehaviorと
labelとballoonの項目を削除しました。この項目はA3InitDataやA3UpdateDataの
デフォルトデータとして設定すれば同じ効果があるので、そちらで代用してもらうことになります。

2008,03/27
========================================

ActionBehaviorなどを大改造した．いまさらだけど，
シーングラフを操作するコードを全てBehaviorに移した．
動作が安定するのを期待したい(まだチェックしてない)．

CATALOG.XMLのa3要素で指定できるscaleやoffsetや
rotationを反映させる実装が，いい加減なものだったので
直した．ただ，そのいい加減な実装に従って既存のAcerola3D
ファイルが作られていたので，変更しないといけない．
結果的に互換性の無い変更となってしまっている．
具体的には各Boneのパーツの大きさがa3要素のscaleの影響を
受けるように変更されている．

CATALOG.XMLのp要素にscaleやoffsetやrotationが付けれる
ようになった．たぶん大丈夫だと思うけど要チェック．

2008,03/13
========================================

lg3d対応のための変更一応完了。A3Spaceを作る案は
廃止。使用方法は今までと変らない。ただ今のところ、
ピッキング関係はlg3dや既存のJava3Dに組込む場合には
使えないということであきらめた。どう変更したかというと、
A3Behaviorのカメラ制御部分をCameraBehaviorに
分離。A3BehaviorをA3Objectの一つ一つに付けるように
変更した。そして、A3BehaviorとCameraBehavior
の同期を取るための内部的な工夫を加えた。

2008,03/11
========================================

lg3d対応を強化しようと考えたら、いろいろ改善点が
見えてきた。今、いじっている途中。A3Canvasの処理の
一部を分割してA3Spaceというクラスを作った。A3Spaceは
既存のJava3DプログラムのシーングラフにAcerola3Dを
組込むためのBranchGroupのサブクラス。

これに付随してBehaviorも整理中。まだ問題が山積みなので、
TODOに少し書いておく。

2008,02/21
========================================

Project Looking Glass(lg3d)に対応させようと
あがいてみる．lg3d-coreに多少修正が必要だが
一応動くようになった．(サウンドはダメ？)

2008,01/20
========================================

フリーズを検査するためのコードをexamples
の中に置いた．検査するべし．

2008,01/16
========================================

Macでは，Switchノードの下にSoundノードを
ぶら下げてスイッチすると例外が発生して止る．
以下は関連してそうなページなのだが良くわからない．

* <http://archives.devshed.com/forums/java-118/small-fix-code-included-1639078.html>
* <http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4908425>

たしかWindowsでは音じたい鳴らないし，Linuxではまれに
X WindowごとFreezeする．とりあえずSwitchを使わないで，
子ノードをaddChildしたりDetachする実装に変更(戻し)して
みる．結果Linuxでは変化なし．WindowsやMacで動作確認するべし．

2008,01/15
========================================

ナビゲーションのWalkとFlyの違いを理解して
いなかった．修正してFlyモードの実装を加えた．
ナビゲーションのためのControllerはほぼ
完成した．

2008,01/11
========================================

ナビゲーションでスレッドが使えるように
拡張して，WalkControllerをスレッドを使って
実装しなおしました．

2008,01/07
========================================

また幾つかAPIを追加しました。でも追加なので、
以前のプログラムの変更は必要ないはず。また、
ナビゲーションモードをA3Boardから移植。
flyモード以外はほぼ動作する状態になった。

2008,01/04
========================================

Action3Dに現在のアクションナンバーとアクション名
返すAPIを追加しました。

2008,01/01
========================================

A3Canvasでバックグラウンドに指定されている
A3Objectはピッキングされないようにしました。
ヘッドライトのオン・オフの機能を追加しました。
それと、昨日の実験の戻し忘れがあったので戻しました。

2007,12/31
========================================

JCanvas3dというのが使えるようになっていたので、
試してみたが、たぶん自分のLinuxのX11の環境では
無理っぽい。元に戻したけど、コードの断片を残し
ておく。

それと、A3Object.getScale()メソッドを忘れて
いた。それと、それとA3ObjectのQuatの初期値が
(0.0,0.0,0.0,0.0)だったのを(0.0,0.0,0.0,1.0)に
変更した。

2007,11/02
========================================

examplesの中のサンプルプログラムで使用している
サンプルデータをexamplesディレクトリに追加した．
今まで，自分のノートでしか動かない状態だった
のに気がついていなかった．

ほったらかしだったa2パッケージのバグを一つ
とってみた．サンプルプログラムは動くようになった．

2007,10/22
========================================

やっとAPIの整理ができました．javadocも
a2パッケジをのぞいて書くことができました．
基本的な部分には変更はないですが，マイナーな
APIを一部変更しました．大きな変更ではないのですが，
一応けじめをつけるためにVersionを2に昇格させて，
バグ取りやドキュメントの充実のほうに注力して
ゆくようにしたいと思います．


2007,07/18
========================================

java3d 1.5.1のjoalが正式に出たので，色々整理した．
一応「j3d.audiodevice」というシステムプロパティを
調べてAudioDeviceを初期化するようにしてみた．
でも，java3d 1.5.1 with joalでしか動作確認は
していない．動作確認のためのa3ファイルとサンプル
プログラムも追加した．ヘッドホンで聞いてみると
少し(頭の？)場所がずれているような気がする．

いつの間にかexampleの中のサンプルが，A23.initA23()
が無いと「x-res://…」で例外が発生するようになっていた．
Action3D.loadなどのメソッドの中にA23.initA23()
を置いて例外が発生しないようにしておいた．


2007,07/10
========================================

重い腰をあげてjavadocでAPIが生成されるように，
ソースのコメントを作成しはじめた．不要なAPIが
publicになっているところなど多数あったため，
隠蔽するように変更した箇所がいくつかある．
本当に隠蔽して大丈夫かどうか，他のシステム
に組み込んで確認作業をするべし．

2007,06/20
========================================

読み込みが非常に遅くなっていた原因は，sableccの
バージョンアップであることが判明した．たぶん
使い方が悪いだけで調べれば直るのだと思うのだが，
時間がかかりそうなので，ver3.2からver2.18.2に戻す
ことにします．

2007,05/22
========================================

サウンドの再生ができるようになった．CATALOG.XML
ファイルの<a>要素の中に<s>要素を一つ入れることで，
サウンドの指定をする．属性は今のところ以下のような感じ．

* file:サウンドのファイル名
* loop:ループする(true)しない(false)
* type:PointSound or BackgroundSound
* gain:増幅率？(実数)
* offset:音の場所のオフセットPointSoundの時のみ有効

そろそろCATALOG.XMLのフォーマットの厳密な定義が必要．
今後の課題．

2007,05/20
========================================

APIちょっと変更。A23.initA23()を使わないで済むようにした。
だが、少しテストしてみたところ微妙な点があるようだ。はじめ
A23.initA23()自体を廃止しようと考えたが、残しておくことにして、
大抵の場合はA23.initA23()は必要無い、ということにしておく。
これに従いほぼ全てのサンプルにおいて一行削除。

A23.initA23()が必要な場合と、不必要な場合を明確にしておく
必要がある。今後の課題。

2007,05/19
========================================

大改造後の最初のリリースをversion1.10という
ことで出すことにする．基本的に，APIの変更は無いが，
内部構造は大きく変更されているので，バージョン番号は
6つ飛しにした．よってなにか安定性が必要な場合は
version1.03を使うと良いかも．


2007,05/12
========================================

subversionのコメントを真面目に書いてないので，
changelogを書くようにしてみる．さらにsableccの
java5対応のものがあったので，更新しておいた
(以前のはver2.18.2で，今回のは3.2)．これで，
数十個出てた警告のほとんどが消えたけど，一個だけ
残るみたい．残念．

2007,05/06
========================================

遡ってログ．連休中に大改造した．ただしAPIなどの変更は
基本的にはない．(オイラー角をセットするA3Object.setRot()
メソッドの追加だけはやった)．

変更したのはAction3Dの内部で使われている
クラスの構成などで，その目的はデータのキャッシュの実現と
将来の拡張性の確保．キャッシュは有効に機能してるようだ．
拡張性の確保に関しては以下のような拡張を想定している
(実際の拡張はまだやってない)．

* 音声データを含めるための拡張
* キャラクタの一部のShapをロード後に変更(着せ替えとか)
* モーションデータの汎用化

