[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. */