Search code examples
javajava-3d

Translation position of an object only visible in the -1.0 to +1.0 range in Java3D


I have a tiny little program in Java which supposed to display 2 spheres. It works fine until I the translation of a sphere gets out of the range of -1.0 to 1.0, the object in this case will disappear. I have a SimpleUniverse setup and I tried several setBounds in several places, but I couldn't figure out, how is it disappear. The real strangeness, that this is position isn't dependent on the camera position, as I have an OrbitBehavior on the ViewPlatform transform at moving closer doesn't show the object.

This is the setup for the spheres: public class CelestialBody extends TransformGroup {

    CelestialBody(float posX, float posY, float posZ) {
        // This is set for the dynamic behaviour.
        setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

        Transform3D t3d = new Transform3D();
        t3d.setTranslation(new Vector3f(posX, posY, posZ));
        setTransform(t3d);
        setBounds(new BoundingSphere(new Point3d(0.0f, 0.0f, 0.0f), 10000.0f));

        Sphere sphere = new Sphere(1.0f, Sphere.GENERATE_NORMALS, 100, createAppearance());

        addChild(sphere);
    }

    private Appearance createAppearance() {
        Appearance appear = new Appearance();
        Material mat = new Material();
        mat.setShininess(100.0f);
        appear.setMaterial(mat);

        return appear;
    }
}

This is the main program:

public class CelestialApp extends Frame {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new CelestialApp();
    }

    private SimpleUniverse universe = null;

    public CelestialApp() {
    // ...

        BranchGroup scene = constructContentBranch();
        scene.compile();

        universe = new SimpleUniverse(defaultCanvas);
        setupView();
        universe.addBranchGraph(scene);
    }

    private void setupView() {
        ViewingPlatform vp =  universe.getViewingPlatform();
        OrbitBehavior orbit = new OrbitBehavior();
        orbit.setSchedulingBounds(new BoundingSphere(new Point3d(0.0f, 0.0f, 0.0f), 10000.0f));
        vp.setNominalViewingTransform();
        vp.setViewPlatformBehavior(orbit);
    }

    private BranchGroup constructContentBranch() {
        BranchGroup scene = new BranchGroup();

        CelestialBody body1 = new CelestialBody(-2.0f, 0.0f, 0.0f);
        scene.addChild(body1);

        CelestialBody body2 = new CelestialBody(2.0f, 0.0f, -1.1f);
        scene.addChild(body2);

        PhysicalBehavior physics1 = new PhysicalBehavior(body1);
        scene.addChild(physics1);

        PhysicalBehavior physics2 = new PhysicalBehavior(body2, new Vector3d(0.0f, 0.0f, 0.0f));
        scene.addChild(physics2);

        setupLights(scene);

        return scene;
    }

    private void setupLights(BranchGroup scene) {
        AmbientLight lightA = new AmbientLight();
        lightA.setInfluencingBounds(new BoundingSphere());
        lightA.setColor(new Color3f(0.3f, 0.3f, 0.3f));
        scene.addChild(lightA);

        DirectionalLight lightD1 = new DirectionalLight();
        lightD1.setInfluencingBounds(new BoundingSphere());
        Vector3f dir = new Vector3f(-0.3f, -1.0f, -0.5f);
        dir.normalize();
        lightD1.setDirection(dir);
        lightD1.setColor(new Color3f(1.0f, 1.0f, 1.0f));
        scene.addChild(lightD1);

        Background bg = new Background(0.0f, 0.0f, 0.0f);
        bg.setApplicationBounds(new BoundingSphere());
        scene.addChild(bg);
    }
}

Solution

  • Bah, never mind. The light source had only a bounding sphere with radius 1.0f and the object was rendered but with black.