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

[Java3Djp:02038] Re: Transform3D.rotX() について



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


えんどうです。

> 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);

これ 4. は不要で、5. で tg2.setTranslation(t3dZrot) とやっても
全く同じだと思います。

> 3. まず、t3dXtrans により、tg2のローカル座標系が上位座標系である
>   tg1のローカル座標上の(1.0, 0.0, 0.0)の位置へ移動する。
>     いまはtg1とワールド座標系は同一なので、ワールド座標系表示の
>   (1.0, 0.0, 0.0)ベクトル方向へ1.0移動する。

ええと、t3dXtrans.setTranslation(new Vector3d(1.0,0.0,0.0)); の時点では
まだ TransformGroup に対して何の操作も加えられていませんので、
x方向への移動量が1.0な行列ができるだけです。

> 4. 次にt3dZrotにより、tg2がtg1のz軸(ワールド座標表示で原点における
>   (0.0, 0.0, 1.0)ベクトル)まわりにPI/4回転する。原点を中心に公転するイ
> メージです

t3dZrot に対して t3dXtrans を乗算するのですから、それは間違いです。

簡略化のため t1, t2 として書いてみました。

import javax.media.j3d.Transform3D;
import javax.vecmath.Vector3d;

public class T3DTest 
{
   public static void main(String[] args) 
     {
	Transform3D t1 = new Transform3D();
	System.out.println(t1); // 初期状態を見ておく

	t1.setTranslation(new Vector3d(1.0, 0.0, 0.0));
	System.out.println(t1); // t1のX軸移動
	
	Transform3D t2 = new Transform3D();
	t2.rotZ(Math.PI/4.0);
	System.out.println(t2); // t2の回転
	
	t2.mul(t1);
	System.out.println(t2); // 乗算
     }
   
}

実行結果はこうです。

1.0, 0.0, 0.0, 0.0 // 初期状態
0.0, 1.0, 0.0, 0.0
0.0, 0.0, 1.0, 0.0
0.0, 0.0, 0.0, 1.0

1.0, 0.0, 0.0, 1.0 // 移動(t1)
0.0, 1.0, 0.0, 0.0
0.0, 0.0, 1.0, 0.0
0.0, 0.0, 0.0, 1.0

0.7071067811865476, -0.7071067811865475, 0.0, 0.0 // 回転(t2)
0.7071067811865475, 0.7071067811865476, 0.0, 0.0
0.0, 0.0, 1.0, 0.0
0.0, 0.0, 0.0, 1.0

0.7071067811865476, -0.7071067811865475, 0.0, 0.7071067811865476 // 乗算(t2)
0.7071067811865475, 0.7071067811865476, 0.0, 0.7071067811865475
0.0, 0.0, 1.0, 0.0
0.0, 0.0, 0.0, 1.0

乗算は、すでに回転している t2 に対して移動を適用するのですから、

	t2.mul(t1);

すでに回転した座標系の x 方向に 1.0 移動します。

# 何か変ですか...?

このMLでは定番ですが、

 javax.vecmathパッケージ詳説 Java 3Dの数学
 http://objectclub.esm.co.jp/vecmath/vecmath.pdf

は読まれましたか...?

-- 
ENDO Yasuyuki <yasuyuki@xxxxxxxxxxxx>
http://www.javaopen.org/yasuyuki/ (Personal/Japanese Only)
http://www.javaopen.org/jfriends/ (Japanese Only)


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