[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Java3Djp:00212] Transform3D
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■ ☆お店にない物を売るお店☆ ■
■ 平均50%のキャッシュバック!! ■
■ 比較見積りサイト! ■
■ http://digitalforest.co.jp ■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
(株)カーネルの小原と申します。
初めて投稿いたします。
私も仕事でJava3Dを使っておりまして、このメーリングリストは貴重な情報源と
して
活用させていただいております。
ところでさっそく質問なのですが...
Transform3Dクラスの動作について不明な点があります。
不具合か仕様か良く分からないのですが、Transform3DクラスにQuat4fをsetして
すぐ
getすると、値が変わってしまっているのです。
例をあげて説明いたします。
次のプログラム A はTransform3Dオブジェクトに適当に乱数で作ったQuat4fオブ
ジェ
クトをsetしてgetするだけのものですが、setする前とした後でQuat4fオブジェ
クト
の値が大幅に変わってしまうことがあります(実行結果 A)。
----- プログラム A ここから -----
import java.util.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class Test1 {
public static void main(String args[]) {
Random r = new Random(0);
for (int i = 0; i < 10; i++) {
// AxisAngle4fオブジェクト作成
float x = r.nextFloat();
float y = r.nextFloat();
float z = r.nextFloat();
float length = (float)Math.sqrt(x * x + y * y + z * z);
x /= length;
y /= length;
z /= length;
float angle = r.nextFloat() * 3.14f;
AxisAngle4f a4f = new AxisAngle4f(x, y, z, angle);
// Quat4fオブジェクト作成
Quat4f q4f = new Quat4f();
q4f.set(a4f);
// Transform3DオブジェクトにsetするQuat4fオブジェクトの値を出力
System.out.println(
"before : [" + q4f.x + ", " + q4f.y + ", " + q4f.z + ", " +
q4f.w + "]");
// Transform3DオブジェクトにQuat4fオブジェクトをsetしてgetする
Transform3D t3d = new Transform3D();
t3d.set(q4f);
t3d.get(q4f);
// Transform3DオブジェクトからgetしたQuat4fオブジェクトの値を出力
System.out.println(
"after : [" + q4f.x + ", " + q4f.y + ", " + q4f.z + ", " +
q4f.w + "]");
System.out.println("");
}
}
}
----- プログラム A ここまで -----
----- 実行結果 A ここから -----
% java Test1
before : [0.5255652, 0.5978053, 0.17294547, 0.5800861]
after : [0.10687813, -0.389673, -0.7072709, 0.5800861]<--ぜんぜん違う
before : [0.12979148, 0.062929146, 0.11208046, 0.9831745]
after : [0.12979147, 0.062929146, 0.11208046, 0.9831745]<--これは合って
いる
before : [0.22236033, 0.29082698, 0.123998225, 0.9222798]
after : [-0.19312605, -0.20814028, -0.26225933, 0.9222798]<--ぜんぜん違
う
before : [0.31500494, 0.5013362, 0.8053963, 0.027766071]
after : [-0.00908786, -0.016623145, 0.99943495, 0.027766058]<--ぜんぜん
違う
before : [0.18617156, 0.0048877024, 0.1993145, 0.9620759]
after : [0.18617156, 0.0048877043, 0.1993145, 0.9620759]<--これは合って
いる
before : [0.3443542, 0.3919231, 0.16143164, 0.83770895]
after : [0.16126758, -0.103197075, 0.5114556, 0.83770895]<--ぜんぜん違
う
before : [4.4288603E-4, 0.0021303452, 7.020277E-5, 0.9999976]
after : [4.4288606E-4, 0.002130345, 7.020277E-5, 0.9999976]<--これは合
っている
before : [0.38127548, 0.0064330464, 0.67259634, 0.6341938]
after : [0.64221853, -0.34474587, 0.25788355, 0.6341938]<--ぜんぜん違う
before : [0.06644669, 0.16081099, 0.3975371, 0.9009378]
after : [-0.19469383, 0.031825118, 0.38651335, 0.9009378]<--ぜんぜん違
う
before : [0.46732214, 0.016981006, 0.8831336, 0.037372068]
after : [0.98886484, 0.022013856, 0.14235531, 0.03737207]<--ぜんぜん違
う
----- 実行結果 A ここまで -----
というように、合っているほうが少ないくらいなのです。
この現象の原因をご存知の方はいらっしゃらないでしょうか?
私はこの現象を避けるため、暫定的に次のプログラムBのように一度 Matrix4fを
経由
してQuat4fを取得する方法をとっていますが、これよりも良い方法を採用してい
る方
はいらっしゃらないでしょうか?
----- プログラム B ここから -----
import java.util.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class Test2 {
public static void main(String args[]) {
Random r = new Random(0);
for (int i = 0; i < 10; i++) {
// AxisAngle4fオブジェクト作成
float x = r.nextFloat();
float y = r.nextFloat();
float z = r.nextFloat();
float length = (float)Math.sqrt(x * x + y * y + z * z);
x /= length;
y /= length;
z /= length;
float angle = r.nextFloat() * 3.14f;
AxisAngle4f a4f = new AxisAngle4f(x, y, z, angle);
// Quat4fオブジェクト作成
Quat4f q4f = new Quat4f();
q4f.set(a4f);
// Transform3DオブジェクトにsetするQuat4fオブジェクトの値を出力
System.out.println(
"before : [" + q4f.x + ", " + q4f.y + ", " + q4f.z + ", " +
q4f.w + "]");
// Transform3DオブジェクトにQuat4fオブジェクトをsetしてgetする
Transform3D t3d = new Transform3D();
t3d.set(q4f);
Matrix4f m = new Matrix4f(); // ※ 一度Matrix4fを経由する ※
t3d.get(m);
q4f.set(m);
// Transform3DオブジェクトからgetしたQuat4fオブジェクトの値を出力
System.out.println(
"after : [" + q4f.x + ", " + q4f.y + ", " + q4f.z + ", " +
q4f.w + "]");
System.out.println("");
}
}
}
----- プログラム B ここまで -----
----- 実行結果 B ここから -----
% java Test2
before : [0.5255652, 0.5978053, 0.17294547, 0.5800861]
after : [0.5255652, 0.5978053, 0.17294545, 0.5800861]
before : [0.12979148, 0.062929146, 0.11208046, 0.9831745]
after : [0.12979148, 0.062929146, 0.11208046, 0.9831745]
before : [0.22236033, 0.29082698, 0.123998225, 0.9222798]
after : [0.22236033, 0.29082698, 0.12399822, 0.9222798]
before : [0.31500494, 0.5013362, 0.8053963, 0.027766071]
after : [0.31506535, 0.50143254, 0.80555123, 0.027760733]
before : [0.18617156, 0.0048877024, 0.1993145, 0.9620759]
after : [0.18617156, 0.004887703, 0.1993145, 0.9620759]
before : [0.3443542, 0.3919231, 0.16143164, 0.83770895]
after : [0.3443542, 0.3919231, 0.16143164, 0.83770895]
before : [4.4288603E-4, 0.0021303452, 7.020277E-5, 0.9999976]
after : [4.4288603E-4, 0.0021303452, 7.020277E-5, 0.9999976]
before : [0.38127548, 0.0064330464, 0.67259634, 0.6341938]
after : [0.38127548, 0.006433032, 0.67259634, 0.6341938]
before : [0.06644669, 0.16081099, 0.3975371, 0.9009378]
after : [0.06644669, 0.16081099, 0.3975371, 0.9009378]
before : [0.46732214, 0.016981006, 0.8831336, 0.037372068]
after : [0.46731472, 0.016980613, 0.88311964, 0.03737266]
----- 実行結果 B ここまで -----
これだと、ぴったり合います。(無視できるわずかな誤差はありますが。)
以上です。
これについて何か情報をお持ちの方はお教えいただけると幸いです。
==================================================================
株式会社カーネル PHONE 0298(57)7457 FAX 0298(57)7458
小原 一太朗 E-MAIL kernel@xxxxxxxxxx
==================================================================