象棋3D.doc_第1页
象棋3D.doc_第2页
象棋3D.doc_第3页
象棋3D.doc_第4页
象棋3D.doc_第5页
免费预览已结束,剩余12页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中国象棋3D(1) 配置Java3D环境 本次实验我们组打算使用的编程语言是Java,但是Eclipse自带的函数库里不含Java3D所需的配置信息,所以需要我们自己配置3D环境,下面是我们组的添加方法。首先下载配置文件,包括j3dcore.jar,j3dutils.jar,vecmath.jar以及j3dcore-ogl-cg.dll,j3dcore-ogl-chk.dll,j3dcore-ogl.dll,j3dcore-d3d.dll然后将配置文件复制到Eclipse安装目录下的JDK/JRE/bin和DK/JRE/lib里当运行Java程序的时候按下面步骤添加jars文件1.点击工程鼠标右键-build path-configure build path2.add external jars3.选择相应的jar点击OK然后运行程序 (2) 代码编写在编写代码部分,我们组遇到了许多问题,因为是从未接触过的知识,所以在编程过程中经常报错,为了在规定时间内完成任务,我们组就现学现用,在网上下载相关的代码,结合Java_API手册一遍又一遍的反复读,手册上没有的类就上网查,遇到英文就用翻译软件翻译了来看,最后再一步又一步的解决编程过程中的一个个error首先介绍一点必备的Java3D相关知识Java3D的场景图结构:Java3D实际上是Java语言在三维图形领域的扩展,与Java一样,Java3D有纯粹的面向对象结构。Java3D的数据结构采用的是SceneGraphsStructure(场景图),就是一些具有方向性的不对称图形组成的树状结构(图1)。我们在一个Java3D应用程序看到的逼真三维场景从程序的角度看来,实际就是由Java3D定义的一系列的对象,这些对象不是杂乱无序,对象之间也不是毫无关系。如果想让三维图像正常显示,必须在这两点上遵循Java3D场景图的规定。观察图1,Java3D场景图的树结构由各种各样的对象组成:在图中出现的这些对象都实现了Java3D中有重要的意义的类,从逻辑上我们将它们分为三类:根节点(Root):VirtualUniverseObject节点(Node):LocalObject、BranchGroupNodes、BehaviorNode、Shape3DNode叶子节点(Leaf):Appearance、Geomery.图1:在应用中的Java3D场景图场景图中线和线的交汇点称为节点(Node),这些节点都是Java3D类的实例(InstanceofClass),节点之间的线表示各个实例之间的关系。VirtualUniverse是根节点,每一个场景图的VirtualUniverse是唯一的。在VirtualUniverse下面是Locale节点,每个程序可以有一个或多个Locale,但同时只能有一个Locale处于显示状态,就好象一个三维世界非常大,有很多个景点,但我们同时只能在一个景点进行观察。Java3D允许从一个Locale跳到另一个Locale,不过绝大多数程序只有一个Locale。每一个Locale可以拥有多个BranchGroup节点。所有三维形体的其位置信息(TransformGroupNodes)都建立在BranchGroup节点之上。TransformGroupNode用来设定Shape3D在VirtualUniverse中的位置。Spape3DNode是三维图形节点,这个节点的实体放映在最后的显示画面中,就是三维世界中的每个形体。包括正方体、球体以及任何形状和外观的三维形体。位于场景图最下层的是两个叶子节点:三维体的外观(Appearance)和几何信息(Geometry),这两个节点定义了一个三维体的显示效果。ViewPlatform位于图1的另一个分枝上,与前面所有描述三维体的性质的概念不同,ViewPlatform和View都是用来定义观察者的信息。上面所列的概念很多,但是对于建立一个简单的Java3D程序,我们至少需要了解三个概念:虚拟宇宙(VirtualUniverse)、场景(Locale)、坐标系统。下面是一些相关代码的具体实现:1.制作象棋程序的窗体private ChessFram() setpanel = new SetPanel();canvasfactroy = new CanvasFactroy(SimpleUniverse.getPreferredConfiguration();this.setSize(660, 600);this.setResizable(false);this.setLocationRelativeTo(null);this.setTitle(中国象棋3D);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.add(canvasfactroy.getCanvas3D(), BorderLayout.CENTER);this.add(setpanel, BorderLayout.EAST);比较简单,就不介绍了2.构建棋板public CanvasFactroy(GraphicsConfiguration config) canvas3d = new Canvas3D(config);bounding = new BoundingSphere(new Point3d(0, 0, 0), 1000);startabs = new AbsChess(炮, new Point(2, 3), Color.red);/开始节点信息endabs = new AbsChess( , new Point(3, 3), Color.red);/结束节点信息SimpleUniverse universe = new SimpleUniverse(canvas3d);/创造一个虚拟场景BranchGroup branchgroup = new BranchGroup();/创建一个组群transgroup = new TransformGroup();/定义摆放位置transgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);transgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);transgroup.addChild(createBgAndLight();/添加背景色和光线transgroup.addChild(createChessboard();/添加棋板transgroup.addChild(createStartInfo();/添加开始信息transgroup.addChild(createEndInfo();/添加结束信息ArrayListChessPiece arr = new ArrayListChessPiece();/添加棋子for (AbsChess a : ChessConfig.ChessPieces) ChessPiece cp = new ChessPiece(a.getChessName(), a.getChessPoint(),a.getChessColor();arr.add(cp);transgroup.addChild(cp.getPieceGroup();pieceaction = new PieceAction(arr, startabs, endabs);branchgroup.addChild(transgroup);/将对象添加到组群里OrbitBehavior orbit = new OrbitBehavior(canvas3d,/定义对象能否通过鼠标选择OrbitBehavior.REVERSE_ALL | OrbitBehavior.STOP_ZOOM);orbit.setSchedulingBounds(bounding);ViewingPlatform viewingPlatform =universe.getViewingPlatform();/添加人物视角viewingPlatform.setNominalViewingTransform();viewingPlatform.setViewPlatformBehavior(orbit);universe.addBranchGraph(branchgroup);canvas3d.addMouseListener(this);canvas3d.addMouseMotionListener(this);3. 构造棋子public class AbsChess /定义一个棋子的数据结构,包括棋子名字,坐标,颜色public AbsChess(char chessName, Point chessPoint, Color chessColor) super();ChessName = chessName;ChessPoint = chessPoint;ChessColor = chessColor;public char getChessName() return ChessName;public void setChessName(char chessName) ChessName = chessName;public Point getChessPoint() return ChessPoint;public void setChessPoint(Point chessPoint) ChessPoint = chessPoint;public Color getChessColor() return ChessColor;public void setChessColor(Color chessColor) ChessColor = chessColor;private char ChessName;private Point ChessPoint;private Color ChessColor;4. 构造3D棋子public class ChessPiece extends AbsChess /类的继承public ChessPiece(char chessName, Point chessPoint, Color chessColor) super(chessName, chessPoint, chessColor);piecegroup = new TransformGroup();piecegroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);piecegroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);Vector3f vec = ChessConfig.getLocalByPoint(this,ChessConfig.PieceBoardSize.z);TransformGroup cyligroup = new TransformGroup();/定义放置位置Transform3D cyliform1 = new Transform3D();cyliform1.rotX(Math.toRadians(-90);/cyliform1绕X轴旋转90度Transform3D cyliform2 = new Transform3D();cyliform2.setTranslation(vec);cyliform2.mul(cyliform1);cyligroup.setTransform(cyliform2);Cylinder cyli = new Cylinder(ChessConfig.PieceSize_R,/定义一个圆柱体ChessConfig.PieceSize_H, CanvasFactroy.getAppearance(new Color(182, 106, 82);cyligroup.addChild(cyli);piecegroup.addChild(cyligroup);float float1 = 0;TransformGroup textgroup = new TransformGroup();Transform3D textform1 = new Transform3D();if (getChessColor().equals(Color.white) float1 = 0.03f;textform1.rotZ(Math.toRadians(180);/绕Z轴旋转180度 else float1 = -0.03f;Transform3D textform2 = new Transform3D();textform2.set(0.09f);textform2.mul(textform1);Transform3D textform3 = new Transform3D();textform3.setTranslation(new Vector3f(vec.x, vec.y + float1,vec.z + 0.01f);textform3.mul(textform2);textgroup.setTransform(textform3);Text3D text = new Text3D(new Font3D(new Font(楷体, Font.PLAIN, 1),/定义一个3D的文本new FontExtrusion(), getChessName() + );text.setAlignment(Text3D.ALIGN_CENTER);Appearance app = CanvasFactroy.getAppearance(getChessColor();/定义形体外观Material mat = app.getMaterial();mat.setEmissiveColor(new Color3f(getChessColor();mat.setShininess(70f);app.setMaterial(mat);Shape3D shape = new Shape3D(text, app);/添加形体属性textgroup.addChild(shape);piecegroup.addChild(textgroup);public TransformGroup getPieceGroup() return piecegroup;private TransformGroup piecegroup;5. 配置棋子public class ChessConfig public static final Vector3f ChessboardSize = new Vector3f(0.75f, 0.95f,0.02f);public static final float PieceSize_R = 0.07f;public static final float PieceSize_H = 0.04f;public static final float Chessboard_X = 0.6f;public static final float Chessboard_Y = 0.77f;public static final Vector3f PieceBoardSize = new Vector3f(0.15f, 0.171f,0.05f);/定义一个数组类型来存放棋子信息public static final ArrayListAbsChess ChessPieces = new ArrayListAbsChess();static ChessPieces.add(new AbsChess(俥, new Point(1, 1), Color.red);ChessPieces.add(new AbsChess(馬, new Point(2, 1), Color.red);ChessPieces.add(new AbsChess(相, new Point(3, 1), Color.red);ChessPieces.add(new AbsChess(仕, new Point(4, 1), Color.red);ChessPieces.add(new AbsChess(帥, new Point(5, 1), Color.red);ChessPieces.add(new AbsChess(仕, new Point(6, 1), Color.red);ChessPieces.add(new AbsChess(相, new Point(7, 1), Color.red);ChessPieces.add(new AbsChess(馬, new Point(8, 1), Color.red);ChessPieces.add(new AbsChess(俥, new Point(9, 1), Color.red);ChessPieces.add(new AbsChess(炮, new Point(2, 3), Color.red);ChessPieces.add(new AbsChess(炮, new Point(8, 3), Color.red);ChessPieces.add(new AbsChess(兵, new Point(1, 4), Color.red);ChessPieces.add(new AbsChess(兵, new Point(3, 4), Color.red);ChessPieces.add(new AbsChess(兵, new Point(5, 4), Color.red);ChessPieces.add(new AbsChess(兵, new Point(7, 4), Color.red);ChessPieces.add(new AbsChess(兵, new Point(9, 4), Color.red);ChessPieces.add(new AbsChess(車, new Point(1, 1), Color.white);ChessPieces.add(new AbsChess(马, new Point(2, 1), Color.white);ChessPieces.add(new AbsChess(象, new Point(3, 1), Color.white);ChessPieces.add(new AbsChess(士, new Point(4, 1), Color.white);ChessPieces.add(new AbsChess(将, new Point(5, 1), Color.white);ChessPieces.add(new AbsChess(士, new Point(6, 1), Color.white);ChessPieces.add(new AbsChess(象, new Point(7, 1), Color.white);ChessPieces.add(new AbsChess(马, new Point(8, 1), Color.white);ChessPieces.add(new AbsChess(車, new Point(9, 1), Color.white);ChessPieces.add(new AbsChess(砲, new Point(2, 3), Color.white);ChessPieces.add(new AbsChess(砲, new Point(8, 3), Color.white);ChessPieces.add(new AbsChess(卒, new Point(1, 4), Color.white);ChessPieces.add(new AbsChess(卒, new Point(3, 4), Color.white);ChessPieces.add(new AbsChess(卒, new Point(5, 4), Color.white);ChessPieces.add(new AbsChess(卒, new Point(7, 4), Color.white);ChessPieces.add(new AbsChess(卒, new Point(9, 4), Color.white);/根据棋子信息将棋子正确的分布在棋盘上,红色棋子在下,白色棋子在上public static Vector3f getLocalByPoint(AbsChess abs, float heiht) Vector3f vec = null;if (abs.getChessColor().equals(Color.red) vec = new Vector3f(float) (Chessboard_X - (abs.getChessPoint().x - 1)* PieceBoardSize.x), (float) (-Chessboard_Y - (-abs.getChessPoint().y + 1)* PieceBoardSize.y), heiht); else if (abs.getChessColor().equals(Color.white) vec = new Vector3f(float) (Chessboard_X - (abs.getChessPoint().x - 1)* PieceBoardSize.x), (float) (Chessboard_Y - (abs.getChessPoint().y - 1)* PieceBoardSize.y), heiht);return vec;6. 定义棋子规则public class PieceAction public PieceAction(ArrayListChessPiece Array, AbsChess startabs,AbsChess endabs) this.ChessPieceArray = Array;/棋子信息this.startabs = startabs;/开始信息this.endabs = endabs;/结束信息public Vector3f onMouseStart(Point3d Point3) /返回开始信息的鼠标位置Vector3f startvec = null;Point p1 = getPointByP3(Point3);for (final ChessPiece c : ChessPieceArray) if (c.getChessPoint().equals(p1) c.getChessColor().equals(startabs.getChessColor() startabs.setChessPoint(p1);startabs.setChessName(c.getChessName();startabs.setChessColor(c.getChessColor();startvec = new Vector3f(float) (ChessConfig.Chessboard_X - (p1.x - 1)* ChessConfig.PieceBoardSize.x),(float) (-ChessConfig.Chessboard_Y + (p1.y - 1)* ChessConfig.PieceBoardSize.y), 0.2f);break;return startvec;public Vector3f onMouseEnd(Point3d Point3) /返回鼠标点击结束的坐标位置Vector3f startvec = null;Point p1 = getPointByP3(Point3);endabs.setChessPoint(p1);AbsChess abs = getAbsChessByPoint(p1);if (abs = null) endabs.setChessName( );endabs.setChessColor(Color.green); else endabs.setChessName(abs.getChessName();endabs.setChessColor(abs.getChessColor();if (startabs.getChessColor().equals(endabs.getChessColor()| !checkCandoEnd() return null;startvec = new Vector3f(float) (ChessConfig.Chessboard_X - (p1.x - 1)* ChessConfig.PieceBoardSize.x),(float) (-ChessConfig.Chessboard_Y + (p1.y - 1)* ChessConfig.PieceBoardSize.y), 0.1f);return startvec;/定义各个棋子的行动规则private boolean checkCandoEnd() switch (startabs.getChessName() case 俥:return ju();case 馬:return ma();case 相:return xiang();case 仕:return shi();case 帥:return jiang();case 炮:return pao();case 兵:return bing();case 車:return ju();case 马:return ma();case 象:return xiang();case 士:return shi();case 将:return jiang();case 砲:return pao();case 卒:return bing();default:System.out.println(ERROR!);break;return false;private boolean bing() /兵只能向前走一步if (startabs.getChessPoint().y 5) if (endabs.getChessPoint().y = startabs.getChessPoint().y Math.abs(endabs.getChessPoint().x- startabs.getChessPoint().x) 2) else if (endabs.getChessPoint().x = startabs.getChessPoint().x) if (endabs.getChessPoint().y = startabs.getChessPoint().y + 1) return true;return false;private boolean pao() /炮只能直线移动或者各一个棋子却带对方棋子的位置if (startabs.getChessPoint().x = endabs.getChessPoint().x) int cont = getStartColEnd(startabs.getChessPoint().y, endabs.getChessPoint().y, startabs.getChessPoint().x);if (cont 3 cont != 1) return true; else if (startabs.getChessPoint().y = endabs.getChessPoint().y) int cont = getStartRowEnd(startabs.getChessPoint().x, endabs.getChessPoint().x, startabs.getChessPoint().y);if (cont 3 cont != 1) return true;return false;private boolean ju() /車只能直线走棋并且取代直线上离自己最近的棋子if (startabs.getChessPoint().x = endabs.getChessPoint().x) int cont = getStartColEnd(startabs.getChessPoint().y, endabs.getChessPoint().y, startabs.getChessPoint().x);if (cont = 0) return true; else if (startabs.getChessPoint().y = endabs.getChessPoint().y) int cont = getStartRowEnd(startabs.getChessPoint().x, endabs.getChessPoint().x, startabs.getChessPoint().y);if (cont = 0) return true;return false;private boolean ma() /马只能走日字if (Math.abs(endabs.getChessPoint().x - startabs.getChessPoint().x) = 1) if (endabs.getChessPoint().y - startabs.getChessPoint().y = 2) if (getAbsChessByPoint(new Point(startabs.getChessPoint().x,startabs.getChessPoint().y + 1) = null) return true; else if (endabs.getChessPoint().y - startabs.getChessPoint().y = -2) if (getAbsChessByPoint(new Point(startabs.getChessPoint().x,startabs.getChessPoint().y - 1) = null) return true; else if (Math.abs(endabs.getChessPoint().x- startabs.getChessPoint().x) = 2) if (endabs.getChessPoint().y - startabs.getChessPoint().y = 1) if (getAbsChessByPoint(new Point(startabs.getChessPoint().x + 1, startabs.getChessPoint().y) = null) return true; else if (endabs.getChessPoint().y - startabs.getChessPoint().y = -1) if (getAbsChessByPoint(new Point(startabs.getChessPoint().x - 1, startabs.getChessPoint().y) = null) return true;return false;private boolean xiang() /象走田if (endabs.getChessPoint().x - startabs.getChessPoint().x = 2) if (endabs.getChessPoint().y - startabs.getChessPoint().y = 2) if (getAbsChessByPoint(new Point(startabs.getChessPoint().x + 1, startabs.getChessPoint().y + 1) = null) return true; else if (endabs.getChessPoint().y - startabs.getChessPoint().y = -2) if (getAbsChessByPoint(new Point(startabs.getChessPoint().x + 1, startabs.getChessPoint().y - 1) = null) return true; else if (endabs.getChessPoint().x - startabs.getChessPoint().x = -2) if (endabs.getChessPoint().y - startabs.getChessPoint().y = 2) if (getAbsChessByPoint(new Point(startabs.getChessPoint().x - 1, startabs.getChessPoint().y + 1) = null) return true; else if (endabs.getChessPoint().y - startabs.getChessPoint().y = -2) if (getAbsChessByPoint(new Point(startabs.getChessPoint().x - 1, startabs.getChessPoint().y - 1) = null) return true;return false;private boolean shi() 士只能走斜角if (!(endabs.getChessPoint().x = 4 endabs.getChessPoint().x = 6 endabs.getChessPoint().y = 3) return false;if (Math.abs(endabs.getChessPoint().x - startabs.getChessPoint().x) = 1) if (Math.abs(endabs.getChessPoint().y - startabs.getChessPoint().y) = 1) return true;return false;private boolean jiang() /将只能直线走一步if (!(endabs.getChessPoint().x = 4 endabs.getChessPoint().x = 6 endabs.getChessPoint().y = 3) return false;if (Math.abs(endabs.getChessPoint().x - startabs.getChessPoint().x)+

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论