2016-05-16 8 views
1

Hallo ich habe versucht, http://www.java2s.com/Code/Java/3D/OffScreenTest.htm zu einem einfachen Test anzupassen, der einen Farbwürfel in Datei rendert.Canvas3D in Datei schreiben

Aber mein img.png enthält nur schwarze Farbe und das Programm wird nie beendet.

import java.awt.Dimension; 
import java.awt.GraphicsConfiguration; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.media.j3d.BranchGroup; 
import javax.media.j3d.Canvas3D; 
import javax.media.j3d.ImageComponent; 
import javax.media.j3d.ImageComponent2D; 
import javax.media.j3d.Screen3D; 

import com.sun.j3d.utils.geometry.ColorCube; 
import com.sun.j3d.utils.universe.SimpleUniverse; 

public class HelloJava3Db { 

    public static void main(String[] args) { 
     // create canvas 
     GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); 
     Canvas3D canvas3D = new Canvas3D(config, true); 

     // create universe 
     SimpleUniverse simpleU = new SimpleUniverse(canvas3D); 
     simpleU.getViewingPlatform().setNominalViewingTransform(); 

     // create scene 
     BranchGroup scene = new BranchGroup(); 
     scene.addChild(new ColorCube(0.4)); 
     scene.compile(); 
     simpleU.addBranchGraph(scene); 

     // set off screen size 
     Screen3D sOff = canvas3D.getScreen3D(); 
     sOff.setSize(new Dimension(200, 200)); 
     sOff.setPhysicalScreenWidth(200); 
     sOff.setPhysicalScreenHeight(200); 

     // render to off screen 
     BufferedImage bImage = new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB); 
     ImageComponent2D buffer = new ImageComponent2D(ImageComponent.FORMAT_RGBA, bImage); 
     buffer.setCapability(ImageComponent2D.ALLOW_IMAGE_READ); 
     canvas3D.setOffScreenBuffer(buffer); 
     canvas3D.renderOffScreenBuffer(); 
     canvas3D.waitForOffScreenRendering(); 

     // write to file 
     File output = new File("img.png"); 
     try { 
      ImageIO.write(bImage, "png", output); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(output.getAbsolutePath()); 

     simpleU.cleanup(); 
    } 

} 

Antwort

1

Ok zwei Änderungen nötig sind, um es Arbeit zu bekommen:

  1. meine sOff.setPhysicalScreenWidth zu groß war
  2. i canvas3D.getOffScreenBuffer verwenden musste() getRenderedImage()
.

Arbeitsergebnis:

import java.awt.Dimension; 
import java.awt.GraphicsConfiguration; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.media.j3d.BranchGroup; 
import javax.media.j3d.Canvas3D; 
import javax.media.j3d.ImageComponent; 
import javax.media.j3d.ImageComponent2D; 
import javax.media.j3d.Screen3D; 

import com.sun.j3d.utils.geometry.ColorCube; 
import com.sun.j3d.utils.universe.SimpleUniverse; 

public class HelloJava3Db { 

    public static void main(String[] args) { 
     // create canvas 
     GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); 
     Canvas3D canvas3D = new Canvas3D(config, true); 

     // create universe 
     SimpleUniverse simpleU = new SimpleUniverse(canvas3D); 
     simpleU.getViewingPlatform().setNominalViewingTransform(); 

     // create scene 
     BranchGroup scene = new BranchGroup(); 
     scene.addChild(new ColorCube(0.4)); 
     scene.compile(); 
     simpleU.addBranchGraph(scene); 

     // set off screen size 
     Screen3D sOff = canvas3D.getScreen3D(); 
     sOff.setSize(new Dimension(200, 200)); 
     sOff.setPhysicalScreenWidth(1); 
     sOff.setPhysicalScreenHeight(1); 

     // render to off screen 
     BufferedImage bImage = new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB); 
     ImageComponent2D buffer = new ImageComponent2D(ImageComponent.FORMAT_RGBA, bImage); 
     buffer.setCapability(ImageComponent2D.ALLOW_IMAGE_READ); 
     canvas3D.setOffScreenBuffer(buffer); 
     canvas3D.renderOffScreenBuffer(); 
     canvas3D.waitForOffScreenRendering(); 

     // write to file 
     File output = new File("img.png"); 
     try { 
      ImageIO.write(canvas3D.getOffScreenBuffer().getRenderedImage(), "png", output); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(output.getAbsolutePath()); 

     simpleU.cleanup(); 
    } 

} 
+0

Vielen Dank, dass Sie Ihre Ergebnisse veröffentlicht haben. Wir werden prüfen, ob die offiziellen Beispiele in java3d-Beispielen für Offscreen-Rendering auf Github funktionieren. Ich hoffe, dass Sie die neueste Version von Java3D verwenden, nicht die von Oracle zur Verfügung gestellte Version. – gouessej

+0

Ich habe 1.5.1 verwendet, 1.6.1 scheint im Beta-Status zu sein? – wutzebaer

+0

Es gibt keine Version mit dem Namen "1.6.1". Es gibt eine Version namens 1.6.0-pre12. Die Version 1.5.1 war die letzte Version von Oracle/Sun Microsystems. Die Version 1.5.2 wurde von der Community bereitgestellt. Die Version 1.6.0 ist die einzige beibehaltene Version (von der JogAmp-Community). Die Version 1.7 enthält einige bahnbrechende Änderungen, einige Pakete wurden umbenannt und ein wichtiger Beitrag wird OpenGL-ES-Unterstützung hinzufügen. Sie können einige Informationen über die Installation hier finden: http://jogamp.org/wiki/index.php/Downloading_and_installing_Java3D http://jogamp.org/wiki/index.php/Java3D_Overview – gouessej