[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Java3Djp:01606] Re: VRML の DEF について
■■■■■■■■■■■■■■ on-D ■■■■■■■■■■■■■■■■■
温泉行きたい!→on-D ■知って得する■ 『25ans』『OZmagazine』
秋の靴欲しい!→on-D ■情報サイト!■ 『anan』『non-no』『ELLE』
髪型変えたい!→on-D ■メジャー女性誌集合→『JJ』『With』『ViVi』…
■■■■■■■ http://www.on-d.co.jp/mailad/easyml3.html ■■■■■;
河村@カーネル です。
> 現在、Extensible 3D (X3D) Task Group(x3d.jar)のVRMLLoaderを使って、
> VRMLをJava3Dに展開しようとしています。
>
> ところが、VRMLのDEFで定義された名前の取得方法が分かりません。
> ViewPoint, PositionInterpolator, OrientationInterpolator, TimeSensorに
> つけられた名前を取得したいのですが…
> VrmlSceneのgetNamedObjects()、getDefineTable()で、それらしき
> HashTableが帰ってくるのですが、どのノードに名前がつけられているのか
> 分からないのです。
私が使っているのはx3d.jarの前身のvrml97.jarなのですが、VrmlSceneの
getNamedObjects()を用いてHashtableを取得し、シーングラフをトラバースし
て、各ノードをHashtableのcontainsValue()でチェックしてDEFされているも
のかどうかを調べるという方法をとっています。
具体的には、
private Hashtable defs; // DEFされたノードの一覧表
:
WrlLoader wrlLoader = new WrlLoader();
VrmlScene scene = wrlLoader.createSceneGraph(url);
defs = scene.getNamedObjects(); // DEFの一覧表を取得
BranchGroup bg = scene.getSceneGroup(); // シーングラフ取得
traverse(bg); // トラバース
:
// トラバースメソッド
private void traverse(Node node) {
// DEFされているかどうかのチェック
if (defs.containsValue(node)) { // DEFされている?
String defname = null;
Enumeration keys = defs.keys();
Object key = null;
while (keys.hasMoreElements()) {
key = keys.nextElement();
if (defs.get(key) == node) {
defname = key.toString(); // DEF名を取得
break;
}
}
if (defname != null) { // これは必ずtrueのはず
// DEFされている場合の処理
}
}
// 子ノードのトラバース
if (node instanceof Group) {
Group group = (Group)node;
for (int i = 0; i < group.numChildren(); i++) {
traverse(group.getChild(i));
}
}
}
などとしています。
==================================================================
株式会社カーネル PHONE 0298(57)7457 FAX 0298(57)7458
河村 進 E-MAIL kernel@xxxxxxxxxxxxxxx
==================================================================