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

[Java3Djp:01088] Re: Re: [Q] マウスで複数のオブジェクトを別々に動かす方法



:::::::::::::::::::::::::::::::::::::::::::::::::::::::
     <<<<なかよしみんなで楽しいおしゃべり!>>>>
             大学・幼なじみ・同期入社
         DNSのMLならみんなずっと一緒!
          運用簡単・快適めーりんぐりすと
         http://www.dns-ml.co.jp/ml.html
:::::::::::::::::::::::::::::::::::::::::::::::::::::::

タナカ@商船大です。

アドバイスありがとうございます。-> えんどうさん

 >> 
 >> Exception in thread "main" javax.media.j3d.RestrictedAccessException: Cannot mod
 >> ify capability bits on a live or compiled object
 >> 
 >> という例外が出て、実行することができません。
 >
 >エラーの出ている箇所の前後のソースコードが見たいです。(数行でかまいません)

問題のソースは、以下のようなものです。
省略してよい部分がよく分からないので、
照明設定ぐらいしか省略できませんでした。(すいません)


[ 説明 ]
Shoulderクラスには、3Dモデルのロード関連のメッソドと、
MouseMotionEventAdapterクラスから変数(Yangle)を変更
できるように、static関数(Rotation(double angle))を作
りました。
(Shoulderオブジェクト経由で、MouseMotionEventAdapter内から、
Shoulderのローカル変数にアクセスしようと、Shoulderオブジェク
トを生成すると実行時に、NullPointerExceptionが出てしまったの
で、苦肉の策でこうしてみました。)

このプログラムを単体で起動する分には、良いのですが、
以下のSym.javaプログラムで、BranchGroupにShoulderオ
ブジェクトをぶら下げようとすると、実行時に上記の例外
が出てしまいます。


自分の中では、static関数が問題なのだと思うのですが
私自身のプログラミングの基礎理解がしっかりしていな
いため、明確な問題点がわかりません。

自分なりにも勉強してみますが、アドバイスをよろしくお願いします。

---------------------------- Shoulder.java -------------------------------------
import java.io.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.loaders.objectfile.ObjectFile;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.IncorrectFormatException;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.*;

public class Shoulder extends Applet {
   // 3Dモデルのランタイム時に位置変更する要素については、
   // staticにして外部から直接アクセスできるようにした。
   public static TransformGroup shoulderTrans = null;	// 属性設定
   public static Transform3D shoulderT3d = null;	// オブジェクトの位置設定
   public static double Yangle;				// モデルのY軸周り角度
   public double scale;					// モデルの縮尺
   public Vector3f position = null;			// モデルの位置

   private boolean noTriangulate = false;
   private boolean noStripify = false;
   private double creaseAngle = 60.0;
   private Canvas3D canvas = null;
   private String filename = null;

   private MouseMotionEventAdapter mouseMotionEvt= null; //マウス動的イベント用

   public Shoulder() {
	filename = "shoulder.obj";   // 3Dモデルファイル名
	scale = 0.4;
	position = new Vector3f(0.0f,0.0f,0.0f);	
	Yangle = 0.0;

	shoulderTrans = new TransformGroup();
	shoulderT3d = new Transform3D();
	mouseMotionEvt = new MouseMotionEventAdapter();
	
	setLayout(new BorderLayout());
	
	GraphicsConfiguration config =
	   SimpleUniverse.getPreferredConfiguration();
	
	canvas = new Canvas3D(config);
	add("Center", canvas);
		
	// 描画領域にマウスイベントリスナーを付加する
	canvas.addMouseMotionListener(mouseMotionEvt);
	
	BranchGroup scene = createShoulder();
	
	SimpleUniverse u = new SimpleUniverse(canvas);
	u.getViewingPlatform().setNominalViewingTransform();
	u.addBranchGraph(scene);
   }
   
   public BranchGroup createShoulder() {
	BranchGroup objRoot = new BranchGroup();

	// オブジェクト位置設定
	shoulderT3d.setScale(scale);
       	shoulderT3d.setTranslation(position);
	shoulderT3d.rotY(Yangle);
       	shoulderTrans.setTransform(shoulderT3d);
	shoulderTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
	shoulderTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);

