---------------------------------------------------------------------
(---)A3CanvasInterfaceを実装するクラスにおいてシーンの概念を
     導入する。例えば、ゲームタイトルのシーン、ゲームのメインの
     シーン、ゲームオーバーのシーンなどを作ることができアクティブな
     シーンを切り替えることで簡単に表示が切り替えられるようにする。
     既存のA3CanvasIntarfade.add()などは常にアクティブなシーンに
     対する操作ということにして互換性を維持して拡張すること。 

     A3CanvasIntarfaceに追加すべきメソッドをメモしてみる．
     void changeActiveScene(int s);
     int getActiveScene();
     void add(A3Object a3,int scene);
     void del(A3Object a3,int scene);
     void delBackground(int scene);
     A3Object getAvatar(int scene);
     ...

     A3CanvasIntarfaceで動作を変更すべきメソッドをメモしてみる．
     void delAll();
     ...

     いや，思ったより大変かも．
---------------------------------------------------------------------
(---)A3CanvasInterface.setCameraLoc(0.0,0.0,100.0)とかにすると
     かたまる．A3VirtualUniverse内のpickingBehavior.setSchedulingBounds()
     で設定するBoundingSphereの半径を100000.0とかにすると回避できるのだが，
     根本的にBoundingSphereの使い方を整理しないといけない．
     javax.media.j3d.ViewのsetFrontClipDistanceと
     setBackClipDistanceの値も整理しないといけないかと
     思ったけど、これはViewを含むTransformGroupのスケールが
     効いてるのでfront:0.1,back:100.0固定でいくことにする。
     ついでに、カメラのスケールを必要とする場面や、
     ナビゲーションスピードなどについてもあわせて考えること。

以下メモ．

BoundingSphereのある場所

A3Background: 1
  background.setApplicationBounds(bs); //100.0
A3Fog: 1
  fog.setInfluencingBounds(bs); //100.0
A3Object: 1
  behavior.setSchedulingBounds(bs); //10.0
A3VirtualUniverse: 3
  timerBehavior.setSchedulingBounds(bs); //10.0
  headLight.setInfluencingBounds(...); //100.0
  pickingBehavior.setSchedulingBounds(**sb**); //100000.0
Action3DData: 1
  sound.setSchedulingBounds(boinding); //100.0
ActionBehavior: 1
  this.setSchedulingBounds(bounding); //100.0
SkeletonBehavior: 1
  this.setSchedulingBounds(bounding); //100.0

---------------------------------------------------------------------
(---)吹き出しの位置の調節のための座標の指定が，キャラクタ座標系に
     なっているけど，カメラ座標系に変更するべき．
---------------------------------------------------------------------
(---)UpperDirectionの情報は、実はキャラクタを読み込む際に上方向を調節する目的と、
     AutoDirectionControlで方向を計算する目的の二つで利用している。これは本当は
     分けた方が良いかもしれない。そして、特にAutoDirectionControlの計算に使用する
     物の方は上方向ベクトルで直接与えることができるようにして自由度を上げるように
     した方が良いかもしれない。
---------------------------------------------------------------------
(**-)catalog.xmlに含めるRDFの参考としてAdobe XMPを研究してみる。
     http://www.adobe.com/devnet/xmp/pdfs/xmp_specification.pdf
     どうも主語はrdf:about=""で良い感じ。(Notation3なら<>)
---------------------------------------------------------------------
(---)Freezeを改善するために入れたAction3D.change()関連のsynchronizedのせいで、
     デッドロックが発生しているっぽい。
---------------------------------------------------------------------
(---)catalog.xmlのにp要素にscale,offset,rotをつけたので対応すべし。
---------------------------------------------------------------------
(---)autoActionControl関係のコードをA3BehaviorからActionBehaviorに移す。
---------------------------------------------------------------------
(---)ActionBehaviorはActionごとにインスタンスを作っていたけど、
     Action3Dオブジェクト1つに1つとなるように変更すべし。
     そして、シーングラフを変更する多くのコードをこのBehaviorに
     移動させるべし。
