2016-05-16 61 views
1

嗨,我嘗試着將http://www.java2s.com/Code/Java/3D/OffScreenTest.htm改編成一個簡單的測試,它將渲染一個彩色立方體文件。將Canvas3D寫入文件

但是我的img.png只包含黑色,程序從不退出。需要

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(); 
    } 

} 

回答

1

好了兩個變化得到它的工作:

  1. 我sOff.setPhysicalScreenWidth太大
  2. 我不得不使用canvas3D.getOffScreenBuffer()getRenderedImage()

工作結果:

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

感謝您發佈您的調查結果。我們將檢查java3d中的官方示例,例如Github上的離線渲染示例。我希望你使用最新版本的Java3D,而不是Oracle提供的廢棄版本。 – gouessej

+0

我正在使用1.5.1,1.6.1似乎處於測試狀態? – wutzebaer

+0

沒有稱爲「1.6.1」的版本。有一個名爲1.6.0-pre12的版本。版本1.5.1是Oracle/Sun Microsystems的最後一個版本。版本1.5.2由社區提供。版本1.6.0是唯一維護的版本(由JogAmp社區提供)。 1.7版包含一些重大更改,一些軟件包已重新命名,並且主要貢獻者將添加OpenGL-ES支持。你可以在這裏找到關於安裝的一些信息:http://jogamp.org/wiki/index.php/Downloading_and_installing_Java3D http://jogamp.org/wiki/index.php/Java3D_Overview – gouessej