	// ローダ用フラグ設定
	int flags = ObjectFile.RESIZE;
	if (!noTriangulate) flags |= ObjectFile.TRIANGULATE;
	if (!noStripify) flags |= ObjectFile.STRIPIFY;

	// ローダオブジェクト生成
	ObjectFile f = new ObjectFile(flags, 
	  (float)(creaseAngle * Math.PI / 180.0));

	Scene s = null;
	try {
		s = f.load(filename);
	}
	catch (FileNotFoundException e) {
		System.err.println(e);
		System.exit(1);
	}
	catch (ParsingErrorException e) {
		System.err.println(e);
		System.exit(1);
	}
	catch (IncorrectFormatException e) {
		System.err.println(e);
		System.exit(1);
	}
	
	// Scene(s)をtransformGroup(shoulderTrans)にぶら下げる
	shoulderTrans.addChild(s.getSceneGroup());
	
	BoundingSphere bounds =
	  new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);

	objRoot.addChild(shoulderTrans);
	return objRoot;
   }
   
   public static void setRotation(double angle) {
	Yangle = angle;
//	System.out.println("Yangle=" + Yangle);
	shoulderT3d.rotY(Yangle);
	shoulderTrans.setTransform(shoulderT3d);
   }
   
   public static void main(String[] args) {
	Shoulder s = new Shoulder();
	MainFrame f = new MainFrame(s, 500, 500);
   }
}

class MouseMotionEventAdapter implements MouseMotionListener {
   private int mousePosition;
   private double degree;
   
   public MouseMotionEventAdapter() {
	mousePosition = 0;
	degree = 0.0;
   }

   public void mouseMoved( MouseEvent e) {}

   public void mouseDragged( MouseEvent e) {
	mousePosition = e.getX();
	degree = (double)((mousePosition) * Math.PI / 180.0);
	Shoulder.setRotation(degree);
   }
}
// -------------------- end of Shoulder.java --------------------------

// ------------------------ Sym.java ----------------------------------

import com.sun.j3d.utils.behaviors.mouse.*;
import com.sun.j3d.loaders.objectfile.ObjectFile;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.IncorrectFormatException;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.*;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.io.*;

public class Sym extends Applet {
   private Canvas3D canvas = null;
   private double wholeScale;		// 全体の縮尺

   public Sym() {
	wholeScale = 0.2;
	GraphicsConfiguration config = 
	   SimpleUniverse.getPreferredConfiguration();
	canvas = new Canvas3D(config);

	this.setLayout(new BorderLayout());
	this.add(canvas, "Center");
	
	// 最上位の空間用ノード
	SimpleUniverse universe = new SimpleUniverse(canvas);

	// universeの視点設定。視点を少し後ろにずらしているので
	// シーン内のオブジェクトを見ることができる。
	universe.getViewingPlatform().setNominalViewingTransform();
	
	// オブジェクト用ノード(子ノード)
	BranchGroup scene = createSceneGraph();

	universe.addBranchGraph(scene);
   }

   public BranchGroup createSceneGraph() {
	// 枝graphのルートを生成
	BranchGroup objRoot = new BranchGroup();

        // 全体のスケール設定(TransformGroup(objScale)を生成)
        TransformGroup objScale = new TransformGroup();
        Transform3D t3d = new Transform3D();
        t3d.setScale(wholeScale);
        objScale.setTransform(t3d);
        objRoot.addChild(objScale);

	// マウス動作用TransformGroup(objTrans)
	// ロボットアームのパーツオブジェクトはこの下にぶら下げる
	TransformGroup objTrans = new TransformGroup();	

	BoundingSphere bounds =
	  new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);

	// 各パーツオブジェクトを生成
	Shoulder s = new Shoulder();
	BranchGroup shoulder = s.createShoulder();

	// パーツオブジェクトを親ノード(objTrans)にぶら下げる
	objTrans.addChild(shoulder);

	// パーツの親ノードをスケール調整グラフ(objScale)にぶら下げる
	objScale.addChild(objTrans);

        // 背景設定
        Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
        Background bgNode = new Background(bgColor);
        bgNode.setApplicationBounds(bounds);
        objRoot.addChild(bgNode);

	return objRoot;
    }

    private void usage()
    {
    	System.exit(0);
    }
}

// ----------------------- end of Sym.java -------------------------------

----
Kensuke Tanaka  ktanaka@xxxxxxxxxx