---------------------------------------------------------------------
(---)A3ObjectのデフォルトがisInterpolate=falseになっているが、
     いっそのこと、trueにしたほうが良くないだろうか？
---------------------------------------------------------------------
(---)Action3Dのフォーマットで省略可能なデータをはっきりさせる
     ことと、本当に省略してエラーにならないかどうかの確認。
---------------------------------------------------------------------
(---)Action3DDataオブジェクトは、キャッシュされて再利用される
     データなので、変更可能なデータが入っているのはおかしい。
     今のところ、defaultActionNo;walkActionNo;runActionNo;
     minWalkSpeed;minRunSpeed;あたりがダメ。でもファイルから
     読んだデフォルト値だとすればOK。
---------------------------------------------------------------------
(---)Freezeすることが良くある．まずは原因究明．
     * Linuxではあまりないが，Soundを使ったAction3Dのchangeの瞬間に
       Freeze．sound.setEnable(...)をコメントアウトしたらFreezeしな
       くなった．またはJOALMixerのかわりにJavaSoundMixerを使えば
       Freezeしない．
     * Window,MacではよくFreezeする．soundが無くてもFreezeする．
       何のタイミングなのか要調査．
---------------------------------------------------------------------
(---)ずっと見えないふりをしてきた，衝突判定に関して何か対策を
     考えるべし．
---------------------------------------------------------------------
(---)virtualCSToCanvas()とvirtualCSToPhysicalCS()と、
     physicalCSToVirtualCS()とcanvasToPhysicalCS()、
     canvasToVirtualCS()、など、Vector3d,Point3d,Tuple3dの
     使い分けを考えたほうが良いかも。
---------------------------------------------------------------------
(*--)そろそろCATALOG.XMLのフォーマットの厳密な定義が必要．
---------------------------------------------------------------------
(---)sableccのバージョンを3.2にアップさせると読み込みが非常に遅く
     なる．もし，それが回避できるなら3.2を使いたい．
---------------------------------------------------------------------
(*--)A23.initA23()が必要な場合と、不必要な場合を明確にしておく必要がある。
---------------------------------------------------------------------
(*--)データ構造など変更して大幅にプログラムを書き変えた．様子を見よ．
     変更点は，主に将来的な拡張を見込んだデータ構造の変更．
     拡張とは，着せ替え，音声データ，モーションデータの汎用化など．
---------------------------------------------------------------------
(*--)RDFでメタデータを埋め込むことを考慮するべし。
---------------------------------------------------------------------
(**-)Java3DのSceneGraphObjectクラスにあるような
     setUserData(Object o),getUserData()メソッドを
     A3Objectに付けたらどうだろう．Hashとかを使う必要が
     なくなる？つけたけど、まだテストしてない。
