生成方块盒子的mesh,由底面的四个顶点和顶面的四个顶点组成,底面的Mesh是朝下的,所以底面的四个顶点以逆时针的形式排列,顶面的四个顶点还是以顺时针顺序排列。
1、取得顶点的数据汇合
protected override Vector3[] GetVertices() { var p0 = new Vector3(-_xSize * 0.5f, -_ySize * 0.5f, -_zSize * 0.5f) - _verticeOffset;//左下 var p1 = new Vector3(_xSize * 0.5f, -_ySize * 0.5f, -_zSize * 0.5f) - _verticeOffset;//右下 var p2 = new Vector3(_xSize * 0.5f, -_ySize * 0.5f, _zSize * 0.5f) - _verticeOffset;//右上 var p3 = new Vector3(-_xSize * 0.5f, -_ySize * 0.5f, _zSize * 0.5f) - _verticeOffset;//左上 var p4 = new Vector3(-_xSize * 0.5f, _ySize * 0.5f, -_zSize * 0.5f) - _verticeOffset;//左下 var p5 = new Vector3(-_xSize * 0.5f, _ySize * 0.5f, _zSize * 0.5f) - _verticeOffset;//左上 var p6 = new Vector3(_xSize * 0.5f, _ySize * 0.5f, _zSize * 0.5f) - _verticeOffset;//右上 var p7 = new Vector3(_xSize * 0.5f, _ySize * 0.5f, -_zSize * 0.5f) - _verticeOffset;//右下 return new Vector3[] { //下 p1,p2,p3,p0, //上 p4,p5,p6,p7, //左 p3,p5,p4,p0, //右 p1,p7,p6,p2, //前 p2,p6,p5,p3, //后 p0,p4,p7,p1 }; }
2、取得三角面顶点的索引
protected override int[] GetTriangles() { return new int[] { //下 0, 1, 2, 2, 3, 0, //上 0 + 4 * 1, 1 + 4 * 1, 2 + 4 * 1, 2 + 4 * 1, 3 + 4 * 1, 0 + 4 * 1, //左 0 + 4 * 2, 1 + 4 * 2, 2 + 4 * 2, 2 + 4 * 2, 3 + 4 * 2, 0 + 4 * 2, //右 0 + 4 * 3, 1 + 4 * 3, 2 + 4 * 3, 2 + 4 * 3, 3 + 4 * 3, 0 + 4 * 3, //前 0 + 4 * 4, 1 + 4 * 4, 2 + 4 * 4, 2 + 4 * 4, 3 + 4 * 4, 0 + 4 * 4, //后 0 + 4 * 5, 1 + 4 * 5, 2 + 4 * 5, 2 + 4 * 5, 3 + 4 * 5, 0 + 4 * 5, }; }
BoxShape整体代码如下
public class BoxShape : Shape { private static readonly string _boxMeshName = "Box Mesh";//mesh的名称 #region private members private float _xSize, _ySize, _zSize; #endregion #region ctor public BoxShape(float xSize, float ySize, float zSize, MeshPivot meshPivot) : base(meshPivot, _boxMeshName) { _xSize = xSize; _ySize = ySize; _zSize = zSize; _verticeOffset = GetVertexOffset(); } #endregion #region override functions /// <summary> /// 依据mesh中心点的地位,取得顶点地位的偏移量 /// </summary> /// <returns></returns> protected override Vector3 GetVertexOffset() { Vector3 offset; switch (_meshPivot) { case MeshPivot.CENTER: offset = Vector3.zero; break; case MeshPivot.TOP: offset = new Vector3(0, _ySize, 0) * 0.5f; break; case MeshPivot.BOTTOM: offset = new Vector3(0, -_ySize, 0) * 0.5f; break; case MeshPivot.LEFT: offset = new Vector3(-_xSize, 0, 0) * 0.5f; break; case MeshPivot.RIGHT: offset = new Vector3(_xSize, 0, 0) * 0.5f; break; case MeshPivot.FRONT: offset = new Vector3(0, 0, _zSize) * 0.5f; break; case MeshPivot.BACK: offset = new Vector3(0, 0, -_zSize) * 0.5f; break; default: offset = Vector3.zero; break; } return offset; } /// <summary> /// 取得顶点的数据汇合 /// </summary> /// <returns></returns> protected override Vector3[] GetVertices() { var p0 = new Vector3(-_xSize * 0.5f, -_ySize * 0.5f, -_zSize * 0.5f) - _verticeOffset;//左下 var p1 = new Vector3(_xSize * 0.5f, -_ySize * 0.5f, -_zSize * 0.5f) - _verticeOffset;//右下 var p2 = new Vector3(_xSize * 0.5f, -_ySize * 0.5f, _zSize * 0.5f) - _verticeOffset;//右上 var p3 = new Vector3(-_xSize * 0.5f, -_ySize * 0.5f, _zSize * 0.5f) - _verticeOffset;//左上 var p4 = new Vector3(-_xSize * 0.5f, _ySize * 0.5f, -_zSize * 0.5f) - _verticeOffset;//左下 var p5 = new Vector3(-_xSize * 0.5f, _ySize * 0.5f, _zSize * 0.5f) - _verticeOffset;//左上 var p6 = new Vector3(_xSize * 0.5f, _ySize * 0.5f, _zSize * 0.5f) - _verticeOffset;//右上 var p7 = new Vector3(_xSize * 0.5f, _ySize * 0.5f, -_zSize * 0.5f) - _verticeOffset;//右下 return new Vector3[] { //下 p1,p2,p3,p0, //上 p4,p5,p6,p7, //左 p3,p5,p4,p0, //右 p1,p7,p6,p2, //前 p2,p6,p5,p3, //后 p0,p4,p7,p1 }; } /// <summary> /// 取得法线方向的数据汇合 /// </summary> /// <returns></returns> protected override Vector3[] GetNormals() { return new Vector3[] { //下 Vector3.down,Vector3.down,Vector3.down,Vector3.down, //上 Vector3.up, Vector3.up, Vector3.up, Vector3.up, //左 Vector3.left,Vector3.left,Vector3.left,Vector3.left, //右 Vector3.right,Vector3.right,Vector3.right,Vector3.right, //前 Vector3.forward, Vector3.forward, Vector3.forward, Vector3.forward, //后 Vector3.back,Vector3.back,Vector3.back,Vector3.back, }; } /// <summary> /// 取得三角面顶点的索引 /// </summary> /// <returns></returns> protected override int[] GetTriangles() { return new int[] { //下 0, 1, 2, 2, 3, 0, //上 0 + 4 * 1, 1 + 4 * 1, 2 + 4 * 1, 2 + 4 * 1, 3 + 4 * 1, 0 + 4 * 1, //左 0 + 4 * 2, 1 + 4 * 2, 2 + 4 * 2, 2 + 4 * 2, 3 + 4 * 2, 0 + 4 * 2, //右 0 + 4 * 3, 1 + 4 * 3, 2 + 4 * 3, 2 + 4 * 3, 3 + 4 * 3, 0 + 4 * 3, //前 0 + 4 * 4, 1 + 4 * 4, 2 + 4 * 4, 2 + 4 * 4, 3 + 4 * 4, 0 + 4 * 4, //后 0 + 4 * 5, 1 + 4 * 5, 2 + 4 * 5, 2 + 4 * 5, 3 + 4 * 5, 0 + 4 * 5, }; } /// <summary> /// 取得UV坐标的数据汇合 /// </summary> /// <returns></returns> protected override Vector2[] GetUVs() { return new Vector2[] { new Vector2(0,0),new Vector2(0,1),new Vector2(1,1),new Vector2(1,0), new Vector2(0,0),new Vector2(0,1),new Vector2(1,1),new Vector2(1,0), new Vector2(0,0),new Vector2(0,1),new Vector2(1,1),new Vector2(1,0), new Vector2(0,0),new Vector2(0,1),new Vector2(1,1),new Vector2(1,0), new Vector2(0,0),new Vector2(0,1),new Vector2(1,1),new Vector2(1,0), new Vector2(0,0),new Vector2(0,1),new Vector2(1,1),new Vector2(1,0), }; } #endregion }