如何使用Java3D API在java中绘制简单的3D点(x,y,z)?

我正在使用Java技术在netbeans平台上制作桌面应用程序。 我做了一些图像处理,数据库function,图像捕获过程; 但现在我想在3D视图中绘制图像。
所以,我想首先我必须制作我的.tiff 16位灰度图像的点阵,然后使用这个点阵。 我试了一下,我的代码在下面,但它不起作用。
那么我该如何使用这个点数组在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); } } 

使用SimpleUniverse.getPreferredConfiguration() GraphicsConfiguration类创建SimpleUniverseCanvas3D 。 然后创建一个BranchGraph。 添加TransformGraph作为BranchGraph的子项。 然后将您的Shape3D添加为TransformGraph的子项。 Shape3D必须有两件事:几何(你的点数组)和外观。 从外观上看,您可以制作多种规格的材料和照明。

如果你只使用点数组,你只能看到点。 如果你想要填充多边形或LineStripArray,如果你想要线条,应该使用TriangleStripArray或类似的东西。

使用TransformGroup旋转和翻译。 别忘了加光。

TransformGroup需要Transform3D类作为参数来旋转和平移或缩放。

如果你的Shape3D是一个表面,你可以给它定制颜色或使用材料并在它附近放一个灯,否则你看不到它。 别忘了设置lightsource绑定范围,以便光线到达对象。

  • PointArray —>云状的形状
  • LineArray —>用于虚线
  • LineStripArray – >用于行
  • TriangleArray —>离婚三角形(表面)
  • TriangleStripArray —>相邻三角形(表面)
  • TriangleFanArray —->喜欢建立一个点(对于一个表面)的三角形
  • QuadArray —->需要六个四边形才能有一个立方体
  • QuadStripArray —>可以构造一个具有较小坐标数组的立方体

另一件重要事情:

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

使你的观察范围更远,所以移动时物体不会消失。

将鼠标交互附加到转换组

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

如果要将1580 x 1050图像映射到默认的3D视图范围,则应将点坐标除以1000.(或在变换组中缩小至第1000个)

寻找教程:

http://www.java3d.org/

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

在这里,我将您的教程调整为energon.class

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

输出:

在此处输入图像描述

好的,我们可以添加一个点大小,这样我们就可以清楚地看到它们(将在一分钟内添加)

新代码(刚添加2-3行)

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

输出:

在此处输入图像描述

这是另一个使用trianglestriparray绘制一种箭头形状,同时你可以使用鼠标按钮(其中3个)放大,旋转和平移。

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

输出:

在此处输入图像描述

你想改变点的颜色吗? 这是新版本:

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

输出:

在此处输入图像描述

自定义立方体形状和两个定向灯与左键 - 鼠标按钮交互的新示例:

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

输出:

在此处输入图像描述

最重要的部分是,您可以使用三角测量仪仅使用点坐标来获得真实的3D形状

  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 

在最后一个示例中,您必须使用quadarray,但现在,您只需使用点和三角形即可:

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

输出:一样的! 你只需要给出点的坐标和面顶点数

在此处输入图像描述在此处输入图像描述

  • 设置条带计数
  • 设置坐标(来自你的tiff)
  • 三角
  • 生成法线
  • stripify
  • .getGeometry(完)