Java3d學習筆記(3)

1.使用java3d提供的圖形api繪製圖形

由於例子很多,所以這裏只演示一個例子

package com.java3d.study;

import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.DirectionalLight;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;

import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.universe.SimpleUniverse;

public class Java3DShape {
    public Java3DShape(){

        //構建空間 和物體

        // 創建一個虛擬空間
        SimpleUniverse universe = new  SimpleUniverse();
        // 創建一個用來包含對象的數據結構
        BranchGroup group = new BranchGroup();
        // 創建一個圓柱形狀並把它加入到group中
        Cylinder cylinder=new Cylinder(.5f,1.0f); //圓柱型
        group.addChild(cylinder);

        //燈光構造

        Color3f light1Color = new Color3f(1.8f, 0.1f, 0.1f);
        // 設置光線的顏色
        BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
        // 設置光線的作用範圍
        Vector3f light1Direction  = new Vector3f(4.0f, -7.0f, -12.0f);
        // 設置光線的方向
        DirectionalLight light1= new DirectionalLight(light1Color, light1Direction);
          // 指定顏色和方向,產生單向光源
        light1.setInfluencingBounds(bounds);
        // 把光線的作用範圍加入光源中
        group.addChild(light1);
        // 將光源加入group組
        // 安放觀察點
        universe.getViewingPlatform().setNominalViewingTransform();
        // 把group加入到虛擬空間中
        universe.addBranchGraph(group);
    }

    public static void main(String[] args) {
        new Java3DShape();
    }
}

這裏寫圖片描述

2.使用三角網繪製三維圖形

用IndexedTriangleStripArray創建連續的三角形面,在頂點座標數組中,前三個點將創建一個三角形面,從第4個頂點開始,每個頂點和前一個三角形面的後兩個頂點組成一個三角形面。這裏我們用IndexedTriangleStripArray創建一個皇冠,先用50個頂點創建皇冠下部的圓環,然後在圓環的上邊沿挑選24個頂點,與頂點數組中後12個頂點組成12個三角片面,形成皇冠上的三角形裝飾物。因此頂點數組中一共有62個元素,期中有24個頂點用了2次,共生成13組三角形面。

這裏寫圖片描述

package com.java3d.study;

import javax.media.j3d.Appearance;
import javax.media.j3d.Background;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.IndexedTriangleArray;
import javax.media.j3d.IndexedTriangleStripArray;
import javax.media.j3d.Material;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.TriangleArray;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Point3f;
import javax.vecmath.Vector3f;

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.GeometryInfo;
import com.sun.j3d.utils.geometry.NormalGenerator;
import com.sun.j3d.utils.scenegraph.io.state.javax.media.j3d.IndexedTriangleStripArrayState;
import com.sun.j3d.utils.universe.SimpleUniverse;

