坐標(biāo)系
- 1、原點O在顯示器的中間。
- 2、Z軸是指向屏幕之外的,也就是觀察者。
- 3、由于觀察者眼睛,即觀察方向是指向Z軸的反方向,所以當(dāng)定義好圖形之后,光源的方向一定不能是指向Z軸的正方向,否則無法觀察到圖形。(根據(jù)光的反射)
基本體組合的顯示實例
import java.applet.Applet; import java.awt.BorderLayout; import java.awt.GraphicsConfiguration; import javax.media.j3d.*; import javax.vecmath.Color3f; import javax.vecmath.Point3d; import javax.vecmath.Vector3f; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.behaviors.mouse.MouseRotate; import com.sun.j3d.utils.behaviors.mouse.MouseTranslate; import com.sun.j3d.utils.behaviors.mouse.MouseZoom; import com.sun.j3d.utils.geometry.Box; import com.sun.j3d.utils.geometry.Sphere; import com.sun.j3d.utils.universe.SimpleUniverse; public class towprimitivedisplay extends Applet { public BranchGroup createBranchGroup() { //定義BranchGroup BranchGroup BranchGroupRoot = new BranchGroup (); //創(chuàng)建球心在坐標(biāo)系原點球形范圍 BoundingSphere bounds = new BoundingSphere(new Point3d( 0.0,0.0,0.0),100.0); //定義背景顏色 Color3f bgColor=new Color3f(.0f,.0f,.0f); Background bg=new Background(bgColor); bg.setApplicationBounds(bounds); BranchGroupRoot.addChild(bg); //定義平行光、顏色、照射方向與作用范圍 Color3f directionColor=new Color3f(1.f,1.f,1.f); Vector3f vec=new Vector3f(1.0f,-1.0f,-1.0f); DirectionalLight directionalLight= new DirectionalLight(directionColor,vec); directionalLight.setInfluencingBounds(bounds); BranchGroupRoot.addChild(directionalLight); //定義總的TransformGroup:transformgroup TransformGroup transformgroup=new TransformGroup(); //設(shè)置對該TransformGroup的讀寫能力 transformgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); transformgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); //將該TransformGroup加入到BranchGroupRoot中 BranchGroupRoot.addChild(transformgroup); //定義鼠標(biāo)對場景的旋轉(zhuǎn)、平移與放大功能 MouseRotate mouserotate=new MouseRotate(); mouserotate.setTransformGroup(transformgroup); BranchGroupRoot.addChild(mouserotate); mouserotate.setSchedulingBounds(bounds); MouseZoom mousezoom=new MouseZoom(); mousezoom.setSchedulingBounds(bounds); BranchGroupRoot.addChild(mousezoom); mousezoom.setSchedulingBounds(bounds); MouseTranslate mousetranslate=new MouseTranslate(); mousetranslate.setTransformGroup(transformgroup); BranchGroupRoot.addChild(mousetranslate); mousetranslate.setSchedulingBounds(bounds); //定義兩個三維型體的外觀 Appearance app1=new Appearance(); Material material1=new Material(); material1.setDiffuseColor(new Color3f(1.0f,.0f,0.0f)); app1.setMaterial(material1); Appearance app2=new Appearance(); Material material2=new Material(); material2.setDiffuseColor(new Color3f(0.0f,1.0f,0.0f)); app2.setMaterial(material2); //定義一個球體于一個長方體的大小、外觀屬性與坐標(biāo)變換,并定義相應(yīng)的TransformGroup:ta1、ta2 TransformGroup tg1=new TransformGroup(); tg1.addChild(new Sphere(0.3f,app1)); Transform3D t=new Transform3D(); t.setTranslation(new Vector3f(0.f,-0.425f,0.f)); TransformGroup tg2=new TransformGroup(t); tg2.addChild(new Box(0.5f,0.05f,0.5f,app2)); //將定義好的兩個TransformGroup(tg1、tg2)加入到總的transformgroup transformgroup.addChild(tg1); transformgroup.addChild(tg2); //對BranchGroupRoot預(yù)編譯 BranchGroupRoot.compile(); //通過方法名返回BranchGroupRoot return BranchGroupRoot; } public towprimitivedisplay() { //設(shè)置顯示界面的相關(guān)參數(shù) setLayout(new BorderLayout()); //創(chuàng)建投影平面Canvas3D GraphicsConfiguration gc=SimpleUniverse.getPreferredConfiguration(); Canvas3D c=new Canvas3D(gc); //將投影平面上的圖像顯示在顯示平面的中間 add("Center",c); //設(shè)置SimpleUniverse,由系統(tǒng)選擇視點在z軸的正向,觀察方向沿z軸反向 BranchGroup BranchGroupScene=createBranchGroup(); SimpleUniverse u=new SimpleUniverse(c); u.getViewingPlatform().setNominalViewingTransform(); //將BranchGroup:BranchGroupScene加入到SimpleUniverse:u中 u.addBranchGraph(BranchGroupScene); } public static void main(String[] args) {//通過MainFrame顯示圖像 new MainFrame(new towprimitivedisplay(),300,300); } }
由于光源方向是:
Vector3f vec=new Vector3f(-1.f,-1.f,-1.0f); 即指向第七象限。所以結(jié)果是:
如果改變光源方向:
Vector3f vec=new Vector3f(0.0f,0.0f,-1.0f);光源指向Z軸反方向
Vector3f vec=new Vector3f(-1.0f,0.0f,0.0f);光源指向X軸反方向
三角面圖形
以一維數(shù)組給出頂點的坐標(biāo)值,從前向后一次以3個頂點形成一個三角形,并且上一個三角形與下一個三角形之間沒有公共頂點。
import java.awt.BorderLayout; import java.awt.GraphicsConfiguration; import javax.media.j3d.Appearance; import javax.media.j3d.Background; import javax.media.j3d.BoundingSphere; import javax.media.j3d.BranchGroup; import javax.media.j3d.Canvas3D; import javax.media.j3d.DirectionalLight; import javax.media.j3d.PolygonAttributes; import javax.media.j3d.Shape3D; import javax.media.j3d.TransformGroup; import javax.media.j3d.TriangleArray; import javax.vecmath.Color3f; import javax.vecmath.Point3d; import javax.vecmath.Vector3f; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.behaviors.mouse.MouseRotate; import com.sun.j3d.utils.behaviors.mouse.MouseTranslate; import com.sun.j3d.utils.behaviors.mouse.MouseZoom; import com.sun.j3d.utils.universe.SimpleUniverse; import java.applet.Applet; public class DisplayTriangles extends Applet { public BranchGroup createBranchGroup() { BranchGroup BranchGroupRoot = new BranchGroup(); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0); Color3f bgColor = new Color3f(1.0f, 1.0f, 1.0f); Background bg = new Background(bgColor); bg.setApplicationBounds(bounds); BranchGroupRoot.addChild(bg); Color3f directionalColor = new Color3f(1.f, 0.f, 0.f); Vector3f vec = new Vector3f(0.f, 0.f, -1.0f); DirectionalLight directionalLight = new DirectionalLight(directionalColor, vec); directionalLight.setInfluencingBounds(bounds); BranchGroupRoot.addChild(directionalLight); TransformGroup transformgroup = new TransformGroup(); transformgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); transformgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); BranchGroupRoot.addChild(transformgroup); MouseRotate mouserotate = new MouseRotate(); mouserotate.setTransformGroup(transformgroup); BranchGroupRoot.addChild(mouserotate); mouserotate.setSchedulingBounds(bounds); MouseZoom mousezoom = new MouseZoom(); mousezoom.setTransformGroup(transformgroup); BranchGroupRoot.addChild(mousezoom); mousezoom.setSchedulingBounds(bounds); MouseTranslate mousetranslate = new MouseTranslate(); mousetranslate.setTransformGroup(transformgroup); BranchGroupRoot.addChild(mousetranslate); mousetranslate.setSchedulingBounds(bounds); transformgroup.addChild(new TriangleArrays()); BranchGroupRoot.compile(); return BranchGroupRoot; } public DisplayTriangles() { setLayout(new BorderLayout()); GraphicsConfiguration gc = SimpleUniverse.getPreferredConfiguration(); Canvas3D c = new Canvas3D(gc); add("Center", c); BranchGroup BranchGroupScene = createBranchGroup(); SimpleUniverse u = new SimpleUniverse(c); u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(BranchGroupScene); } public static void main(String[] args) { new MainFrame(new DisplayTriangles(), 300, 300); } } //outsideclass class TriangleArrays extends Shape3D { public TriangleArrays() { int vCount = 12; float vertexes[] = { -0.6f,0.9f,0.0f, -0.6f,-0.9f,0.2f, -0.4f, 0.9f, -0.2f, -0.2f, -0.9f, 0.2f, 0.0f, 0.9f,-0.2f, 0.0f, -0.9f, 0.2f, 0.2f, 0.7f, 0.0f, 0.2f, -0.9f, 0.3f, 0.5f, 0.8f, -0.3f, 0.6f, -.9f, 0.0f, 0.8f, 0.9f, 0.2f, 0.8f, -0.8f, 0.3f }; float colors[] = { 0.0f,0.5f,1.0f, 0.0f,0.5f,1.0f, 0.0f,0.8f,.0f, 1.0f,0.0f,0.3f, 0.0f,1.0f,0.5f, 0.9f,1.0f,0.0f, 0.5f,0.0f,1.0f, 0.0f,0.5f,1.0f, 1.0f,0.5f,0.0f, 1.0f,0.0f,0.5f, 1.0f,0.8f,0.0f, 1.0f,0.5f,0.0f}; TriangleArray trianglearray = new TriangleArray(vCount, TriangleArray.COORDINATES | TriangleArray.COLOR_3); trianglearray.setCoordinates(0, vertexes); trianglearray.setColors(0, colors); PolygonAttributes polygonattributes = new PolygonAttributes(); //polygonattributes.setCullFace(PolygonAttributes.CULL_NONE); //polygonattributes.setCullFace(PolygonAttributes.CULL_FRONT); polygonattributes.setCullFace(PolygonAttributes.CULL_BACK); Appearance app = new Appearance(); app.setPolygonAttributes(polygonattributes); this.setGeometry(trianglearray); this.setAppearance(app); } }
三角扇圖形
以第一個頂點為公用頂點,依次與其余頂點分別連接形成三角形。其中給定的定點數(shù)至少為3個。
class ShapeTriangleFanArray extends Shape3D { public ShapeTriangleFanArray() { int vertexesCount = 12; int stripCount[] = new int[1]; //int stripCount[]=new int[2]; //int stripCount[]=new int[3]; float vertexes[] = { .0f, 0.9f, 0.0f, -1.f, -0.8f, 0.f, -0.8f, -0.6f, -0.2f, -0.6f, -0.9f, 0.2f, -0.4f, -0.8f,-0.2f, 0.f, -0.8f, 0.2f, 0.2f, -0.5f, 0.0f, 0.4f, -0.6f, -0.5f, 0.6f, -0.8f, -0.3f, 0.8f, -0.9f, -0.2f, 0.9f, -0.7f, -0.2f, 1.1f, -0.8f, -0.3f }; float colors[] = { 0.0f, 0.5f, 1.0f, 0.0f, 0.5f, 1.0f, 0.0f, 0.8f, .0f, 1.0f, 0.0f, 0.3f, 0.0f, 1.0f, 0.5f,0.9f, 1.0f, 0.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.5f, 1.0f, 1.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.5f, 1.0f, 0.8f,0.0f, 1.0f, 0.5f, 0.0f }; stripCount[0] = 12; //stripCount[1]=4; //stripCount[2]=4; TriangleFanArray triangleFanarray = new TriangleFanArray(vertexesCount, TriangleFanArray.COORDINATES | TriangleFanArray.COLOR_3, stripCount); triangleFanarray.setCoordinates(0, vertexes); triangleFanarray.setColors(0, colors); PolygonAttributes polygonattributes = new PolygonAttributes(); polygonattributes.setCullFace(PolygonAttributes.CULL_NONE); Appearance app = new Appearance(); app.setPolygonAttributes(polygonattributes); this.setGeometry(triangleFanarray); this.setAppearance(app); } }
int stripCount[];數(shù)組表示生成的三角扇個數(shù)
eg:總共十二個頂點
new stripCount[1],表示生成一個扇區(qū)。所以stripCount[0]=12,這一個扇區(qū)有十二個點。
該程序,用頂點顏色插值生成線與面顏色,這種顏色無需光照,也能顯示。
四邊面圖形
以頂點坐標(biāo)數(shù)組中給出的一維頂點數(shù)組,從前向后依次以4個頂點形成一個四邊形面,并且相鄰兩個四邊形面之間沒有公用頂點。給定的總的頂點數(shù)必須是4的倍數(shù)。
class ShapeQuadArray extends Shape3D {public ShapeQuadArray() {int vertexCount=12; float vertexes[]={ -0.8f,0.9f,0.0f, -0.8f,-0.8f,0.f, -0.6f,-0.8f,0.f, -0.6f,0.9f,0.f, -0.4f,0.9f,0.f, -0.4f,-0.7f,-0.9f, 0.4f,-0.8f,0.f, 0.4f,0.8f,0.0f, 0.5f,0.8f,0.f, 0.6f,-0.8f,0.0f, 0.8f,-0.7f,0.f, 0.8f,0.8f,0.f}; float colors[]={0.0f,0.5f,1.0f, 0.0f,0.5f,1.0f, 0.0f,0.8f,.0f, 1.0f,0.0f,0.3f, 0.0f,1.0f,0.5f, 0.9f,1.0f,0.0f, 0.5f,0.0f,1.0f, 0.0f,0.5f,1.0f, 1.0f,0.5f,0.0f, 1.0f,0.0f,0.5f, 1.0f,0.8f,0.0f, 1.0f,0.5f,0.0f }; QuadArray quadarray=new QuadArray(vertexCount, QuadArray.COORDINATES|QuadArray.COLOR_3); quadarray.setCoordinates(0,vertexes); quadarray.setColors(0,colors); PolygonAttributes polygonattributes=new PolygonAttributes(); polygonattributes.setCullFace(PolygonAttributes.CULL_NONE); //polygonattributes.setCullFace(PolygonAttributes.CULL_BACK); //polygonattributes.setCullFace(PolygonAttributes.CULL_FRONT); Appearance app=new Appearance(); app.setPolygonAttributes(polygonattributes); this.setGeometry(quadarray); this.setAppearance(app); }}
到此這篇關(guān)于Java 3D入門之基本圖形功能 附源碼的文章就介紹到這了,更多相關(guān)Java 3D內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/weixin_46369022/article/details/120802562