Exception in thread "main" java.lang.NullPointerException
at javamodel.LoadModelDemo.loadModel(LoadModelDemo.java:90)
at javamodel.LoadModelDemo.createSceneGroup(LoadModelDemo.java:50)
at javamodel.LoadModelDemo.<init>(LoadModelDemo.java:39)
at javamodel.Gamemain.<init>(Gamemain.java:22)
at javamodel.Gamemain.main(Gamemain.java:15)
================================================================================================
Gamemain.java 主程式入口:
package javamodel;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Gamemain {
private static int scrWidth = 800;
private static int scrHeight = 600;
private static int scrBitdepth = 32;
private JFrame gameFrame;
private JPanel gamePanel;
public static void main(String[] args) {
new Gamemain();
}
public Gamemain(){
ScreenManager screen = new ScreenManager(scrWidth,scrHeight,scrBitdepth,"Java 3D 模型");
screen.setWindowMode();
gameFrame = screen.getFrame();
gamePanel = new LoadModelDemo(scrWidth,scrHeight);
gameFrame.add(gamePanel);
}
}
================================================================================================
LoadModelDemo.java
package javamodel;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import java.io.FileNotFoundException;
import javax.media.j3d.Background;
import javax.media.j3d.BoundingBox;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JPanel;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import com.sun.j3d.loaders.IncorrectFormatException;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.objectfile.ObjectFile;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.universe.ViewingPlatform;
public class LoadModelDemo extends JPanel {
private BranchGroup sceneBG;
private SimpleUniverse universe;
private BoundingSphere bounds;
private double boundRadius = 100;
public LoadModelDemo(int width, int height){
this.setLayout(new BorderLayout());
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas = new Canvas3D(config);
canvas.setSize(width, height);
this.add(canvas,BorderLayout.CENTER);
universe = new SimpleUniverse(canvas);
createSceneGroup();
initUserPosition();
orbitControls(canvas);
universe.addBranchGraph(sceneBG);
}
public void createSceneGroup(){
sceneBG = new BranchGroup();
bounds = new BoundingSphere(new Point3d(0,0,0),boundRadius);
addBackground();
TransformGroup[] objModel = new TransformGroup[4];
sceneBG.addChild(objModel[0] = loadModel("leet/Liit.obj",ObjectFile.RESIZE,new Vector3d(-5.4,0,0)));
sceneBG.addChild(objModel[1] = loadModel("leet/Liit.obj",ObjectFile.REVERSE,new Vector3d(-1.8,0,0)));
sceneBG.addChild(objModel[2] = loadModel("leet/Liit.obj",ObjectFile.TRIANGULATE,new Vector3d(1.8,0,0)));
sceneBG.addChild(objModel[3] = loadModel("leet/Liit.obj",ObjectFile.STRIPIFY,new Vector3d(5.4,0,0)));
sceneBG.addChild(new CheckerFloor().getBG());
//對sceneBG有關的物件進行編譯和快取,如果在編譯之后再次添加其他分支的話將拋出例外
sceneBG.compile();
}
public void addBackground(){
Background back = new Background();
back.setApplicationBounds(bounds);
back.setColor(0.17f, 0.62f, 0.92f);
sceneBG.addChild(back);
}
private void initUserPosition(){
//回傳當前虛擬世界的觀察平臺
ViewingPlatform vp = universe.getViewingPlatform();
//得到觀察平臺的坐標枝花點
TransformGroup steerTG = vp.getViewPlatformTransform();
Transform3D t3d = new Transform3D();
steerTG.getTransform(t3d);
//設定觀察點坐標在(0,5,20),看向坐標(0,0,0)處,指定Y軸向正數延伸方向為正方向
t3d.lookAt( new Point3d(0,5,20), new Point3d(0,0,0), new Vector3d(0,1,0));
t3d.invert();
steerTG.setTransform(t3d);
}
private void orbitControls(Canvas3D canvas){
OrbitBehavior orbit = new OrbitBehavior(canvas,OrbitBehavior.REVERSE_ALL);
orbit.setSchedulingBounds(bounds);
ViewingPlatform vp = universe.getViewingPlatform();
vp.setViewPlatformBehavior(orbit);
}
private TransformGroup loadModel(String filename,int flag,Vector3d translation){
Scene loadScene = this.loadFromFile(filename,flag);
Transform3D t3d = new Transform3D();
t3d = this.rotateModel();
t3d.setScale(this.calcScaleFactor(loadScene.getSceneGroup()));
t3d.setTranslation(translation);
TransformGroup tg = new TransformGroup(t3d);
tg.addChild(loadScene.getSceneGroup());
return tg;
}
private Scene loadFromFile(String filename,int flag){
Scene loadScene = null;
ObjectFile obj = new ObjectFile(flag);
try{
loadScene = obj.load(this.getClass().getClassLoader().getResource(filename));
}catch(FileNotFoundException e){
System.out.println("檔案未找到或檔案路徑不正確!");
e.printStackTrace();
}catch(IncorrectFormatException e){
System.out.println("檔案格式不正確!");
e.printStackTrace();
}catch(ParsingErrorException e){
System.out.println("裝載器決議檔案時出錯!");
e.printStackTrace();
}finally{
return loadScene;
}
}
//obj格式的檔案坐標空間是Z軸指向上方,Y軸指向螢屏。而Java3D的空間坐標是Y軸指向上方,Z軸指向螢屏。
//因此需要把匯入的外部模型作一個坐標轉換,即將X軸轉動90度
private Transform3D rotateModel(){
Transform3D t3d = new Transform3D();
t3d.rotX(-Math.PI/2);
return t3d;
}
private Vector3d calcScaleFactor(BranchGroup bg){
//根據枝節點得到一個立方位形的范圍空間
BoundingBox boundBox = new BoundingBox(bg.getBounds());
Point3d upper = new Point3d();
//范圍空間的XYZ軸在正方向的最大值載一個Point3d物件
boundBox.getUpper(upper);
//范圍空間的XYZ軸在負方向的最大值載一個Point3d物件
Point3d lower = new Point3d();
boundBox.getLower(lower);
double max = 0.0;
//物體的長寬高三個數值中找出最大的一個值
if((upper.getX() - lower.getX()) > max)
max = upper.getX() - lower.getX();
if((upper.getY() - lower.getY()) > max)
max = upper.getY() - lower.getY();
if((upper.getZ() - lower.getZ()) > max)
max = upper.getZ() - lower.getZ();
//計算比例因子,當值越接近0時,所顯示的物體越小,即當等于0時物體不可見
double scaleFactor = 5/max;
if(scaleFactor < 0.005)
scaleFactor = 0.005;
return new Vector3d(scaleFactor,scaleFactor * 2,scaleFactor);
}
}
==============================================================================================
package javamodel;
import java.util.ArrayList;
import javax.media.j3d.Appearance;
import javax.media.j3d.GeometryArray;
import javax.media.j3d.PolygonAttributes;
import javax.media.j3d.QuadArray;
import javax.media.j3d.Shape3D;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
public class ColouredTile extends Shape3D{
private ArrayList<Point3d> coord;
private Color3f color;
private QuadArray plane;
public ColouredTile(ArrayList<Point3d> coord, Color3f color){
this.coord = coord;
this.color = color;
plane = new QuadArray(coord.size(),GeometryArray.COORDINATES | GeometryArray.COLOR_3);
createGeometry();
}
public void createGeometry(){
int numPoints = coord.size();
Point3d[] points = new Point3d[numPoints];
coord.toArray(points);
plane.setCoordinates(0, points);
Color3f[] colors = new Color3f[numPoints];
for(int i = 0;i < numPoints; i++)
colors[i] = this.color;
plane.setColors(0, colors);
this.setGeometry(plane);
}
public void createAppearance(){
Appearance app = new Appearance();
PolygonAttributes pa = new PolygonAttributes();
pa.setCullFace(PolygonAttributes.CULL_NONE);
app.setPolygonAttributes(pa);
this.setAppearance(app);
}
}
還有幾個寫不下了
這是檔案下載地址:http://www.docin.com/p-235966846.html?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/75796.html
標籤:其它游戲引擎
