Hi Alessandro and Ben, I have fixed the problem. Later I will post the code.
Thanks a lot for your help. :) Ding > Hi Alessandro, > > Thanks a lot. I did combine the several images/icons to be one now. > > When I use this code to modify the sample code, it suppose to work. And I > can compile, but once run, show the: > > "Exception in thread "Thread-2" java.lang.NullPointerException" > > I think the problem is here: "texBufferedImage" should be the combined > image which is retured from the main(). > > Texture tex = new TextureLoader(java.awt.image.BufferedImage > texBufferedImage).getTexture(); > > According to the TextureLoader, it should be able to construct the object > through the "texBufferedImage", right ? > > Below is the code: > =========================================================================== > import java.awt.font.*; > import java.awt.geom.*; > import java.awt.image.*; > import java.io.*; > import java.net.*; > import javax.imageio.*; > import javax.swing.*; > > import java.applet.Applet; > import java.awt.*; > import java.awt.event.*; > import com.sun.j3d.utils.applet.MainFrame; > import com.sun.j3d.utils.universe.*; > import com.sun.j3d.utils.image.TextureLoader; > import com.sun.j3d.utils.geometry.Box; > import javax.media.j3d.*; > import javax.vecmath.*; > > public class TextureImage extends Applet { > > private java.net.URL texImage = null; > // new added > private BufferedImage texBufferedImage = null; > ImageComponent2D ic; > private SimpleUniverse u = null; > > public BranchGroup createSceneGraph() { > // Create the root of the branch graph > BranchGroup objRoot = new BranchGroup(); > > // 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 objTrans = new TransformGroup(); > objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); > objRoot.addChild(objTrans); > > // Create appearance object for textured cube > Appearance app = new Appearance(); > // Texture tex = new TextureLoader(texImage, this).getTexture(); > Texture tex = new TextureLoader(java.awt.image.BufferedImage > texBufferedImage).getTexture(); > // Added new one > > //ImageComponent2D ic = new ImageComponent2D(ImageComponent.FORMAT_RGB, > texBufferedImage); > //ImageComponent2D ic = null ; > // ic.set(texBufferedImage); > > > > //Texture2D myTexture = new Texture2D(); > // myTexture.setImage(0, imgtest02); > // app.setTexture(myTexture); > > app.setTexture(tex); > TextureAttributes texAttr = new TextureAttributes(); > texAttr.setTextureMode(TextureAttributes.MODULATE); > app.setTextureAttributes(texAttr); > > // Create textured cube and add it to the scene graph. > Box textureCube = new Box(0.4f, 0.4f, 0.4f, > Box.GENERATE_TEXTURE_COORDS, app); > objTrans.addChild(textureCube); > > // 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, Alpha.INCREASING_ENABLE, > 0, 0, > 4000, 0, 0, > 0, 0, 0); > > RotationInterpolator rotator = > new RotationInterpolator(rotationAlpha, objTrans, yAxis, > 0.0f, (float) Math.PI*2.0f); > BoundingSphere bounds = > new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0); > rotator.setSchedulingBounds(bounds); > objTrans.addChild(rotator); > > // Have Java 3D perform optimizations on this scene graph. > objRoot.compile(); > > return objRoot; > } > > public TextureImage() { > } > > // public TextureImage(java.net.URL url) { > // texImage = url; > // } > > // New added > public TextureImage(BufferedImage img) { > texBufferedImage = img; > > ImageComponent2D ic = new ImageComponent2D(ImageComponent.FORMAT_RGB, > texBufferedImage); > // BufferedImage imgtest = ic.getImage(); > BufferedImage imgtest = null; > > if (imgtest == null) > { > System.out.println("I am here"); > } ; > imgtest = ic.getImage(); > if (imgtest == null) > { > System.out.println("not get the image to here"); > } > else{ > System.out.println("then get the image to here"); > } > ; > } > // public BufferedImage TextureBufferedImage(BufferedImage img) { > // texBufferedImage = img; > // } > > public void init() { > if (texImage == null) { > // the path to the image for an applet > try { > texImage = new java.net.URL(getCodeBase().toString() + > "../images/1.jpg"); > } > catch (java.net.MalformedURLException ex) { > System.out.println(ex.getMessage()); > System.exit(1); > } > } > setLayout(new BorderLayout()); > GraphicsConfiguration config = > SimpleUniverse.getPreferredConfiguration(); > > Canvas3D c = new Canvas3D(config); > add("Center", c); > > // Create a simple scene and attach it to the virtual universe > BranchGroup scene = createSceneGraph(); > u = new SimpleUniverse(c); > > // This will move the ViewPlatform back a bit so the > // objects in the scene can be viewed. > u.getViewingPlatform().setNominalViewingTransform(); > > u.addBranchGraph(scene); > } > > public void destroy() { > u.cleanup(); > } > > // > // The following allows TextureImage to be run as an application > // as well as an applet > // > // public static void main(String[] args) { > public static void main(String[] args) throws IOException { > java.net.URL url = null; > if (args.length > 0) { > try { > url = new java.net.URL("file:" + args[0]); > } > catch (java.net.MalformedURLException ex) { > System.out.println(ex.getMessage()); > System.exit(1); > } > } > else { > // the path to the image for an application > try { > url = new java.net.URL("file:../images/1.jpg"); > } > catch (java.net.MalformedURLException ex) { > System.out.println(ex.getMessage()); > System.exit(1); > } > } > // New added > URL[] urls = { > // new URL("file:/E:/3D/icon_example/images/1.jpg"), > new URL("file:../images/1.jpg"), > new URL("file:../images/2.jpg"), > new URL("file:../images/3.jpg"), > }; > > > BufferedImage[] images = { > > ImageIO.read(urls[0]), > ImageIO.read(urls[1]), > ImageIO.read(urls[2]), > }; > > > int w = images[0].getWidth(), h = images[0].getHeight(); > > BufferedImage total = new BufferedImage(4*w, 4*h, > BufferedImage.TYPE_INT_RGB); > Graphics2D g = total.createGraphics(); > g.drawImage(images[0], 0, 0, null); > g.drawImage(images[1], w, 0, null); > g.drawImage(images[2], 0, 2*h, null); > // new MainFrame(new TextureImage(url), 256, 256); > new MainFrame(new TextureImage(total), 256, 256); > } > > } > > > >> Check at JavaAlmanac http://www.javaalmanac.com/ >> about same sample codes (search for image/images etc) >> >> Alessandro Borges <[EMAIL PROTECTED]> wrote: >> Hi, Ding >> >> By using TextureUnitState you can mix your textures at runtime and show >> then. Of course a alpha channel can be nice, but you can create a method >> to add alpha channel , as well mix alpha mask >> >> As Ben told, you can use Java2D to mix images into a single one. And >> with >> this new image (actually a BufferedImage). >> >> image1 + image2 + imagex --> >> single BufferedImage -> ImageComponent2D -> Texture2D >> >> Alessandro >> >> "H. Ding" <[EMAIL PROTECTED]> wrote: > > =========================================================================== > To unsubscribe, send email to [EMAIL PROTECTED] and include in the > body > of the message "signoff JAVA3D-INTEREST". For general help, send email to > [EMAIL PROTECTED] and include in the body of the message "help". > =========================================================================== To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff JAVA3D-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help".