1、一个简单的Java 3D源代码一个简单的Java 3D源代码 收藏 这段源代码实现了在一个窗体中显示一个场景;以一个棋盘格做的地面,在地面上浮着一个蓝色的球体,在场景中有一个环境光和一个直射光,实现了用鼠标全角度的观察场景的功能。从某种意义上来说这的确实现了一部3D游戏最原始的框架。代码是照着Killer Game Programming in Java一书中关于3D游戏制作的那部分写的,由于此书是英文版的据说在国内也买不到中文翻译版的,看得很费力,本人英文不好。只能慢慢的研究书中的源代码。下面说明下源代码的文件功能GameMain.java - 程序的入口。ScreenManager.Jav
2、a - 实现一个很简单的窗体类从JFrame派生,目前只返回一个窗体,以后可能实现最复杂的功能。WrapCheckers3D.Java - 实现一个简单的3D场景类,能实现一个简单的鼠标操作。CheckerFloor.Java - 实现一个国际象棋般的棋盘格做来场景中的地面。ColouredTile.Java - 派生自Shape3D类,能实现一个正方体平面,用来为CheckerFloor类实现棋盘格GameMain.Java1.importjava.awt.event.WindowAdapter; 2.importjava.awt.event.WindowEvent; 3.4.importj
3、avax.swing.JFrame; 5.importjavax.swing.JOptionPane; 6.7.8.publicclassGameMain 9.privatestaticintscrWidth=800; 10.privatestaticintscrHeight=600; 11.privatestaticintscrBitdepth=32; 12.privateJFramegameFrame; 13.privateWrapCheckers3Dwrap; 14. 15.publicstaticvoidmain(Stringargs) 16. 17.GameMaingame=newG
4、ameMain(); 18. 19. 20.publicGameMain() 21. 22.ScreenManagerscreen=newScreenManager(scrWidth,scrHeight,scrBitdepth,Java3DTest); 23.screen.setWindowMode(); 24.gameFrame=screen.getFrame(); 25.wrap=newWrapCheckers3D(scrWidth,scrHeight); 26.gameFrame.add(wrap); 27. 28. 29.ScreenManager.Javaview plaincopy
5、 to clipboardprint?1020304050607080901001101201301401501.importjava.awt.Dimension; 2.importjava.awt.DisplayMode; 3.importjava.awt.GraphicsDevice; 4.importjava.awt.GraphicsEnvironment; 5.importjava.awt.Insets; 6.importjava.awt.Toolkit; 7.importjava.awt.event.WindowAdapter; 8.importjava.awt.event.Wind
6、owEvent; 9.10.importjavax.swing.JFrame; 11.importjavax.swing.JOptionPane; 12.13.14.publicclassScreenManager 15.16.privateGraphicsDevicedevice; 17.privateJFrameframe; 18.privateStringtitle; 19.privatebooleanisResizable; 20.privatebooleanisWindowMode; 21.privateintscrWidth; 22.privateintscrHeight; 23.
7、privateintscrBitdepth; 24. 25.publicScreenManager(intscrWidth,intscrHeight,intscrBitdepth,Stringtitle) 26. 27.this.scrWidth=scrWidth; 28.this.scrHeight=scrHeight; 29.this.scrBitdepth=scrBitdepth; 30.this.title=title; 31. 32. 33.publicvoidsetWindowMode() 34. 35.frame=newJFrame(); 36.frame.setResizabl
8、e(false);/禁止窗体改变大小 37.frame.setPreferredSize(newDimension(scrWidth,scrHeight); 38.frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);/响应窗体的关闭事件,但不关闭窗体 39.frame.setVisible(true); 40./侦听窗体事件并捕获窗体关闭中的事件,在用户确认后退出程序 41.frame.addWindowListener(newWindowAdapter() 42.publicvoidwindowClosing(WindowEv
9、ente) 43. 44.intres=JOptionPane.showConfirmDialog(null,是否退出!,退出,JOptionPane.YES_NO_OPTION); 45.if(res=JOptionPane.YES_OPTION) 46.closeFrame(); 47. 48.); 49.this.setFrametoCenter(); 50. 51. 52.publicvoidsetFullWindowMode() 53. 54.if(frame!=null) 55. 56.device=GraphicsEnvironment.getLocalGraphicsEnvir
10、onment().getDefaultScreenDevice(); 57.DisplayModedisplayMode=device.getDisplayMode(); 58.frame.setPreferredSize(newDimension(displayMode.getWidth(),displayMode.getHeight(); 59. 60. 61. 62.publicintgetWidth() 63. 64.returnscrWidth; 65. 66. 67.publicintgetHeight() 68. 69.returnscrHeight; 70. 71. 72.pu
11、blicJFramegetFrame() 73. 74.returnframe; 75. 76. 77./将窗体在显示屏幕内居中显示 78.publicvoidsetFrametoCenter() 79. 80.if(device!=null) 81.return; 82.Insetsinset=frame.getInsets(); 83.intscrx=0; 84.intscry=0; 85.DimensionscrSize=Toolkit.getDefaultToolkit().getScreenSize(); 86.if(scrSize.widthscrWidth) 87.scrx=(s
12、crSize.width-scrWidth)/2; 88.if(scrSize.heightscrHeight) 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.publicvoidcloseFrame() 95. 96.frame.dispose(); 97.System.exit(0);
13、98. 99.WrapCheckers3D.Javaview plaincopy to clipboardprint?1020304050607080901001101201301401501.importjava.awt.BorderLayout; 2.importjava.awt.Color; 3.importjava.awt.GraphicsConfiguration; 4.5.importjavax.media.j3d.AmbientLight; 6.importjavax.media.j3d.Appearance; 7.importjavax.media.j3d.Background
14、; 8.importjavax.media.j3d.BoundingSphere; 9.importjavax.media.j3d.BranchGroup; 10.importjavax.media.j3d.Canvas3D; 11.importjavax.media.j3d.DirectionalLight; 12.importjavax.media.j3d.Material; 13.importjavax.media.j3d.Transform3D; 14.importjavax.media.j3d.TransformGroup; 15.importjavax.swing.JPanel;
15、16.importjavax.vecmath.Color3f; 17.importjavax.vecmath.Point3d; 18.importjavax.vecmath.Vector3d; 19.importjavax.vecmath.Vector3f; 20.21.importcom.sun.j3d.utils.behaviors.vp.OrbitBehavior; 22.importcom.sun.j3d.utils.geometry.Sphere; 23.importcom.sun.j3d.utils.universe.SimpleUniverse; 24.importcom.sun
16、.j3d.utils.universe.ViewingPlatform; 25.26.27.publicclassWrapCheckers3DextendsJPanel 28.29.privateBranchGroupsceneBg; 30.privateSimpleUniversesu; 31.privateBoundingSpherebounds; 32.privatestaticfinalfloatBOUNDSIZE=100.0f; 33. 34.publicWrapCheckers3D(intwidth,intheight) 35. 36.this.setLayout(newBorde
17、rLayout(); 37.GraphicsConfigurationconfig=SimpleUniverse.getPreferredConfiguration(); 38.Canvas3Dcanvas=newCanvas3D(config); 39.this.add(Center,canvas); 40.canvas.setBounds(0,0,width,height); 41. 42.su=newSimpleUniverse(canvas); 43.createSceneGroup(); 44.initUserPosition(); 45.orbitControls(canvas);
18、 46.su.addBranchGraph(sceneBg); 47. 48. 49.publicvoidcreateSceneGroup() 50. 51.sceneBg=newBranchGroup(); 52.bounds=newBoundingSphere(newPoint3d(0,0,0),BOUNDSIZE); 53.lightScene(); 54.addBackground(); 55.sceneBg.addChild(newCheckerFloor().getBG(); 56.floatingSphere(); 57.sceneBpile(); 58. 59. 60.priv
19、atevoidlightScene() 61. 62.Color3fwhite=newColor3f(1.0f,1.0f,1.0f); 63.AmbientLightambientLightNode=newAmbientLight(white); 64.ambientLightNode.setInfluencingBounds(bounds); 65.sceneBg.addChild(ambientLightNode); 66. 67.Vector3flightDirection=newVector3f(-1.0f,-1.0f,-1.0f); 68.DirectionalLightlight=
20、newDirectionalLight(white,lightDirection); 69.light.setInfluencingBounds(bounds); 70.sceneBg.addChild(light); 71. 72. 73.privatevoidaddBackground() 74. 75.Backgroundback=newBackground(); 76.back.setApplicationBounds(bounds); 77.back.setColor(0.17f,0.62f,0.92f); 78.sceneBg.addChild(back); 79. 80. 81.
21、privatevoidfloatingSphere() 82. 83.Color3fblack=newColor3f(0.0f,0.0f,0.0f); 84.Color3fblue=newColor3f(0.3f,0.3f,0.8f); 85.Color3fspecular=newColor3f(0.9f,0.9f,0.9f); 86. 87.MaterialblueMat=newMaterial(blue,black,blue,specular,25.0f); 88.blueMat.setLightingEnable(true); 89. 90.AppearanceblueApp=newAp
22、pearance(); 91.blueApp.setMaterial(blueMat); 92. 93.Transform3Dt3d=newTransform3D(); 94.t3d.set(newVector3f(0,4,0); 95.TransformGrouptg=newTransformGroup(t3d); 96.tg.addChild(newSphere(2.0f,blueApp); 97.sceneBg.addChild(tg); 98. 99. 100.privatevoidinitUserPosition() 101. 102.ViewingPlatformvp=su.get
23、ViewingPlatform(); 103.TransformGroupsteerTG=vp.getViewPlatformTransform(); 104. 105.Transform3Dt3d=newTransform3D(); 106.steerTG.getTransform(t3d); 107. 108.t3d.lookAt(newPoint3d(0,5,20),newPoint3d(0,0,0),newVector3d(0,1,0); 109.t3d.invert(); 110. 111.steerTG.setTransform(t3d); 112. 113. 114. 115.privatevoidorbitControls(Canvas3Dcanvas) 116. 117.OrbitBehaviororbit=newOrbitBehavior(canvas,OrbitBehavior.REVERSE_ALL); 118.orbit.setSchedulingBounds(bounds); 119.ViewingPlatformvp=su.getViewingPlatform(); 120
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1