Java 3D入門之基本圖形功能 附源碼
坐標(biāo)系

- 1、原點(diǎn)O在顯示器的中間。
- 2、Z軸是指向屏幕之外的,也就是觀察者。
- 3、由于觀察者眼睛,即觀察方向是指向Z軸的反方向,所以當(dāng)定義好圖形之后,光源的方向一定不能是指向Z軸的正方向,否則無法觀察到圖形。(根據(jù)光的反射)
基本體組合的顯示實(shí)例
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)系原點(diǎn)球形范圍
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è)置對(duì)該TransformGroup的讀寫能力
transformgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
transformgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
//將該TransformGroup加入到BranchGroupRoot中
BranchGroupRoot.addChild(transformgroup);
//定義鼠標(biāo)對(duì)場景的旋轉(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);
//定義兩個(gè)三維型體的外觀
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);
//定義一個(gè)球體于一個(gè)長方體的大小、外觀屬性與坐標(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));
//將定義好的兩個(gè)TransformGroup(tg1、tg2)加入到總的transformgroup
transformgroup.addChild(tg1);
transformgroup.addChild(tg2);
//對(duì)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)選擇視點(diǎn)在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ù)組給出頂點(diǎn)的坐標(biāo)值,從前向后一次以3個(gè)頂點(diǎn)形成一個(gè)三角形,并且上一個(gè)三角形與下一個(gè)三角形之間沒有公共頂點(diǎn)。
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);
}
}

三角扇圖形
以第一個(gè)頂點(diǎn)為公用頂點(diǎn),依次與其余頂點(diǎn)分別連接形成三角形。其中給定的定點(diǎn)數(shù)至少為3個(gè)。
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ù)組表示生成的三角扇個(gè)數(shù)
eg:總共十二個(gè)頂點(diǎn)
new stripCount[1],表示生成一個(gè)扇區(qū)。所以stripCount[0]=12,這一個(gè)扇區(qū)有十二個(gè)點(diǎn)。
該程序,用頂點(diǎn)顏色插值生成線與面顏色,這種顏色無需光照,也能顯示。

四邊面圖形
以頂點(diǎn)坐標(biāo)數(shù)組中給出的一維頂點(diǎn)數(shù)組,從前向后依次以4個(gè)頂點(diǎn)形成一個(gè)四邊形面,并且相鄰兩個(gè)四邊形面之間沒有公用頂點(diǎn)。給定的總的頂點(diǎn)數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 實(shí)現(xiàn)加密數(shù)據(jù)庫連接的步驟
這篇文章主要介紹了Java 實(shí)現(xiàn)加密數(shù)據(jù)庫連接的步驟,幫助大家更好的理解和使用Java處理數(shù)據(jù)庫,感興趣的朋友可以了解下2020-11-11
Java response響應(yīng)體和文件下載實(shí)現(xiàn)原理
這篇文章主要介紹了Java response響應(yīng)體和文件下載實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
java編程實(shí)現(xiàn)兩個(gè)大數(shù)相加代碼示例
這篇文章主要介紹了java編程實(shí)現(xiàn)兩個(gè)大數(shù)相加代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-12-12
自己動(dòng)手實(shí)現(xiàn)mybatis動(dòng)態(tài)sql的方法
下面小編就為大家分享一篇自己動(dòng)手實(shí)現(xiàn)mybatis動(dòng)態(tài)sql的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12
SpringBoot事件發(fā)布與監(jiān)聽超詳細(xì)講解
今天去官網(wǎng)查看spring boot資料時(shí),在特性中看見了系統(tǒng)的事件及監(jiān)聽章節(jié),所以下面這篇文章主要給大家介紹了關(guān)于SpringBoot事件發(fā)布和監(jiān)聽的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
ApiOperation和ApiParam注解依賴的安裝和使用以及注意事項(xiàng)說明
這篇文章主要介紹了ApiOperation和ApiParam注解依賴的安裝和使用以及注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
MyBatis使用注解開發(fā)實(shí)現(xiàn)步驟解析
這篇文章主要介紹了MyBatis使用注解開發(fā)實(shí)現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Maven基礎(chǔ)之如何修改本地倉庫的默認(rèn)路徑
這篇文章主要介紹了Maven基礎(chǔ)之如何修改本地倉庫的默認(rèn)路徑問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05

