一个简单的Java 3D源代码.docx
《一个简单的Java 3D源代码.docx》由会员分享,可在线阅读,更多相关《一个简单的Java 3D源代码.docx(15页珍藏版)》请在冰豆网上搜索。
一个简单的Java3D源代码
一个简单的Java3D源代码收藏
这段源代码实现了在一个窗体中显示一个场景;以一个棋盘格做的地面,在地面上浮着一个蓝色的球体,在场景中有一个环境光和一个直射光,实现了用鼠标全角度的观察场景的功能。
从某种意义上来说这的确实现了一部3D游戏最原始的框架。
代码是照着《KillerGameProgramminginJava》一书中关于3D游戏制作的那部分写的,由于此书是英文版的据说在国内也买不到中文翻译版的,看得很费力,本人英文不好。
只能慢慢的研究书中的源代码。
下面说明下源代码的文件功能
GameMain.java-程序的入口。
ScreenManager.Java-实现一个很简单的窗体类从JFrame派生,目前只返回一个窗体,以后可能实现最复杂的功能。
WrapCheckers3D.Java-实现一个简单的3D场景类,能实现一个简单的鼠标操作。
CheckerFloor.Java-实现一个国际象棋般的棋盘格做来场景中的地面。
ColouredTile.Java-派生自Shape3D类,能实现一个正方体平面,用来为CheckerFloor类实现棋盘格
GameMain.Java
1.import java.awt.event.WindowAdapter;
2.import java.awt.event.WindowEvent;
3.
4.import javax.swing.JFrame;
5.import javax.swing.JOptionPane;
6.
7.
8.public class GameMain {
9. private static int scrWidth = 800;
10. private static int scrHeight = 600;
11. private static int scrBitdepth = 32;
12. private JFrame gameFrame;
13. private WrapCheckers3D wrap;
14.
15. public static void main(String[] args)
16. {
17. GameMain game = new GameMain();
18. }
19.
20. public GameMain()
21. {
22. ScreenManager screen = new ScreenManager(scrWidth,scrHeight,scrBitdepth,"Java 3D Test");
23. screen.setWindowMode();
24. gameFrame = screen.getFrame();
25. wrap = new WrapCheckers3D(scrWidth,scrHeight);
26. gameFrame.add(wrap);
27. }
28.
29.}
ScreenManager.Java
viewplaincopytoclipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
1.import java.awt.Dimension;
2.import java.awt.DisplayMode;
3.import java.awt.GraphicsDevice;
4.import java.awt.GraphicsEnvironment;
5.import java.awt.Insets;
6.import java.awt.Toolkit;
7.import java.awt.event.WindowAdapter;
8.import java.awt.event.WindowEvent;
9.
10.import javax.swing.JFrame;
11.import javax.swing.JOptionPane;
12.
13.
14.public class ScreenManager {
15.
16. private GraphicsDevice device;
17. private JFrame frame;
18. private String title;
19. private boolean isResizable;
20. private boolean isWindowMode;
21. private int scrWidth;
22. private int scrHeight;
23. private int scrBitdepth;
24.
25. public ScreenManager(int scrWidth,int scrHeight,int scrBitdepth,String title)
26. {
27. this.scrWidth = scrWidth;
28. this.scrHeight = scrHeight;
29. this.scrBitdepth = scrBitdepth;
30. this.title = title;
31. }
32.
33. public void setWindowMode()
34. {
35. frame = new JFrame();
36. frame.setResizable(false);//禁止窗体改变大小
37. frame.setPreferredSize(new Dimension(scrWidth,scrHeight));
38. frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//响应窗体的关闭事件,但不关闭窗体
39. frame.setVisible(true);
40.// 侦听窗体事件并捕获窗体关闭中的事件,在用户确认后退出程序
41. frame.addWindowListener(new WindowAdapter(){
42. public void windowClosing(WindowEvent e)
43. {
44. int res = JOptionPane.showConfirmDialog(null, "是否退出!
","退出",JOptionPane.YES_NO_OPTION);
45. if(res == JOptionPane.YES_OPTION)
46. closeFrame();
47. }
48. });
49. this.setFrametoCenter();
50. }
51.
52. public void setFullWindowMode()
53. {
54. if(frame !
= null)
55. {
56. device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
57. DisplayMode displayMode = device.getDisplayMode();
58. frame.setPreferredSize(new Dimension(displayMode.getWidth(),displayMode.getHeight()));
59. }
60. }
61.
62. public int getWidth()
63. {
64. return scrWidth;
65. }
66.
67. public int getHeight()
68. {
69. return scrHeight;
70. }
71.
72. public JFrame getFrame()
73. {
74. return frame;
75. }
76.
77.// 将窗体在显示屏幕内居中显示
78. public void setFrametoCenter()
79. {
80. if(device!
=null)
81. return;
82. Insets inset = frame.getInsets();
83. int scrx=0;
84. int scry=0;
85. Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
86. if(scrSize.width > scrWidth)
87. scrx = (scrSize.width-scrWidth)/2;
88. if(scrSize.height > scrHeight)
89. scry = (scrSize.height-scrHeight)/2;
90. frame.setBounds(scrx-inset.left, scry-inset.top, scrWidth+inset.right+inset.left, scrHeight+inset.bottom+inset.top);
91. }
92.
93.// 关闭窗体事件
94. public void closeFrame()
95. {
96. frame.dispose();
97. System.exit(0);
98. }
99.}
WrapCheckers3D.Java
viewplaincopytoclipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
1.import java.awt.BorderLayout;
2.import java.awt.Color;
3.import java.awt.GraphicsConfiguration;
4.
5.import javax.media.j3d.AmbientLight;
6.import javax.media.j3d.Appearance;
7.import javax.media.j3d.Background;
8.import javax.media.j3d.BoundingSphere;
9.import javax.media.j3d.BranchGroup;
10.import javax.media.j3d.Canvas3D;
11.import javax.media.j3d.DirectionalLight;
12.import javax.media.j3d.Material;
13.import javax.media.j3d.Transform3D;
14.import javax.media.j3d.TransformGroup;
15.import javax.swing.JPanel;
16.import javax.vecmath.Color3f;
17.import javax.vecmath.Point3d;
18.import javax.vecmath.Vector3d;
19.import javax.vecmath.Vector3f;
20.
21.import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
22.import com.sun.j3d.utils.geometry.Sphere;
23.import com.sun.j3d.utils.universe.SimpleUniverse;
24.import com.sun.j3d.utils.universe.ViewingPlatform;
25.
26.
27.public class WrapCheckers3D extends JPanel {
28.
29. private BranchGroup sceneBg;
30. private SimpleUniverse su;
31. private BoundingSphere bounds;
32. private static final float BOUNDSIZE=100.0f;
33.
34. public WrapCheckers3D(int width,int height)
35. {
36. this.setLayout(new BorderLayout());
37. GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
38. Canvas3D canvas = new Canvas3D(config);
39. this.add("Center",canvas);
40. canvas.setBounds(0, 0, width, height);
41.
42. su = new SimpleUniverse(canvas);
43. createSceneGroup();
44. initUserPosition();
45. orbitControls(canvas);
46. su.addBranchGraph(sceneBg);
47. }
48.
49. public void createSceneGroup()
50. {
51. sceneBg = new BranchGroup();
52. bounds = new BoundingSphere(new Point3d(0,0,0),BOUNDSIZE);
53. lightScene();
54. addBackground();
55. sceneBg.addChild(new CheckerFloor().getBG());
56. floatingSphere();
57. sceneBpile();
58. }
59.
60. private void lightScene()
61. {
62. Color3f white = new Color3f(1.0f,1.0f,1.0f);
63. AmbientLight ambientLightNode = new AmbientLight(white);
64. ambientLightNode.setInfluencingBounds(bounds);
65. sceneBg.addChild(ambientLightNode);
66.
67. Vector3f lightDirection = new Vector3f(-1.0f,-1.0f,-1.0f);
68. DirectionalLight light = new DirectionalLight(white,lightDirection);
69. light.setInfluencingBounds(bounds);
70. sceneBg.addChild(light);
71. }
72.
73. private void addBackground()
74. {
75. Background back = new Background();
76. back.setApplicationBounds(bounds);
77. back.setColor(0.17f, 0.62f, 0.92f);
78. sceneBg.addChild(back);
79. }
80.
81. private void floatingSphere()
82. {
83. Color3f black = new Color3f(0.0f,0.0f,0.0f);
84. Color3f blue = new Color3f(0.3f,0.3f,0.8f);
85. Color3f specular = new Color3f(0.9f,0.9f,0.9f);
86.
87. Material blueMat = new Material(blue,black,blue,specular,25.0f);
88. blueMat.setLightingEnable(true);
89.
90. Appearance blueApp = new Appearance();
91. blueApp.setMaterial(blueMat);
92.
93. Transform3D t3d = new Transform3D();
94. t3d.set(new Vector3f(0,4,0));
95. TransformGroup tg = new TransformGroup(t3d);
96. tg.addChild(new Sphere(2.0f,blueApp));
97. sceneBg.addChild(tg);
98. }
99.
100. private void initUserPosition()
101. {
102. ViewingPlatform vp = su.getViewingPlatform();
103. TransformGroup steerTG = vp.getViewPlatformTransform();
104.
105. Transform3D t3d = new Transform3D();
106. steerTG.getTransform(t3d);
107.
108. t3d.lookAt(new Point3d(0,5,20), new Point3d(0,0,0), new Vector3d(0,1,0));
109. t3d.invert();
110.
111. steerTG.setTransform(t3d);
112.
113. }
114.
115. private void orbitControls(Canvas3D canvas)
116. {
117. OrbitBehavior orbit = new OrbitBehavior(canvas, OrbitBehavior.REVERSE_ALL);
118. orbit.setSchedulingBounds(bounds);
119. ViewingPlatform vp = su.getViewingPlatform( );
120