[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