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

[Java3Djp:00773] [Q] set/get rotation



   ★★★ !!!注目!!! ★★★ 

 ━ フルカラー名刺屋さん ━━ URL http://www5.tokyoweb.or.jp/netcraft/
        カードクラフト                          ▲  Click ! ▲
 ● 速い!●  ご注文の翌営業日に出荷致します。
 ● 安い!●  80枚1500円(税別)全国送料無料。
 ● 綺麗!●  高品質なフルカラー名刺です。
-----------------------------------------------------------------------

小池です。

rotationのget/setで困っています。

オブジェクトの回転を取得して取っておき、後でそれを
戻してやろうと思い、やってみたところ、どうもうまく
行きません。値が変わってしまうようなのです。

実際に試してみたのが以下のコードです。

//--------
 public void test() {
  Quat4d q1 = new Quat4d();
  Transform3D t1 = new Transform3D();

  rootTransGroup.getTransform(t1);
  t1.get(q1);
  System.out.println("rotation(before): " + q1);

  t1.setRotation(q1);
  rootTransGroup.setTransform(t1);

  Quat4d q2 = new Quat4d();
  Transform3D t2 = new Transform3D();

  rootTransGroup.getTransform(t2);
  t2.get(q2);
  System.out.println("rotation(after ): " + q2);
  System.out.println("");
 }
// --------

やっているのは要するに、
 1. TransformGroupから回転のquaternionを取る
 2. それを同じTransformGroupにセットしなおす
 3. もう一度取得しなおしてみる

というだけなんですが、1.と3.の結果が違うことがあります
(たいていはほぼ同じ結果のようですが)。実際、画面上の
オブジェクトの向きや、時には形状までが、目で見てはっきり
わかるほど変わったりします。

以下は実際の出力の例です。

rotation(before): (0.9487330813320678, 0.09547507956603152,
-0.28822157133339066, 0.06051930353201575)
rotation(after ): (0.056878124459431835, 0.297896252880083,
0.26203257159799526, 0.652756385295138)

どうも、感触としてはQuat4dの第1項が(xの値が)0.9を超えて
いる場合に良く起こるような気がします。

ということから考えると、x,y,zのいずれかが1に近づいた場合、
計算によって丸め誤差が増幅されてしまうのが原因かな、と
思うのですが、不勉強でquaternionがどう扱われるものなのか
知らないのです(実は調べようとしてみたのですが、どうにも
私の手には余るようで、あきらめてしまいました)。

どなたか、原因がお分かりの方、教えてくださると嬉しいです。

また、私としては特にquaternionによる表現にはこだわらない
ので、回転の情報を取得・再設定する方法が他にないかと
思っています(たぶんTransform3Dの行列を丸ごと使用すれば
いいんだとは思うのですが、できれば回転だけを取りたいと
思っています)。どなたかいい手をご存知の方、教えて
いただけないでしょうか。

よろしくお願いします。




/* written by Koike,T. */