JAVA3D编写添加鼠标行为的时候出现下面的错误
--------------------Configuration: <Default> --------------------
Exception in thread "main " javax.media.j3d.MultipleParentException: Group.addChild: child already has a parent
at javax.media.j3d.GroupRetained.checkValidChild(GroupRetained.java:452)
at javax.media.j3d.GroupRetained.addChild(GroupRetained.java:461)
at javax.media.j3d.Group.addChild(Group.java:271)
at objLoader.createSceneGraph(objLoader.java:122)
at objLoader. <init> (objLoader.java:164)
at objLoader.main(objLoader.java:173)
[解决办法]
异常不是已经说得很清楚了吗?一个child只能有一个parent。
[解决办法]
在准备导入里 objTrans2.addChild(objTrans2); 不要,还有就是你把鼠标事件加错Transfrom3D了,要添加鼠标事件先要删掉旋转的代码
我将可运行的代码发在这
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 java.awt.GraphicsConfiguration;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.event.*;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import com.sun.j3d.utils.image.*;
import java.io.*;
import javax.imageio.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class objLoader extends Applet {
public BranchGroup createSceneGraph(String filename) {
BranchGroup objRoot = new BranchGroup();
BoundingSphere bounds =new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);//设置涉及范围
{
Color3f bgColor = new Color3f(0.2f, 0.3f, 0.8f);//背景颜色
Background bg = new Background(bgColor);
bg.setApplicationBounds(bounds);
objRoot.addChild(bg);
}
{
//设置变换组
TransformGroup objTrans1=new TransformGroup();
Transform3D x = new Transform3D();
Transform3D y = new Transform3D();
TransformGroup xRot=new TransformGroup();
xRot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
xRot.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
x.rotX(Math.PI/180); //x轴旋转
xRot.setTransform(x);
objRoot.addChild(xRot);
y.rotY(Math.PI/180);
objTrans1.setTransform(y); //Y轴旋转
objTrans1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objTrans1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
xRot.addChild(objTrans1);
//定义鼠标行为
// MouseRotate behavior = new MouseRotate();
// behavior.setTransformGroup(objTrans1);
// objRoot.addChild(behavior);
// behavior.setSchedulingBounds(bounds);
// MouseZoom behavior2 = new MouseZoom();
// behavior2.setTransformGroup(objTrans1);
// objRoot.addChild(behavior2);
// behavior2.setSchedulingBounds(bounds);
// MouseTranslate behavior3 = new MouseTranslate();
// behavior3.setTransformGroup(objTrans1);
// objRoot.addChild(behavior3);
// behavior3.setSchedulingBounds(bounds);
}
{
//整体光设置
Color3f light1Color = new Color3f(0.0f, 1.0f,1.0f);
Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f);
Color3f light2Color = new Color3f(0.3f, 0.3f, 0.4f);
Vector3f light2Direction = new Vector3f(-6.0f, -2.0f, -1.0f);
Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
// 渐变光
AmbientLight ambientLight = new AmbientLight(ambientColor);
ambientLight.setInfluencingBounds(bounds);
objRoot.addChild(ambientLight);
// 定义方向光
DirectionalLight light1= new DirectionalLight(light1Color, light1Direction);
light1.setInfluencingBounds(bounds);
objRoot.addChild(light1);
DirectionalLight light2 = new DirectionalLight(light2Color, light2Direction);
light2.setInfluencingBounds(bounds);
objRoot.addChild(light2);
TransformGroup objTrans2 = new TransformGroup();
objTrans2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objRoot.addChild(objTrans2);
// Create an Alpha object that goes from 0 to 1 in 8 seconds,
// repeatedly.
Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
0, 0,40000, 0, 0, 0,0, 0);
// Create a new Behavior object that will rotate the scene
// add it into the scene graph
// Transform3D yAxis = new Transform3D();
// RotationInterpolator rotator =new RotationInterpolator(rotationAlpha, objTrans2, yAxis,0.0f, (float) Math.PI*2.0f);
// rotator.setSchedulingBounds(bounds);
// objTrans2.addChild(rotator);
//准备导入
Transform3D objTrans3d = new Transform3D();
objTrans2.getTransform(objTrans3d);
objTrans2.setTransform(objTrans3d);
//objTrans2.addChild(objTrans2);
int flags = ObjectFile.RESIZE;
ObjectFile f = new ObjectFile(flags, (float)(49.0 * Math.PI / 30.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);
}
//sceneTG.addChild(f);
MouseRotate behavior = new MouseRotate();
behavior.setTransformGroup(objTrans2);
objRoot.addChild(behavior);
behavior.setSchedulingBounds(bounds);
objTrans2.addChild(s.getSceneGroup());
return objRoot;
}
}
public objLoader(String filename) {
filename= "pao.obj "; //定义viewplatform
setLayout(new BorderLayout());
GraphicsConfiguration config=SimpleUniverse.getPreferredConfiguration();
Canvas3D c=new Canvas3D(config);
add( "Center ",c);
Viewer viewer=new Viewer(c);
Vector3d viewpoint=new Vector3d(.0,.0,3.0);
Transform3D t=new Transform3D();
t.set(viewpoint);
ViewingPlatform v=new ViewingPlatform();
v.getViewPlatformTransform().setTransform(t);
BranchGroup scene=createSceneGraph(filename);
SimpleUniverse u=new SimpleUniverse(v,viewer);
u.getViewingPlatform();
u.addBranchGraph(scene);
}
public static void main(String[] args) {
new MainFrame(new objLoader(null), 800, 600);
}
}
[解决办法]
java3D要是在浏览器中运行装了JRE后为什么不能运行呀,提示找不到javax.media.j3d