public class Demo2 {
    BranchGroup createSceneGraph()
    {
        BranchGroup BranchGroup1=new BranchGroup();
        BoundingSphere BoundingSphere1=new BoundingSphere(new Point3d(0,0,0),100);
        Color3f color3f=new Color3f(1f,1f,1f);
        Background Background1=new Background(color3f);
        Background1.setApplicationBounds(BoundingSphere1);
        BranchGroup1.addChild(Background1);
        color3f=new Color3f(1f,1f,1f);
        Vector3f vector3f=new Vector3f(0f,0f,-1f);
        DirectionalLight DirectionalLight1=new DirectionalLight(color3f,vector3f);
        DirectionalLight1.setInfluencingBounds(BoundingSphere1);
        BranchGroup1.addChild(DirectionalLight1);
        TransformGroup TransformGroup1=new TransformGroup();
        TransformGroup1.setCapability(18);
        TransformGroup1.setCapability(17);
        BranchGroup1.addChild(TransformGroup1);
        MouseRotate MouseRotate1=new MouseRotate(TransformGroup1);
        MouseRotate1.setTransformGroup(TransformGroup1);
        MouseRotate1.setSchedulingBounds(BoundingSphere1);
        BranchGroup1.addChild(MouseRotate1);
        MouseZoom MouseZoom1=new MouseZoom();
        MouseZoom1.setTransformGroup(TransformGroup1);
        MouseZoom1.setSchedulingBounds(BoundingSphere1);
        BranchGroup1.addChild(MouseZoom1);
        MouseTranslate MouseTranslate1=new MouseTranslate();
        MouseTranslate1.setTransformGroup(TransformGroup1);
        MouseTranslate1.setSchedulingBounds(BoundingSphere1);
        Transform3D transform3D = new Transform3D ();
        transform3D.setScale(0.5);
        TransformGroup TransformGroup2=new TransformGroup(transform3D);
        BranchGroup1.addChild(MouseTranslate1);
        Appearance Appearance1=new Appearance();
        Material Material1=new Material();
        Material1.setDiffuseColor(new Color3f(1f,1f,0f));
        Appearance1.setMaterial(Material1);
        int n=24;
        int i;
        float x1,x2,y1,y2,z1,z2;
        //創建Point3f類型的頂點數組和Color3f類型的顏色數組,用於存放點的頂點座標和顏色值,數組的大小爲62,
        //前50個爲半徑大小相同,高度不同的點;後12個點爲半徑略大,位置較高的頂點。
        Point3f[] vert=new Point3f[62];
        Color3f[] colors=new Color3f[62];
        for(i=0;i<n;i++)
        {
            x1=(float)(0.6f*Math.cos(i*2*Math.PI/24));
            y1=0.1f;;
            z1=(float)(0.6f*Math.sin(i*2*Math.PI/24));
            vert[i*2]=new Point3f(x1,y1,z1);
            x2=(float)(0.6f*Math.cos(i*2*Math.PI/24));
            y2=0.1f;;
            z2=(float)(0.6f*Math.sin(i*2*Math.PI/24));
            vert[i*2+1]=new Point3f(x2,y2,z2);
        } 
        vert[48]=new Point3f(0.6f,0.1f,0.0f);
        vert[49]=new Point3f(0.6f,-0.1f,0.0f);
        for(i=50;i<62;i++)
        {
            x1=(float)(0.65f*Math.cos((i-50)*2*Math.PI/12));
            y1=0.35f;
            z1=(float)(0.65f*Math.sin((i-50)*2*Math.PI/12));
            vert[i]=new Point3f(x1,y1,z1);
        }
        for(i=0;i<62;i++)colors[i]=new Color3f(1f,0f,1f);
        //創建索引數組index,因爲有24個點要使用2次,因此index數組的大小爲62+24=86,
        //數組中每3個頂點組成一個三角形面
        int[] index=new int[62+24];
        for(i=0;i<50;i++)index[i]=i;
        for(i=0;i<12;i++)
        {
            index[i*3+50]=i*4;
            index[i*3+1+50]=i*4+4;
            index[i*3+2+50]=i+50;

        }
        //定義創建13組三角形面,前50個頂點爲一組三角形面,後36個頂點每3個頂點爲一組三角形面
        int[] StripCount=new int[13];
        StripCount[0]=50;
        for(i=1;i<13;i++)
        {
            StripCount[i]=3;

        }
        /*
         *IndexedTriangleStripArray(int vertexCount, int vertexFormat, int indexCount, int[] stripIndexCounts) 
         *Constructs an empty IndexedTriangleStripArray object using the specified parameters. 
         */
        IndexedTriangleStripArray indexedTriangleStripArray = new IndexedTriangleStripArray(vert.length,IndexedTriangleStripArray.COORDINATES|IndexedTriangleStripArray.COLOR_3,index.length,StripCount);
        indexedTriangleStripArray.setCoordinates(0,vert);
        indexedTriangleStripArray.setCoordinateIndices(0,index);
        indexedTriangleStripArray.setColors(0,colors);
        Shape3D shape3D=new Shape3D();
        System.out.println(IndexedTriangleArray.COORDINATES);//|IndexedTriangleArray.COLOR_3);
        GeometryInfo GeometryInfo1=new GeometryInfo(indexedTriangleStripArray);
        NormalGenerator NormalGenerator1=new NormalGenerator();
        NormalGenerator1.generateNormals(GeometryInfo1);
        shape3D.setGeometry(GeometryInfo1.getGeometryArray());
        shape3D.setAppearance(Appearance1);
        TransformGroup2.addChild(shape3D);
        TransformGroup1.addChild(TransformGroup2);
        BranchGroup1.compile();
        return BranchGroup1;
        }

    public static void main( String[] args ) { 
        SimpleUniverse universe = new SimpleUniverse(); 
         universe.getViewingPlatform().setNominalViewingTransform(); 
         BranchGroup group = new Demo2().createSceneGraph();
         universe.addBranchGraph(group);  
        } 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章