java - 将 Canvas3D 写入文件

标签 java 3d java-3d

嗨,我尝试适应http://www.java2s.com/Code/Java/3D/OffScreenTest.htm进行一个简单的测试,将颜色立方体渲染到文件。

但是我的 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. 我的 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();
    }

}

关于java - 将 Canvas3D 写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37260777/

相关文章:

Swing 工具提示的 Java3D 卡顿问题

java - Java3D 无法使旋转正常工作

java - 将裁剪后的照片保存到 FirebaseStorage 时应用崩溃

java - 返回 CompletableFuture<Void> 还是 CompletableFuture<?>?

c++ - 用于将文件中的字符串读入 3D 数组的 For 循环

c# - 将欧拉转换为矩阵并将矩阵转换为欧拉

java - 如何使用 netbeans dist 分发 Java3d jar 文件?

java - 如何转换为 BasicDBList?

java - 使用 Collections.sort 排序列表时出错

c++ - 具有最短路径的四元数 slerp 不起作用