Java3D图像存储图片不随图像更新问题的解决

 

开发时遇到了存储图片不能更新的问题,后来网上查到这个例子,关键代码部分已经加粗.

 

import java.io.*;

import java.awt.*;

import java.awt.event.*;

import java.awt.image.*;

import java.util.*;

import java.lang.reflect.*;

 

import javax.swing.*;

import javax.swing.event.*;

import javax.swing.filechooser.*;

 

//stuff for JAVA3D

import com.sun.j3d.utils.applet.MainFrame;

import com.sun.j3d.utils.universe.*;

import com.sun.j3d.utils.behaviors.mouse.*;

import com.sun.j3d.utils.behaviors.keyboard.*;

import com.sun.j3d.utils.geometry.*;

import javax.media.j3d.*;

import javax.vecmath.*;

import java.awt.GraphicsConfiguration;

import com.sun.j3d.utils.applet.MainFrame;

import com.sun.j3d.utils.geometry.*;

import com.sun.j3d.utils.universe.*;

 

public class SimpleOffScreenTest extends JFrame {

 

   static final int WIDTH = 200;

   static final int HEIGHT = 200;

 

   ImageComponent2D buffer;

   Canvas3D canvas3D;

   Canvas3D onscreenCanvas3D;

   BorderLayout borderLayout = new BorderLayout();

   JButton renderButton = new JButton();

   JLabel imageLabel = new JLabel();

 

public SimpleOffScreenTest() {

   super();

   createOffScreenImage();

try {

   initGUI();

} catch (Exception e) {

   System.out.println("Exception in GUI caused");

   e.printStackTrace();

}

}

 

void createOffScreenImage() {

   canvas3D = getOffScreenCanvas();

   onscreenCanvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());

 

   SimpleUniverse u = new SimpleUniverse(onscreenCanvas3D);

   u.getViewingPlatform().setNominalViewingTransform();

   BranchGroup bg = createSceneGraph();

   u.addBranchGraph(bg);

 

   u.getViewer().getView().addCanvas3D(canvas3D);

 

   createBufferImage();

   canvas3D.setOffScreenBuffer(buffer);//此处buffer始终保持一个对象。

   canvas3D.renderOffScreenBuffer();

   canvas3D.waitForOffScreenRendering();

   imageLabel.setIcon(new ImageIcon(buffer.getImage()));

   System.out.println("Frame: " + canvas3D.getView().getFrameNumber());

 

}

 

Canvas3D getOffScreenCanvas() {

   GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();

   Canvas3D c = new Canvas3D(config, true);

   Screen3D scr = c.getScreen3D();

   scr.setSize(new Dimension(1280, 1024));

   scr.setPhysicalScreenWidth(0.36124);

   scr.setPhysicalScreenHeight(0.28899555);

   return c;

}

 

void createBufferImage() {

   BufferedImage offScreenImg = new BufferedImage(WIDTH, WIDTH,

   BufferedImage.TYPE_INT_RGB);

   buffer = new ImageComponent2D(ImageComponent.FORMAT_RGB, offScreenImg,true, false);

   buffer.setCapability(ImageComponent2D.ALLOW_IMAGE_READ);

}

 

BranchGroup createSceneGraph() {

   // Create the root of the branch graph

   BranchGroup objRoot = new BranchGroup();

 

   // rotate object has composited transformation matrix

   Transform3D rotate = new Transform3D();

   Transform3D tempRotate = new Transform3D();

 

   rotate.rotX(Math.PI / 4.0d);

   tempRotate.rotY(Math.PI / 5.0d);

   rotate.mul(tempRotate);

 

   TransformGroup objRotate = new TransformGroup(rotate);

 

   // Create the transform group node and initialize it to the

   // identity. Enable the TRANSFORM_WRITE capability so that

   // our behavior code can modify it at runtime. Add it to the

   // root of the subgraph.

   TransformGroup objSpin = new TransformGroup();

   objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

 

   objRoot.addChild(objRotate);

   objRotate.addChild(objSpin);

 

   // Create a simple shape leaf node, add it to the scene graph.

   // ColorCube is a Convenience Utility class

   objSpin.addChild(new ColorCube(0.4));

 

   // Create a new Behavior object that will perform the desired

  // operation on the specified transform object and add it into

  // the scene graph.

  Transform3D yAxis = new Transform3D();

  Alpha rotationAlpha = new Alpha(-1, 4000);

 

  RotationInterpolator rotator = new RotationInterpolator(rotationAlpha,

  objSpin, yAxis, 0.0f, (float) Math.PI * 2.0f);

 

   // a bounding sphere specifies a region a behavior is active

   // create a sphere centered at the origin with radius of 1

   BoundingSphere bounds = new BoundingSphere();

   rotator.setSchedulingBounds(bounds);

   objSpin.addChild(rotator);

 

   return objRoot;

}

 

public static void main(String argv[]) {

SimpleOffScreenTest theTest = new SimpleOffScreenTest();

theTest.setVisible(true);

}

 

private void initGUI() throws Exception {

renderButton.setText("Render");

renderButton.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

if (e.getActionCommand() == "Render") {

canvas3D.renderOffScreenBuffer();

canvas3D.waitForOffScreenRendering();

imageLabel.setIcon(new ImageIcon(buffer.getImage()));

repaint();

System.out.println("Frame: "

+ canvas3D.getView().getFrameNumber());

}

}

});

imageLabel.setHorizontalAlignment(SwingConstants.CENTER);

this.getContentPane().setLayout(borderLayout);

this.getContentPane().add(renderButton, BorderLayout.SOUTH);

this.getContentPane().add(onscreenCanvas3D, BorderLayout.CENTER);

this.getContentPane().add(imageLabel, BorderLayout.NORTH);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

onscreenCanvas3D.setSize(200, 200);

this.pack();

this.validate();

this.repaint();

this.show();

}

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值