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

[Java3Djp:00422] [Q] dynamic node operation 2



----PR------------------------------------------------------------------
◆◆◆◆◆◆◆◆◆◆◆   Fitness Shop  ◆◆◆◆◆◆◆◆◆◆◆
◆ ホームトレーニーにとって夢のようなダンベルとは? パワーブロックだ!◆
◆◆  ピンの位置を変えるだけで重量が細かく変化する不思議なダンベル  ◆◆
◆◆◆  世界で注目のホームトレーニング用品すべてが、ここにある!  ◆◆◆
◆◆◆◆◆◆◆   http://www.aeon-mall.co.jp/FitnessShop/  ◆◆◆◆◆◆◆
------------------------------------------------------------------------


石川 です。

先日も同じ質問をしたのですが、やはりBranchGoup ノードに
対して、子(TransformGroupなど)を動的に追加できません。
また、ALLOW_CHILDREN_EXTENDを設定しても結果はおなじでした。
私自信がなにか勘違いしているとおもうのですが、原因が分か
らないので投稿しました。

製作しているプログラムは、b をタイプすれば、画面上に
球が一つ表示されるものです。

実行時のエラーは、

javax.media.j3d.RestrictedAccessException: Group: only a BranchGroup node may be added
        at javax.media.j3d.Group.addChild(Compiled Code)
        at WorldViewer002.keyTyped(Compiled Code)
        at java.awt.Component.processKeyEvent(Compiled Code)
        at java.awt.Component.processEvent(Compiled Code)
        at java.awt.Component.dispatchEventImpl(Compiled Code)
        at java.awt.Component.dispatchEvent(Compiled Code)
        at java.awt.EventQueue.dispatchEvent(Compiled Code)
        at java.awt.EventDispatchThread.run(Compiled Code)
 
です。

あまりきれいなソースではないですが、以下にソースを掲載します。
よろしくお願いします。

では。

--- ここから

import java.applet.Applet;
import java.awt.BorderLayout;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.*;
import java.awt.event.*;
import com.sun.j3d.utils.geometry.*;

public class WorldViewer002 extends Applet implements KeyListener{

    BranchGroup scene = new BranchGroup();

  // 追加するノード
  public TransformGroup maru(){
       TransformGroup tg  = new TransformGroup();
       tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ 
                      | TransformGroup.ALLOW_TRANSFORM_WRITE
                      | Group.ALLOW_CHILDREN_EXTEND
                      | Group.ALLOW_CHILDREN_READ
                      | Group.ALLOW_CHILDREN_WRITE);

       Primitive primitive=new Sphere(0.5f);             
       tg.addChild(primitive);
                  
       return tg;
  }

   //追加されるノード
   public BranchGroup createSceneGraph() {
	// Create the root of the branch graph
        BranchGroup objRoot = new BranchGroup();

       objRoot.setCapability(Group.ALLOW_CHILDREN_EXTEND 
                          | Group.ALLOW_CHILDREN_READ 
                          | Group.ALLOW_CHILDREN_WRITE
                          | BranchGroup.ALLOW_DETACH);
        objRoot.compile();
        return objRoot;
    }


   public void keyPressed(KeyEvent evt){}
   public void keyReleased(KeyEvent evt){}

   //ノードの追加操作  
   public void keyTyped(KeyEvent evt){

      char keyChar = evt.getKeyChar();

      if(keyChar == 'b'){
        TransformGroup tmp = maru();
        scene.addChild(tmp);         
      }
   }

    //コンストラクタ
    public WorldViewer002() {

	setLayout(new BorderLayout());
        Canvas3D c = new Canvas3D(null);
        c.addKeyListener(this);
	add("Center", c);

        scene = createSceneGraph();
        SimpleUniverse u = new SimpleUniverse(c);

        u.getViewingPlatform().setNominalViewingTransform();

	u.addBranchGraph(scene);
    }

    //メインルーチン
    public static void main(String[] args) {
	new MainFrame(new WorldViewer002(), 500, 500);
    }

}

--- ここまで

                                                         奈良先端科学技術大学院大学
                                                                     情報科学研究科
                                                                          石川 正敏
                                                        masato-i@xxxxxxxxxx