---------------------------------------------------------------------
(*--)昔懐しのSunの実装したVRMLローダがjava.netで引き継がれることに
     なったもよう．これに乗り換えた．そしてSoundの再生に着手したけど，
     まだ不完全，j3d-vrml97のソースを2バイトだけいじって一応音がでる
     ようにした．(Sound.javaの//setClip()こコメントを外しただけ)
---------------------------------------------------------------------
(---)RZipURLConnectionのgetContentLengthの値がどうしてこうなるかわからない。
(*--)Action3D.change()をAction3D.changeImmediatly()にして、
     もともとのchange()を待ち行列を利用した実装にする。つまり、複数のアクションを
     スムーズに連続させる機能。待ち行列があふれるという問題も発生するが…。
     待ち行列のサイズの上限を3にして実装してみた。一応動くが、プログラムが
     整理されていない。pauseモードのときに、アクションが切り替わらないバグが
     発生。もう少し実際使ってみて調整するべし。
(---)[A]Node.cloneNode(),Node.duplicateNode()あたりを勉強して利用する。
(---)[A]の利用がポイントだが、キャッシュに保存する内容をAction3D自体にしたい。
     さらに、Action3Dクラスにキャッシュ操作のためのメソッドを付け加えるべし。
     例えばAction3D.cleanCash(Action3d a)。そうすれば今までのキャッシュは
     必要なくなる。Javaの参照オブジェクト(java.lang.ref.*)あたりも勉強。
(---)[A]に依存するが、Java3Dの構成を練り直して、着せ替え人形機能を実現する。
(---)[A]を利用しつつ、BVHの切り替えをサポートするべし。ただし、この方法を実現
     するには、BVHのBoneを省略できるという機能があだになる。
(**-)Acerola3Dでは+Yが上方向で、VESMAでは+Zが上方向だけど、
     どうしよう？一応A3Canvas.setCoodinateType()を作った。
     さらに自由度に座標系を設定できるようにできるはず。
(---)カメラの自動制御
(**-)速度を検出して、自動的にActionを変更する機能。3Dの方だけ完成
(**-)3Dの場合、オブジェクトの向きを進行方向に自動的に向けてやる機能
     だいたいできたけど、こういう機能は、上方向というのを指定して、
     それを考慮したプログラムにしたほうが良い。
(---)A2の読み込み時に画像ファイルが無いとかたまる．
(---)今のところあまり関係ないけど、A3Canvasの上にswingのメニューを
     重ねるにはJPopupMenu.setDefaultLightWeightPopupEnabled(false);
     とすれば良いらしい。
(---)今のところあまり関係ないけど、A3Canvasの上にswingのツールチップスを
     重ねるにはToolTipManager.sharedInstance().setLightWeightPopupEnabled(false);
     とすれば良いらしい。
(*--)Proxyの設定をシステムから読み込む。
     一応動くようになったけど、まだ隙だらけ(ftpとか)。
(---)A3Viewerで一度読み込みに失敗すると次回の読み込み時に
     MaltipleParentExceptionがスローされる．
(---)A3のCATALOG.XMLで、scaleとloopアトリビュートを省略可に
     した。それぞれデフォルトは1.0,falseにした。どっか、マニュアル
     かなにかで明記するべし。それとscaleした後にoffsetを適用する
     ということも明記するべし。
(*--)キャラクタなどの場合に，原点をどこにおくべきなのか？
     (キャラクタの中心を原点にすると，足とかが地面に埋まる)
     についての標準的な考え方を示す．(ちょっと逃げを打ったような
     感じだが、<a>タグでoffsetアトリビュートを使えるようにして
     この問題を一時的に回避した。つまり、用途によって、このoffset
     アトリビュートを書換えたA3ファイルを用意して使用するというぐあいに。
     でも、キャラクタのボリュームを表記するタグをあたらしく付けるのが
     良い？？？簡単な当り判定にも使えるかも)
(---)Action3Dにおいて、モーションキャプチャデータをBVHに限定したり、
     3DジオメトリデータをVRMLに限定する必要はないので、<a>タグの
     bvh,wrlというアトリビュート名をもっと一般的なものにしたほうが
     良いかも？！いや、BVH,VRMLに限定すべき！！？
(---)xj3dのバグ？wrlファイルの中にCone,Cylinderが入ってるとエラーが出る。
(**-)A3の効率を上げる。だいぶましになったがもうちょっといけるはず。
(---)ステータスバーの表示がおかしい
(---)スレッドセーフになってないと思うので、
     スレッドセーフにしたい。(いちおうA3Loader.loadだけsynchronized
     にしておいた。)
(---)Xj3Dだいぶ新しくなったようなのでjavax.media.j3d.Switchが使えるかも(M9ではだめだった)
(---)サウンドが読めない？AudioClip checkValidContentType???
(**-)A3の読み込み時にエラーが発生した時に、そのエラーの原因を
     ちゃんとエラーメッセージとして表示する。
(**-)Action3Dという名前がすでに使用されてる。他の名前に変更する必要あり
     Acerola3Dに変更した。ただ、クラス名とかにはまだAction3Dを使ってる。
----------------------------------------------------------------------
Acerola3Dファイルフォーマット自体の拡張
(---)BVHを拡張してscaleを入れれるようにする。
(*--)オーディオ情報を入れれるように拡張する。直接VRMLファイルの中にいれると良いと思う。
     まだ、音はでない。
(---)着せ換え人形機能の搭載
(*--)jarsignerの署名に対応すると良いかも。署名するとなぜか読めなくなる
     解凍してもう一回固め直すと読める。
----------------------------------------------------------------------
終了～。
(***)A2、A3共にget2DUIData()とかの中で数字でも渡せるように拡張
(***)A3の読み込みでテクスチャを使えるようにする。
(***)ActionGeneratorの146-行目、BVHBehaviorの42-,56-行目で
     軸をいじっている。このへん、どう整理するか？<--普通にY軸を上で
     読み込むようにした。VESMAで使うときには、VESMAの方で、Y軸
     が上になるように変換している。
(***)JavaWebStartにしたときに、getResourceの引数の書き方で、
     スラッシュから初めるとエラーになるらしい。
(***)www.j3d.orgにLightweightComponentとJava3DのFAQがある
     はずなのでチェックするべし。
(***)BVHBehaviorは関節に一個でなく、アクションに一個で足りない？
(***)Action.javaの中でTransformGroupのtg0とtg1は一つに
     結合できるような気がする
(***)BVHのROOTに対応するパーツにWRLが対応づけされないようだ．
(***)Windowsのファイルシステムの一部で，CATALOG.XMLという大文字の
     ファイル名がcatalog.xmlになってしまうという現象があるので，
     catalog.xmlでも良いことにするべし．どういうこと？(-"-;)
(***)Action3Dにコマ送り機能(？)を付ける。
(***)A3Panelなるものを作ったり、Action3Dにグローバル座標や、
     グローバル座標に対するQuatを持たせて、Java3Dを全然
     インポートしなくてもAction3Dを使えるようにする。
(***)JavaWebStartでは、コアの部分をライブラリ化して
     A3ViewerとA2Viewerの二つを用意する。
(***)コメント記入場所の作成
(***)著作権情報記入場所の作成。コメントのところに入れることにした。
(***)Action3D.setAutoActionControl()だが、これには、
     アクションのコントロールだけでなく、正面方向の
     コントロールも含まれるが、これはA3Objectの機能に
     移すほうが良い。APIの変更が必要。
     (メソッド名はsetAutoDirectionControl(boolean b))
(***)A3Canvas.setCoordinateSystemType()の引数を列挙型にすべし。
     (メソッド名はsetUpperDirection(A3Canvas.UpperDirection ud)に変更)
(***)sableccのjava1.5の文法に対応したやつがないかチェクする．
     (あったけど，なぜか遅い．要調査．)
(***)lg3d対応する時に気が付いた．A3Behaviorは全てのA3Objectで
     共有しているので、A3Object.getNode()で得られるNodeをlg3dで
     使う時にはA3Behaviorは無効でA3Object.setLoc()などが動かない。
     最初BranchGroupを継承したA3Spaceというクラスを作ってA3Canvas
     の機能を分割するつもりでいたけど、やっぱりシンプルにいきたいので
     以下のようにする。
     -----
     (1)Behaviorの数は増えるけど、Behaviorのスケジューリング領域
        とか実行カリングの機能を有効活用するためにA3Behaviorは
        A3Object一個ずつに付けるようにする。
     (2)それに従ってA3Behaviorの中に含めていたカメラの処理を
        CameraBehaviorというクラスに分離。
     (3)A3Behaviorの全てと,CameraBehaviorを同期させるための
        TimerBehaviorというのを作る。(そうしないとTextExec12が
        ブルブルになる。)
     (4)A3Behaviorは、デフォルトでは
        100ミリ秒間隔でWakeupするようになっているが、
        A3Canvas.add()などの処理の時にTimerBehaviorのインスタンスを
        渡してやることでTimerBehaviorで同期させるようにする。
     (5)ActionBehaviorはとりあえず、そのまま使う。
     (6)PickingBehaviorはlg3dではとりあえずあきらめる。
     -----
     同期させる方法だけど、TimerBehaviorは100ミリ秒間隔での
     processStimulus()が呼ばれるようにしておいて、このメソッドの
     中でpostId(1)を実行し、A3BehaviorとCameraBehaviorはこれを
     WakeupOnBehaviorPostでキャッチして実行する。ただし、この説明は
     同期した後の話で、同期前は今までのように100ミリ秒で自前で動作
     するようにする。
