How to draw simple 3D points (x, y, z) in java using Java3D API?

I am making a netbeans desktop application using Java technology. I did some image processing, database functionality, image capture process; but now I want to draw images in a 3D view.
So, I think that first of all I need to create an array of points of my 16-bit image with a gray .tiff scale, and then use this point array. I tried something, and my code is below, but it does not work.
So, how should I use this array of dots to draw my image in 3D?

import java.awt.BorderLayout; import com.sun.j3d.utils.universe.*; import java.awt.image.BufferedImage; import javax.media.j3d.*; import javax.media.jai.JAI; import javax.media.jai.PlanarImage; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.vecmath.Color3f; import javax.vecmath.Point3f; public final class HelloJava3Da extends JPanel { PlanarImage plImg3 = JAI.create("fileload", "C:\\Users\\Desktop\\myImage.tiff"); BufferedImage histImage = plImg3.getAsBufferedImage(); int s = 0, count = 0; public HelloJava3Da() { setLayout(new BorderLayout()); Canvas3D canvas3D = new Canvas3D(null); add("Center", canvas3D); BranchGroup scene = createSceneGraph(); scene.compile(); // SimpleUniverse is a Convenience Utility class SimpleUniverse simpleU = new SimpleUniverse(canvas3D); // This moves the ViewPlatform back a bit so the // objects in the scene can be viewed. simpleU.getViewingPlatform().setNominalViewingTransform(); simpleU.addBranchGraph(scene); } public BranchGroup createSceneGraph() { BranchGroup lineGroup = new BranchGroup(); Appearance app = new Appearance(); ColoringAttributes ca = new ColoringAttributes(new Color3f(204.0f, 204.0f, 204.0f), ColoringAttributes.SHADE_FLAT); app.setColoringAttributes(ca); Point3f[] plaPts = new Point3f[histImage.getWidth()*histImage.getHeight()]; for (int i = 0; i < histImage.getWidth(); i++) { for (int j = 0; j < histImage.getHeight(); j++) { s=histImage.getRaster().getSample(i, j, 0); plaPts[count] = new Point3f(i,j,s); count++; } } PointArray pla = new PointArray(histImage.getWidth()*histImage.getHeight(), GeometryArray.COORDINATES); pla.setCoordinates(0, plaPts); Shape3D plShape = new Shape3D(pla, app); TransformGroup objRotate = new TransformGroup(); objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objRotate.addChild(plShape); lineGroup.addChild(objRotate); return lineGroup; } public static void main(String[] args) { JFrame frame = new JFrame(); frame.add(new JScrollPane(new HelloJava3Da())); frame.setSize(300, 300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } 
+4
source share
1 answer

Create SimpleUniverse and Canvas3D using the SimpleUniverse.getPreferredConfiguration() GraphicsConfiguration class. Then create a BranchGraph. Add TransformGraph as a child of BranchGraph. Then add Shape3D as the child of the TransformGraph. Shape3D should have 2 things: geometry (your point array) and appearance. In appearance, you make a lot of material and lighting specifications.

If you just use an array of points, you only see points. Must use a TriangleStripArray or similar thing if you want to fill polygons or LineStripArray if you want lines.

Use TransformGroup to rotate and translate. Remember to add light as well.

TransformGroup requires that the Transform3D class be used as a parameter for rotation and translation or scaling.

If your Shape3D is a surface, you can give it a special color or use the material and put light next to it, otherwise you will not be able to see it. Remember to set the range for limiting the light so that the light hits the subject.

  • PointArray ---> Cloud Forms
  • LineArray ---> For a dashed line
  • LineStripArray -> for lines
  • TriangleArray ---> divorced triangles (for surface)
  • TriangleStripArray ---> adjacent triangles (for surface)
  • TriangleFanArray ----> like building triangles arount point (for surface)
  • QuadArray ----> It takes six quads to have a cube
  • QuadStripArray ---> Can build a cube with a smaller coordinate array

Another important thing:

 simpleU.getViewingPlatform().getViewPlatform().setActivationRadius(300); SimpleU.getViewer().getView().setBackClipDistance ( 300.0 ); 

makes your viewing range even farther, so the object does not disappear when moved.

Attach mouse interactions to your transform group

  MouseRotate m1=new MouseRotate(); MouseZoom m2=new MouseZoom(); MouseTranslate m3=new MouseTranslate(); 

If you want to map your 1580 x 1050 image to the default 3D range, you must divide the coordinates of the point by 1000. (or scale to 1000 in the transformation group)

Look for tutorials:

http://www.java3d.org/

http://www.java3d.org/tutorial.html

Here I tweaked your tutorial into the energon.class file

 //skipped imports(char limit in this post) public final class energon extends JPanel { int s = 0, count = 0; public energon() { setLayout(new BorderLayout()); GraphicsConfiguration gc=SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas3D = new Canvas3D(gc);//See the added gc? this is a preferred config add("Center", canvas3D); BranchGroup scene = createSceneGraph(); scene.compile(); // SimpleUniverse is a Convenience Utility class SimpleUniverse simpleU = new SimpleUniverse(canvas3D); // This moves the ViewPlatform back a bit so the // objects in the scene can be viewed. simpleU.getViewingPlatform().setNominalViewingTransform(); simpleU.addBranchGraph(scene); } public BranchGroup createSceneGraph() { BranchGroup lineGroup = new BranchGroup(); Appearance app = new Appearance(); ColoringAttributes ca = new ColoringAttributes(new Color3f(204.0f, 204.0f, 204.0f), ColoringAttributes.SHADE_FLAT); app.setColoringAttributes(ca); Point3f[] plaPts = new Point3f[4]; for (int i = 0; i < 2; i++) { for (int j = 0; j <2; j++) { plaPts[count] = new Point3f(i/10.0f,j/10.0f,0); //Look up line, i and j are divided by 10.0f to be able to //see the points inside the view screen count++; } } PointArray pla = new PointArray(4, GeometryArray.COORDINATES); pla.setCoordinates(0, plaPts); Shape3D plShape = new Shape3D(pla, app); TransformGroup objRotate = new TransformGroup(); objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objRotate.addChild(plShape); lineGroup.addChild(objRotate); return lineGroup; } public static void main(String[] args) { JFrame frame = new JFrame(); frame.add(new JScrollPane(new energon())); frame.setSize(300, 300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } 

Output:

enter image description here

Ok, let's add a dot size so we can see them clearly (add in a minute)

New code (2-3 lines added)

 import java.awt.BorderLayout; import java.awt.GraphicsConfiguration; import com.sun.j3d.utils.universe.*; import java.awt.image.BufferedImage; import javax.media.j3d.*; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.vecmath.Color3f; import javax.vecmath.Point3f; public final class energon extends JPanel { int s = 0, count = 0; public energon() { setLayout(new BorderLayout()); GraphicsConfiguration gc=SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas3D = new Canvas3D(gc); add("Center", canvas3D); BranchGroup scene = createSceneGraph(); scene.compile(); // SimpleUniverse is a Convenience Utility class SimpleUniverse simpleU = new SimpleUniverse(canvas3D); // This moves the ViewPlatform back a bit so the // objects in the scene can be viewed. simpleU.getViewingPlatform().setNominalViewingTransform(); simpleU.addBranchGraph(scene); } public BranchGroup createSceneGraph() { BranchGroup lineGroup = new BranchGroup(); Appearance app = new Appearance(); ColoringAttributes ca = new ColoringAttributes(new Color3f(204.0f, 204.0f, 204.0f), ColoringAttributes.SHADE_FLAT); app.setColoringAttributes(ca); Point3f[] plaPts = new Point3f[4]; for (int i = 0; i < 2; i++) { for (int j = 0; j <2; j++) { plaPts[count] = new Point3f(i/10.0f,j/10.0f,0); count++; } } PointArray pla = new PointArray(4, GeometryArray.COORDINATES); pla.setCoordinates(0, plaPts); //between here! PointAttributes a_point_just_bigger=new PointAttributes(); a_point_just_bigger.setPointSize(10.0f);//10 pixel-wide point a_point_just_bigger.setPointAntialiasingEnable(true);//now points are sphere-like(not a cube) app.setPointAttributes(a_point_just_bigger); //and here! sets the point-attributes so it is easily seen. Shape3D plShape = new Shape3D(pla, app); TransformGroup objRotate = new TransformGroup(); objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objRotate.addChild(plShape); lineGroup.addChild(objRotate); return lineGroup; } public static void main(String[] args) { JFrame frame = new JFrame(); frame.add(new JScrollPane(new energon())); frame.setSize(300, 300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } 

output:

enter image description here

Here is another example of using trianglestriparray to draw your own kind of arrow, while you can scale, rotate and translate with the mouse buttons (3 of them).

 //skipped imports beause of char limit in this post public final class energon extends JPanel { int s = 0, count = 0; public energon() { setLayout(new BorderLayout()); GraphicsConfiguration gc=SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas3D = new Canvas3D(gc); add("Center", canvas3D); BranchGroup scene = createSceneGraph(); scene.compile(); // SimpleUniverse is a Convenience Utility class SimpleUniverse simpleU = new SimpleUniverse(canvas3D); // This moves the ViewPlatform back a bit so the // objects in the scene can be viewed. simpleU.getViewingPlatform().setNominalViewingTransform(); simpleU.addBranchGraph(scene); } public BranchGroup createSceneGraph() { BranchGroup lineGroup = new BranchGroup(); Appearance app = new Appearance(); ColoringAttributes ca = new ColoringAttributes(new Color3f(204.0f, 204.0f,204.0f), ColoringAttributes.SHADE_FLAT); app.setColoringAttributes(ca); Point3f[] plaPts = new Point3f[5]; for (int i = 0; i < 2; i++) { for (int j = 0; j <2; j++) { plaPts[count] = new Point3f(i/10.0f,j/10.0f,0); count++; } } plaPts[count] = new Point3f(3.0f/10.0f,2.0f/10.0f,0); int[]intArr=new int[5]; intArr[0]=3;intArr[1]=4;intArr[2]=4;intArr[3]=3;intArr[4]=3; TriangleStripArray pla =new TriangleStripArray(20, GeometryArray.COLOR_3|GeometryArray.NORMALS|GeometryArray.COORDINATES,intArr); pla.setCoordinates(0, plaPts); PointAttributes a_point_just_bigger=new PointAttributes(); a_point_just_bigger.setPointSize(10.0f);//10 pixel-wide point a_point_just_bigger.setPointAntialiasingEnable(true);//now points are sphere-like(not a cube) app.setPointAttributes(a_point_just_bigger); PolygonAttributes la=new PolygonAttributes(); la.setPolygonMode(PolygonAttributes.POLYGON_FILL); la.setCullFace(PolygonAttributes.CULL_NONE); app.setPolygonAttributes(la); Material matt=new Material(); matt.setAmbientColor(new Color3f(1,1,1)); matt.setDiffuseColor(new Color3f(0.5f,0.5f,0.7f)); matt.setEmissiveColor(new Color3f(0.2f,0.2f,0.3f)); matt.setShininess(0.5f); matt.setSpecularColor(new Color3f(0.4f,0.6f,0.9f)); matt.setLightingEnable(true); app.setMaterial(matt); RenderingAttributes ra=new RenderingAttributes(); ra.setIgnoreVertexColors(true); app.setRenderingAttributes(ra); Shape3D plShape = new Shape3D(pla, app); TransformGroup objRotate = new TransformGroup(); MouseRotate mr=new MouseRotate(); mr.setTransformGroup(objRotate); mr.setSchedulingBounds(new BoundingSphere()); lineGroup.addChild(mr); MouseZoom mz=new MouseZoom(); mz.setTransformGroup(objRotate); mz.setSchedulingBounds(new BoundingSphere()); lineGroup.addChild(mz); MouseTranslate msl=new MouseTranslate(); msl.setTransformGroup(objRotate); msl.setSchedulingBounds(new BoundingSphere()); lineGroup.addChild(msl); objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objRotate.addChild(plShape); AmbientLight al=new AmbientLight(); // al.addScope(objRotate); al.setBounds(new BoundingSphere()); al.setEnable(true); al.setColor(new Color3f(1,1,1)); lineGroup.addChild(objRotate); lineGroup.addChild(al); return lineGroup; } public static void main(String[] args) { JFrame frame = new JFrame(); frame.add(new JScrollPane(new energon())); frame.setSize(300, 300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } 

output:

enter image description here

Do you want to change the color of the dots? Here is the new version:

 //skipping imports.. public final class energon extends JPanel { int s = 0, count = 0; public energon() { setLayout(new BorderLayout()); GraphicsConfiguration gc=SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas3D = new Canvas3D(gc); add("Center", canvas3D); BranchGroup scene = createSceneGraph(); scene.compile(); // SimpleUniverse is a Convenience Utility class SimpleUniverse simpleU = new SimpleUniverse(canvas3D); // This moves the ViewPlatform back a bit so the // objects in the scene can be viewed. simpleU.getViewingPlatform().setNominalViewingTransform(); simpleU.addBranchGraph(scene); } public BranchGroup createSceneGraph() { BranchGroup lineGroup = new BranchGroup(); Appearance app = new Appearance(); ColoringAttributes ca = new ColoringAttributes(new Color3f(204.0f, 204.0f, 204.0f), ColoringAttributes.SHADE_FLAT); app.setColoringAttributes(ca); Point3f[] plaPts = new Point3f[4]; Color3f[] colPts=new Color3f[4]; //parallel to coordinates, colors. for (int i = 0; i < 2; i++) { for (int j = 0; j <2; j++) { plaPts[count] = new Point3f(i/10.0f,j/10.0f,0); colPts[count]=new Color3f(i/3.0f,j/3.0f,(float) ((i+j)/3.0));//my arbitrary color set :) count++; } } PointArray pla = new PointArray(4, GeometryArray.COORDINATES|GeometryArray.COLOR_3); pla.setColors(0,colPts); //this is the color-array setting pla.setCoordinates(0, plaPts); //between here! PointAttributes a_point_just_bigger=new PointAttributes(); a_point_just_bigger.setPointSize(10.0f);//10 pixel-wide point a_point_just_bigger.setPointAntialiasingEnable(true);//now points are sphere-like(not a cube) app.setPointAttributes(a_point_just_bigger); //and here! sets the point-attributes so it is easily seen. Shape3D plShape = new Shape3D(pla, app); TransformGroup objRotate = new TransformGroup(); objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objRotate.addChild(plShape); lineGroup.addChild(objRotate); return lineGroup; } public static void main(String[] args) { JFrame frame = new JFrame(); frame.add(new JScrollPane(new energon())); frame.setSize(300, 300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } 

Output:

enter image description here

A new example with a custom cube shape and two directional lights with mouse and mouse button interaction:

 //skipped imports relating with char limit in this post public final class energon extends JPanel { int s = 0, count = 0; public energon() { setLayout(new BorderLayout()); GraphicsConfiguration gc=SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas3D = new Canvas3D(gc); add("Center", canvas3D); BranchGroup scene = createSceneGraph(); scene.compile(); // SimpleUniverse is a Convenience Utility class SimpleUniverse simpleU = new SimpleUniverse(canvas3D); // This moves the ViewPlatform back a bit so the // objects in the scene can be viewed. simpleU.getViewingPlatform().setNominalViewingTransform(); simpleU.addBranchGraph(scene); } public BranchGroup createSceneGraph() { BranchGroup lineGroup = new BranchGroup(); Appearance app = new Appearance(); QuadArray lsa = new QuadArray(48,QuadArray.COORDINATES|QuadArray.NORMALS); Vector3f [] normals=new Vector3f[24]; for(int i=0;i<24;i++)normals[i]=new Vector3f(); Point3f [] pts=new Point3f[24]; for(int i=0;i<24;i++)pts[i]=new Point3f(); Color3f [] clrs=new Color3f[24]; for(int i=0;i<24;i++)clrs[i]=new Color3f(0.5f,0.5f,0.5f); //cube=6 quads //first quad pts[0].x=-0.5f;pts[0].y=-0.5f;pts[0].z=-0.5f; pts[1].x=-0.5f;pts[1].y=-0.5f;pts[1].z=0.5f; pts[2].x=-0.5f;pts[2].y=0.5f;pts[2].z=0.5f; pts[3].x=-0.5f;pts[3].y=0.5f;pts[3].z=-0.5f; normals[0].x=-1;normals[1].x=-1;normals[2].x=-1;normals[3].x=-1; //second quad pts[4].x=0.5f;pts[4].y=-0.5f;pts[4].z=-0.5f; pts[5].x=0.5f;pts[5].y=-0.5f;pts[5].z=0.5f; pts[6].x=0.5f;pts[6].y=0.5f;pts[6].z=0.5f; pts[7].x=0.5f;pts[7].y=0.5f;pts[7].z=-0.5f; normals[4].x=1;normals[5].x=1;normals[6].x=1;normals[7].x=1; //third quad pts[8].x=-0.5f;pts[8].y=-0.5f;pts[8].z=-0.5f; pts[9].x=0.5f;pts[9].y=-0.5f;pts[9].z=-0.5f; pts[10].x=0.5f;pts[10].y=0.5f;pts[10].z=-0.5f; pts[11].x=-0.5f;pts[11].y=0.5f;pts[11].z=-0.5f; normals[8].z=-1;normals[9].z=-1;normals[10].z=-1;normals[11].z=-1; //fourth quad pts[12].x=-0.5f;pts[12].y=-0.5f;pts[12].z=0.5f; pts[13].x=0.5f;pts[13].y=-0.5f;pts[13].z=0.5f; pts[14].x=0.5f;pts[14].y=0.5f;pts[14].z=0.5f; pts[15].x=-0.5f;pts[15].y=0.5f;pts[15].z=0.5f; normals[12].z=1;normals[13].z=1;normals[14].z=1;normals[15].z=1; //fifth quad pts[16].x=-0.5f;pts[16].y=-0.5f;pts[16].z=-0.5f; pts[17].x=-0.5f;pts[17].y=-0.5f;pts[17].z=0.5f; pts[18].x=0.5f;pts[18].y=-0.5f;pts[18].z=0.5f; pts[19].x=0.5f;pts[19].y=-0.5f;pts[19].z=-0.5f; normals[16].y=-1;normals[17].y=-1;normals[18].y=-1;normals[19].y=-1; //sixth quad pts[20].x=-0.5f;pts[20].y=0.5f;pts[20].z=-0.5f; pts[21].x=-0.5f;pts[21].y=0.5f;pts[21].z=0.5f; pts[22].x=0.5f;pts[22].y=0.5f;pts[22].z=0.5f; pts[23].x=0.5f;pts[23].y=0.5f;pts[23].z=-0.5f; normals[20].y=1;normals[21].y=1;normals[22].y=1;normals[23].y=1; lsa.setNormals(0, normals); lsa.setCoordinates(0, pts); Shape3D sh=new Shape3D(); PolygonAttributes pa=new PolygonAttributes(); pa.setPolygonMode(PolygonAttributes.POLYGON_FILL); pa.setCullFace(PolygonAttributes.CULL_NONE); Material mat=new Material(); mat.setEmissiveColor(new Color3f(0.5f,0.5f,0.5f)); mat.setAmbientColor(new Color3f(0.1f,0.1f,0.1f)); mat.setDiffuseColor(new Color3f(0.2f,0.3f,0.4f)); mat.setSpecularColor(new Color3f(0.6f,0.3f,0.2f)); mat.setLightingEnable(true); RenderingAttributes ra=new RenderingAttributes(); ra.setIgnoreVertexColors(true); ColoringAttributes ca=new ColoringAttributes(); ca.setShadeModel(ColoringAttributes.SHADE_GOURAUD); ca.setColor(new Color3f(0.2f,0.5f,0.9f)); app.setColoringAttributes(ca); app.setRenderingAttributes(ra); app.setMaterial(mat); app.setPolygonAttributes(pa); sh.setGeometry(lsa); sh.setAppearance(app); sh.setPickable(true); TransformGroup objRotate = new TransformGroup(); objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objRotate.addChild(sh); DirectionalLight light1=new DirectionalLight(); light1.setInfluencingBounds(new BoundingSphere(new Point3d(-5.0,0,0),10.0)); light1.setColor(new Color3f(1f,1f,1f)); light1.setDirection(new Vector3f(0,1,0)); objRotate.addChild(light1); DirectionalLight light2=new DirectionalLight(); light2.setInfluencingBounds(new BoundingSphere(new Point3d(5.0,0,0),10.0)); light2.setColor(new Color3f(0.5f,1f,0.5f)); light2.setDirection(new Vector3f(0,-1,0)); objRotate.addChild(light2); MouseRotate f1=new MouseRotate(); f1.setSchedulingBounds(new BoundingSphere()); f1.setTransformGroup(objRotate); lineGroup.addChild(f1); objRotate.addChild(new Sphere(0.60f,1,128)); lineGroup.addChild(objRotate); return lineGroup; } public static void main(String[] args) { JFrame frame = new JFrame(); frame.add(new JScrollPane(new energon())); frame.setSize(300, 300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } 

Output:

enter image description here

The most important part is that you can use a triangulator to get a real 3D shape using only the coordinates of the point

  GeometryInfo ginfo=new GeometryInfo(GeometryInfo.POLYGON_ARRAY); Triangulator tr = new Triangulator(); NormalGenerator normalGenerator = new NormalGenerator(); Stripifier st = new Stripifier(); int [] iint=new int[]{4,4,4,4,4,4};-->each face of cube has 4 points ginfo.setStripCounts(iint); ginfo.setCoordinates(pts); tr.triangulate(ginfo); // ginfo contains the geometry normalGenerator.generateNormals( ginfo ); st.stripify(ginfo); sh.setGeometry(ginfo.getGeometryArray()); // shape is a Shape3D. //now you can use Shape3D-type sh as a 3D-surface-containing shape 

In the last example, you had to use a square, but now you can do the same only with dots and a triangulator:

 //skipping imports since char limit is reached in this answer public final class energon extends JPanel { int s = 0, count = 0; public energon() { setLayout(new BorderLayout()); GraphicsConfiguration gc=SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas3D = new Canvas3D(gc); add("Center", canvas3D); BranchGroup scene = createSceneGraph(); scene.compile(); // SimpleUniverse is a Convenience Utility class SimpleUniverse simpleU = new SimpleUniverse(canvas3D); // This moves the ViewPlatform back a bit so the // objects in the scene can be viewed. simpleU.getViewingPlatform().setNominalViewingTransform(); simpleU.addBranchGraph(scene); } public BranchGroup createSceneGraph() { BranchGroup lineGroup = new BranchGroup(); Appearance app = new Appearance(); Vector3f [] normals=new Vector3f[24]; for(int i=0;i<24;i++)normals[i]=new Vector3f(); Point3f [] pts=new Point3f[24]; for(int i=0;i<24;i++)pts[i]=new Point3f(); Color3f [] clrs=new Color3f[24]; for(int i=0;i<24;i++)clrs[i]=new Color3f(0.5f,0.5f,0.5f); //cube=6 quads //first quad pts[0].x=-0.5f;pts[0].y=-0.5f;pts[0].z=-0.5f; pts[1].x=-0.5f;pts[1].y=-0.5f;pts[1].z=0.5f; pts[2].x=-0.5f;pts[2].y=0.5f;pts[2].z=0.5f; pts[3].x=-0.5f;pts[3].y=0.5f;pts[3].z=-0.5f; normals[0].x=-1;normals[1].x=-1;normals[2].x=-1;normals[3].x=-1; //second quad pts[4].x=0.5f;pts[4].y=-0.5f;pts[4].z=-0.5f; pts[5].x=0.5f;pts[5].y=-0.5f;pts[5].z=0.5f; pts[6].x=0.5f;pts[6].y=0.5f;pts[6].z=0.5f; pts[7].x=0.5f;pts[7].y=0.5f;pts[7].z=-0.5f; normals[4].x=1;normals[5].x=1;normals[6].x=1;normals[7].x=1; //third quad pts[8].x=-0.5f;pts[8].y=-0.5f;pts[8].z=-0.5f; pts[9].x=0.5f;pts[9].y=-0.5f;pts[9].z=-0.5f; pts[10].x=0.5f;pts[10].y=0.5f;pts[10].z=-0.5f; pts[11].x=-0.5f;pts[11].y=0.5f;pts[11].z=-0.5f; normals[8].z=-1;normals[9].z=-1;normals[10].z=-1;normals[11].z=-1; //fourth quad pts[12].x=-0.5f;pts[12].y=-0.5f;pts[12].z=0.5f; pts[13].x=0.5f;pts[13].y=-0.5f;pts[13].z=0.5f; pts[14].x=0.5f;pts[14].y=0.5f;pts[14].z=0.5f; pts[15].x=-0.5f;pts[15].y=0.5f;pts[15].z=0.5f; normals[12].z=1;normals[13].z=1;normals[14].z=1;normals[15].z=1; //fifth quad pts[16].x=-0.5f;pts[16].y=-0.5f;pts[16].z=-0.5f; pts[17].x=-0.5f;pts[17].y=-0.5f;pts[17].z=0.5f; pts[18].x=0.5f;pts[18].y=-0.5f;pts[18].z=0.5f; pts[19].x=0.5f;pts[19].y=-0.5f;pts[19].z=-0.5f; normals[16].y=-1;normals[17].y=-1;normals[18].y=-1;normals[19].y=-1; //sixth quad pts[20].x=-0.5f;pts[20].y=0.5f;pts[20].z=-0.5f; pts[21].x=-0.5f;pts[21].y=0.5f;pts[21].z=0.5f; pts[22].x=0.5f;pts[22].y=0.5f;pts[22].z=0.5f; pts[23].x=0.5f;pts[23].y=0.5f;pts[23].z=-0.5f; normals[20].y=1;normals[21].y=1;normals[22].y=1;normals[23].y=1; Shape3D sh=new Shape3D(); PolygonAttributes pa=new PolygonAttributes(); pa.setPolygonMode(PolygonAttributes.POLYGON_FILL); pa.setCullFace(PolygonAttributes.CULL_NONE); Material mat=new Material(); mat.setEmissiveColor(new Color3f(0.5f,0.5f,0.5f)); mat.setAmbientColor(new Color3f(0.1f,0.1f,0.1f)); mat.setDiffuseColor(new Color3f(0.2f,0.3f,0.4f)); mat.setSpecularColor(new Color3f(0.6f,0.3f,0.2f)); mat.setLightingEnable(true); RenderingAttributes ra=new RenderingAttributes(); ra.setIgnoreVertexColors(true); ColoringAttributes ca=new ColoringAttributes(); ca.setShadeModel(ColoringAttributes.SHADE_GOURAUD); ca.setColor(new Color3f(0.2f,0.5f,0.9f)); app.setColoringAttributes(ca); app.setRenderingAttributes(ra); app.setMaterial(mat); app.setPolygonAttributes(pa); sh.setAppearance(app); sh.setPickable(true); GeometryArray ga=null; GeometryInfo ginfo=new GeometryInfo(GeometryInfo.POLYGON_ARRAY); Triangulator tr = new Triangulator(); NormalGenerator normalGenerator = new NormalGenerator(); Stripifier st = new Stripifier(); int [] iint=new int[]{4,4,4,4,4,4}; ginfo.setStripCounts(iint); ginfo.setCoordinates(pts); tr.triangulate(ginfo); // ginfo contains the geometry normalGenerator.generateNormals( ginfo ); st.stripify(ginfo); sh.setGeometry(ginfo.getGeometryArray()); // shape is a Shape3D. TransformGroup objRotate = new TransformGroup(); objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objRotate.addChild(sh); DirectionalLight light1=new DirectionalLight(); light1.setInfluencingBounds(new BoundingSphere(new Point3d(-5.0,0,0),10.0)); light1.setColor(new Color3f(1f,1f,1f)); light1.setDirection(new Vector3f(0,1,0)); objRotate.addChild(light1); DirectionalLight light2=new DirectionalLight(); light2.setInfluencingBounds(new BoundingSphere(new Point3d(5.0,0,0),10.0)); light2.setColor(new Color3f(0.5f,1f,0.5f)); light2.setDirection(new Vector3f(0,-1,0)); objRotate.addChild(light2); MouseRotate f1=new MouseRotate(); f1.setSchedulingBounds(new BoundingSphere()); f1.setTransformGroup(objRotate); lineGroup.addChild(f1); objRotate.addChild(new Sphere(0.60f,1,128)); lineGroup.addChild(objRotate); return lineGroup; } public static void main(String[] args) { JFrame frame = new JFrame(); frame.add(new JScrollPane(new energon())); frame.setSize(300, 300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } 

Conclusion: The same thing! you just give the coordinates of points and face-vertex numbers

enter image description hereenter image description here

  • set the number of lines
  • set the coordinates (from your tiff)
  • Triangulate
  • generate normals
  • stripify
  • .getGeometry (finished)
+24
source

Source: https://habr.com/ru/post/1432885/


All Articles