[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
==================================================================