java3d - capture screenshot or rendered image?

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

java3d - capture screenshot or rendered image?

LordSmoke
Hi, folks! I feel like such a parasite. It seems I only show up to ask questions this time of year. I really do feel guilty about this.

I am preparing for my usual spring visits to Vienna when I actually have time to do non-trivial programming. However, I did have an afternoon free yesterday. I rec'd data for 3D points in a figure captured at a high frame-rate while walking. My software is setup to show one configurations of points/surfaces or a set (usually bones, or scans or something). So, I just added in a timer to quickly page through the set and get a reasonable animation of the person walking. Lot's of options I can add, but I only put in an afternoon.

One thing that would be really nice and address a problem one of my students has is the ability to save the image sequence to an animated .gif file. The student has a couple of thousand video images. If the save function worked, my little addition could do that for him. I found some code on the i-net that is purported to produce animated gifs from java images, but I have to send it the images. I cannot readily see how to get the screenshots that in j3d.

QUESTION: Would someone provide me with a link or appropriate search terms to find out how to do this?

I have found examples for jogl, java, Robot, etc. But it was not immediately clear how that would apply to a j3d universe.

I did find the code below in one of my programs. And if memory serves, it worked at some point to save a screen capture to a file. Doesn't work now (maybe something changed) and gives error:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Canvas3D: The width of the associated Screen3D's size is <= 0
        at javax.media.j3d.Canvas3D.renderOffScreenBuffer(Canvas3D.java:1978)
       
I believe I got the same error from similar code in my new program, but I am not sure if that ever worked.

Just looking for a nudge in the right direction to search for the answer. Searching the forum didn't turn up any obvious examples.

Thanks, LS


/**
 * CODE TAKEN FROM PRINT_CANVAS3D JAVA3D EXAMPLE CODE - LordSmoke
 *
 * JavaDoc and clean 2013FEB01.
 *
 * /*
 * $RCSfile: OffScreenCanvas3D.java,v $
 *
 * Copyright (c) 2006 Sun Microsystems, Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistribution of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * - Redistribution in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * Neither the name of Sun Microsystems, Inc. or the names of contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
 * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
 * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS
 * LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A
 * RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 * IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
 * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
 * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
 * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS
 * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * You acknowledge that this software is not designed, licensed or intended for
 * use in the design, construction, operation or maintenance of any nuclear
 * facility.
 *
 * $Revision: 1.1 $ $Date: 2006/02/01 01:32:53 $ $State: Exp $
 */
package morpheus_vis;

import java.awt.GraphicsConfiguration;
import java.awt.image.BufferedImage;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.ImageComponent;
import javax.media.j3d.ImageComponent2D;

/**
 * Support 3D printing via saving onscreen graphics to image-format file. CODE
 * TAKEN FROM PRINT_CANVAS3D JAVA3D EXAMPLE CODE
 *
 * @author lordsmoke
 */
public class MVis_OffScreenCanvas3D extends Canvas3D {

    private static final long serialVersionUID = 1L;

    public MVis_OffScreenCanvas3D(GraphicsConfiguration graphicsConfiguration,
            boolean offScreen) {
        super(graphicsConfiguration, offScreen);
    }

    BufferedImage doRender(int width, int height) {

        BufferedImage bImage =
                new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

        ImageComponent2D buffer =
                new ImageComponent2D(ImageComponent.FORMAT_RGBA, bImage);

        setOffScreenBuffer(buffer);
        renderOffScreenBuffer();
        waitForOffScreenRendering();
        bImage = getOffScreenBuffer().getImage();

        // To release the reference of buffer inside Java 3D.
        setOffScreenBuffer(null);

        return bImage;
    }

    /**
     * No-op since we always wait for off-screen rendering to complete.
     */
    @Override
    public void postSwap() {
    }
}
Reply | Threaded
Open this post in threaded view
|

Re: java3d - capture screenshot or rendered image?

gouessej
Administrator
Hi

You should find why the associated Screen3D's size is lower than or equal to zero as the exception indicates or use GLReadBufferUtil but I have no idea how to use it with Java3D.
Julien Gouesse | Personal blog | Website
Reply | Threaded
Open this post in threaded view
|

Re: java3d - capture screenshot or rendered image?

LordSmoke
Thanks, Julien.

I wasn't even sure this old code was still relevant.

If I comment out the renderOffScreenBuffer(); line a blank image of appropriate size is produced. So, it's just that line.

The bImage, buffer, and getOffScreenBuffer.getImage() have the specified, non-zero width and height. That is the same as the onscreen window, whatever that is - 1280x946 in this default case.

Reply | Threaded
Open this post in threaded view
|

Re: java3d - capture screenshot or rendered image?

LordSmoke
In reply to this post by LordSmoke
And just for good measure, I made sure I upgraded my jogl and j3d to the latest (what I believe to be compatible) versions:

jogl 2.2.4 - 2014OCT10
java 3d - 21014AUG07

same results.