[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Java3Djp:02037] Re: Transform3D.r otX() について



------------------------- infoseek ML Sponsor --------------------------
■■■■■■■■ キャッシングならキャッシュワン ■■■■■■■■■
┏━━┓┏1.入会金・年会費・ATM手数料一切不要!━━━━━━━━┓
<特徴>┃2.実質年率15.0〜18.0% 1万円からのキャッシング    ┃
┗━━┛┗3.【今なら5万円商品券も当る!10月1日〜11月30日まで 】━┛
東京三菱キャッシュワン ⇒ http://www.p-advg.com/?bid=11321 
------------------------------------------------------------------------


古川です。

> これは TransformGroup がひとつで、
> そこに合成行列(Transfom3Dどうしの合成)を適用する場合でしょうか?

すみません。質問が不適切でした。
シーングラフ中のT3D1,2とT3D1.mul(T3D2)のT3D1,2は
全く別物です。

もう一度質問をし直します。
少し長くなりますがご了承ください。

シーングラフは前と同じです。
> SU
 >   |
 > TG1 : T3D1をセット
 >   |
 > TG2 : T3D2 をセット
 >   |
 > S3D

簡便化のため、TG1,TG2,T3D1,T3D2はいずれもnewした直後と
します。

そして、z軸回りにPI/4回転するT3Dをあらわすt3dZrotと
x方向に1.0移動するT3Dをあらわすt3dXtransを作成し、
その合成行列をt3d2に作用させます。
合成する順番としては、まず移動をして回転させます。

ソースで書くと以下のようになると思います。

1. t3dXtrans.setTranslation(new Vector3d(1.0,0.0,0.0));
2. t3dZrot.rotZ(Math.PI/4.0);
3. t3dZrot.mul(t3dXtrans);
4. t3d2.mul(t3dZrot); ←t3d2がnew直後なのであまり意味無いです。
5. tg2.setTransform(t3d2);

この処理の結果、物体は(1/SQRT(2), 1/SQRT(2), 0)の位置で
PI/4回転した形で表示されます。

この一連の処理を私は以下のように考えています。

1, 一連のmulコマンドによって t3d2 = t3d2 x t3dZrot x t3dXtrans となり、
   tg2にt3d2がsetされる。
2. 処理は合成行列t3d2の右から実行される。
   つまり t3dXtrans - t3dZrot - t3d2 の順番で行われる。
3. まず、t3dXtrans により、tg2のローカル座標系が上位座標系である
  tg1のローカル座標上の(1.0, 0.0, 0.0)の位置へ移動する。
    いまはtg1とワールド座標系は同一なので、ワールド座標系表示の
  (1.0, 0.0, 0.0)ベクトル方向へ1.0移動する。
4. 次にt3dZrotにより、tg2がtg1のz軸(ワールド座標表示で原点における
  (0.0, 0.0, 1.0)ベクトル)まわりにPI/4回転する。原点を中心に公転するイ
メージです。

この結果、物体は(1/SQRT(2), 1/SQRT(2), 0)の位置で
Z軸に対しPI/4回転した形で表示されます。

一方、田中氏の書籍に従うと一連の処理は以下のように
解釈されます。

1. 処理は t3d2 - t3dZrot - t3dXtrans の順番で行われる。
2. まずt3dZrotにより、"tg2"のローカル座標系のz軸(ワールド座標表示で
  (0.0, 0.0, 1.0))まわりにPI/4回転する。
    物体は原点でz軸回りにPI/4回転した状態になります。
3. 次にt3dXtrans により、"tg2"のローカル座標上の(1.0, 0.0, 0.0)の位置へ
  移動する。
  tg2はz軸回りの回転によりxの正の向きがワールド座標系表示で
  (1.0, 1.0, 0.0)ベクトルとなっているので、結果として物体は
  (1/SQRT(2), 1/SQRT(2), 0)の位置で PI/4回転した形で表示されます。

両者の見解は以下の点で異なります。
1. mul された合成行列が処理される順番(右からか左からか)
2. rot, translate される場合に参照する座標系(tg1かtg2か)

結果は同じですが、解釈は全く異なります。

両者の違いは、以下に示す移動と回転を逆にした場合にも
見られます。
私の解釈では回転させた後に移動させる場合です。

ソースは以下のようになると思います。

1. t3dXtrans.setTranslation(new Vector3d(1.0,0.0,0.0));
2. t3dZrot.rotZ(Math.PI/4.0);
3. t3dXtrans.mul(t3dZrot);
4. t3d2.mul(t3dXtrans);
5. tg2.setTransform(t3d2);


この処理の結果、物体は(1.0, 0.0, 0.0)の位置で
PI/4回転した形で表示されます。

この一連の処理を私は以下のように考えています。

1, 一連のmulコマンドによって t3d2 = t3d2 x t3dXtrans x t3dZrot となり、
   tg2にt3d2がsetされる。
2. 処理は合成行列t3d2の右から実行される。
   つまり t3dZrot - t3dXtrans - t3d2 の順番で行われる。
3. まず、t3dZrotにより、上位座標であるtg1のローカル座標系の
  z軸(ワールド座標表示で原点における (0.0, 0.0, 1.0)ベクトル)まわりに
  PI/4回転する。
    物体は原点でz軸回りにPI/4回転した状態になります。
4. 次にt3dXtrans により、上位座標系であるtg1のローカル座標上の
  (1.0, 0.0, 0.0)の位置へ移動する。
    いまはtg1とワールド座標系は同一なので、ワールド座標系表示の
  (1.0, 0.0, 0.0)ベクトル方向へ1.0移動する。

この結果、物体は(1.0, 0.0, 0.0)の位置で
PI/4回転した形で表示されます。

これを田中氏の解釈で説明すると、

1. 処理は t3d2 - t3dXtrans - t3dZrot の順番で行われる。
2. まず、t3dXtrans により、tg2のローカル座標系の(1.0, 0.0, 0.0)の位置へ移動
する。
    ワールド座標系表示の(1.0, 0.0, 0.0)へ移動します。
3. 次にt3dZrotにより、"tg2"のローカル座標系のz軸(ワールド座標表示で
  (1.0, 0.0, 0.0)の位置における(0.0, 0.0, 1.0)ベクトル)まわりにPI/4回転す
る。
  つまりその場で自転します。
    物体は(1.0, 0.0, 0.0)でz軸回りにPI/4回転した状態になります。

繰り返しになりますが、実行結果は同じでも
解釈は全く異なります。
両者の見解は以下の点で異なります。
1. mul された合成行列が処理される順番(右からか左からか)
2. rot, translate される場合に参照する座標系(tg1かtg2か)

かなりこんがらがってきてしまっていて
とんちんかんなことを書いているかも知れませんが
コメントをお願いします。

-----
古川


------------------------------------------------------------------------
  ★豪華賞品が呼んでいるぅ〜。『あなたのプロバイダーはなぁ〜にぃ〜?』
          http://ap.infoseek.co.jp/navi.html