[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