Hi, I try to add a MouseTranslate Behavior in a scene, where the view branch graph is not created using SimpleUniverse. The program teminates with the following exception:
java.lang.NullPointerException at javax.media.j3d.BehaviorRetained.updateTransformRegion(BehaviorRetained.java:458) at javax.media.j3d.BehaviorStructure.activateBehaviors(BehaviorStructure.java:347) at javax.media.j3d.BehaviorStructure.processMessages(BehaviorStructure.java:209) at javax.media.j3d.StructureUpdateThread.doWork(StructureUpdateThread.java:83) at javax.media.j3d.J3dThread.run(J3dThread.java:250) That somewhere in Java3D and means nothing to me? What am I doing wrong? A testcase is attached. Outcommenting of the line world_object_group.addChild(trans); leads to a running programm, ofcourse without behavior. Desiree oooooooooooooooooooooooooooooooooooooooooooooooo Desiree Hilbring Institut fuer Photogrammetrie und Fernerkundung Universitaet Karlsruhe, Germany email: [EMAIL PROTECTED] # 0721 6083676 oooooooooooooooooooooooooooooooooooooooooooooooo
/***************************************************************************** * J3D.org Copyright (c) 2000 * Java Source * * This source is licensed under the GNU LGPL v2.1 * Please read http://www.gnu.org/copyleft/lgpl.html for more information * * This software comes with the standard NO WARRANTY disclaimer for any * purpose. Use it at your own risk. If there's a problem you get to fix it. * ****************************************************************************/ // Standard imports import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.media.j3d.*; import javax.vecmath.*; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.HashMap; import com.sun.j3d.utils.behaviors.mouse.*; import com.sun.j3d.utils.geometry.ColorCube; public class NavTest extends DemoFrameDesTest { // Achtung front und back hardcodiert private static final double BACK_CLIP_DISTANCE = 3000.0; private static final double FRONT_CLIP_DISTANCE = 1; /** The main canvas that we are navigating on */ private Canvas3D navCanvas; /** Global material instance to use */ private Material material; /** Global polygon attributes to use */ private PolygonAttributes polyAttr; /** TG that holds the user view position. Used when new terrain set */ private TransformGroup gndViewTransform; /** The color interpolator for doing height interpolations with */ //private ColorInterpolator heightRamp; /** * Construct a new demo with no geometry currently showing, but the * default type is set to quads. */ public NavTest() { super("NavTest"); navCanvas = createCanvas(); Panel p0 = new Panel(new GridLayout(1, 2)); p0.add(navCanvas); add(p0, BorderLayout.CENTER); JPanel p1 = new JPanel(new FlowLayout()); buildScene(); // Now set up the material and appearance handling for the generator material = new Material(); material.setLightingEnable(true); polyAttr = new PolygonAttributes(); polyAttr.setCapability(PolygonAttributes.ALLOW_MODE_WRITE); polyAttr.setCullFace(PolygonAttributes.CULL_NONE); polyAttr.setBackFaceNormalFlip(true); polyAttr.setPolygonMode(PolygonAttributes.POLYGON_FILL); loadTerrain(new String(),new String()); } //---------------------------------------------------------- // Internal convenience methods //---------------------------------------------------------- /** * Build the scenegraph for the canvas */ private void buildScene() { Color3f ambientBlue = new Color3f(0.0f, 0.02f, 0.5f); Color3f white = new Color3f(1, 1, 1); Color3f black = new Color3f(0.0f, 0.0f, 0.0f); Color3f blue = new Color3f(0.00f, 0.20f, 0.80f); Color3f specular = new Color3f(0.7f, 0.7f, 0.7f); VirtualUniverse universe = new VirtualUniverse(); Locale locale = new Locale(universe); BranchGroup view_group = new BranchGroup(); BranchGroup world_object_group = new BranchGroup(); PhysicalBody body = new PhysicalBody(); PhysicalEnvironment env = new PhysicalEnvironment(); Point3d origin = new Point3d(0, 0, 0); BoundingSphere light_bounds = new BoundingSphere(origin, BACK_CLIP_DISTANCE); DirectionalLight headlight = new DirectionalLight(); headlight.setColor(white); headlight.setInfluencingBounds(light_bounds); headlight.setEnable(true); ViewPlatform gnd_camera = new ViewPlatform(); Transform3D angle = new Transform3D(); gndViewTransform = new TransformGroup(); gndViewTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); gndViewTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); gndViewTransform.addChild(gnd_camera); gndViewTransform.addChild(headlight); View gnd_view = new View(); gnd_view.setBackClipDistance(BACK_CLIP_DISTANCE); gnd_view.setFrontClipDistance(FRONT_CLIP_DISTANCE); gnd_view.setPhysicalBody(body); gnd_view.setPhysicalEnvironment(env); gnd_view.addCanvas3D(navCanvas); gnd_view.attachViewPlatform(gnd_camera); //System.out.println("front clip dist "+gnd_view.getFrontClipDistance()); //System.out.println("back clip dist "+gnd_view.getBackClipDistance()); view_group.addChild(gndViewTransform); TransformGroup testBoxTG = new TransformGroup(); Transform3D testBoxT3d = new Transform3D(); testBoxT3d.setTranslation(new Vector3f(50,3510,-50)); testBoxTG.setTransform(testBoxT3d); testBoxTG.addChild(new ColorCube(10)); world_object_group.addChild(testBoxTG); BoundingSphere mouseBounds = new BoundingSphere(new Point3d(),Float.MAX_VALUE); BoundingLeaf boundingLeaf = new BoundingLeaf(mouseBounds); /* ViewerNavigationBehavior rotate = new ViewerNavigationBehavior(gndViewTransform,gnd_view); rotate.setSchedulingBoundingLeaf(boundingLeaf); */ MouseTranslate trans = new MouseTranslate(MouseBehavior.INVERT_INPUT); trans.setTransformGroup(gndViewTransform); trans.setSchedulingBoundingLeaf(boundingLeaf); /* WorldVolume wv = new WorldVolume(); MouseZoomAdjustView zoom = new MouseZoomAdjustView(MouseBehavior.INVERT_INPUT,gnd_view,wv); zoom.setTransformGroup(gndViewTransform); zoom.setSchedulingBoundingLeaf(boundingLeaf); */ //world_object_group.addChild(rotate); world_object_group.addChild(trans); //world_object_group.addChild(zoom); // Add everything to the locale locale.addBranchGraph(view_group); locale.addBranchGraph(world_object_group); } /** * Load the terrain and get it read to roll. If the texture file is not * specified then no texture will be loaded and colour information is * used instead. * * @param filename The name of the terrain file * @param textureName The name of the texture file, or null */ private void loadTerrain(String filename, String textureName) { //System.gc(); System.out.println("Loading terrain file. Please wait!!!!!!!!!!!!!!!!!!!!"); Point3d p3dmin = new Point3d(); Point3d p3dmax = new Point3d(); float[] origin = new float[3]; //terrain.getCoordinate(origin, 1, 1); origin[0]=50; origin[1]=3500; origin[2]=-50; System.out.println("origin[] "+origin[0]+" "+origin[1]+" "+origin[2]); Transform3D angle = new Transform3D(); // setup the top view by just raising it some amount and we want Vector3f pos = new Vector3f(); pos.x = origin[0]; pos.y = origin[1]; pos.z = origin[2]+100; angle.setTranslation(pos); System.out.println("Building landscape 3"); gndViewTransform.setTransform(angle); System.out.println("Building landscape 4"); /* Matrix3f mtx = new Matrix3f(); Vector3f orient = new Vector3f(0, 0, -1); angle.get(mtx, pos); mtx.transform(orient); */ } public static void main(String[] argv) { NavTest demo = new NavTest(); demo.setSize(600, 400); demo.setVisible(true); } }
/***************************************************************************** * J3D.org Copyright (c) 2000 * Java Source * * This source is licensed under the GNU LGPL v2.1 * Please read http://www.gnu.org/copyleft/lgpl.html for more information * * This software comes with the standard NO WARRANTY disclaimer for any * purpose. Use it at your own risk. If there's a problem you get to fix it. * ****************************************************************************/ // Standard imports import java.awt.*; import java.awt.event.*; import javax.media.j3d.Canvas3D; import javax.media.j3d.GraphicsConfigTemplate3D; // Application Specific imports // none /** * Demonstration of a mouse navigation in a world. * * @author Justin Couch * @version $Revision: 1.1 $ */ public class DemoFrameDesTest extends Frame implements WindowListener { public DemoFrameDesTest(String title) { super(title); setLocation(30, 10); addWindowListener(this); } /** * Creates a new canvas each time this is called. * * @return A new canvas instance */ protected Canvas3D createCanvas() { Canvas3D canvas; GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D(); template.setDoubleBuffer(template.REQUIRED); GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice dev = env.getDefaultScreenDevice(); //System.out.println("env "+env.toString()); //System.out.println("dev "+dev.toString()); //System.out.println("template "+template.toString()); canvas = new Canvas3D(dev.getBestConfiguration(template)); canvas.setStereoEnable(false); canvas.setDoubleBufferEnable(true); //canvas.setDoubleBufferEnable(false); System.out.println("Canvas "+canvas); return canvas; } /** * Ignored */ public void windowActivated(WindowEvent evt) { } /** * Ignored */ public void windowClosed(WindowEvent evt) { } /** * Exit the application * * @param evt The event that caused this method to be called. */ public void windowClosing(WindowEvent evt) { System.exit(0); } /** * Ignored */ public void windowDeactivated(WindowEvent evt) { } /** * Ignored */ public void windowDeiconified(WindowEvent evt) { } /** * Ignored */ public void windowIconified(WindowEvent evt) { } /** * Ignored */ public void windowOpened(WindowEvent evt) { } }