您当前的位置: 首页 > 

CloudHu1989

暂无认证

  • 4浏览

    0关注

    89博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

用ECS做HexMap:利用RenderMesh绘制六边形

CloudHu1989 发布时间:2019-08-22 20:24:58 ,浏览量:4

基于Unity2019最新ECS架构开发MMO游戏笔记17
  • 从点到面画六边形
    • 一点小优化
  • 更新计划
    • 作者的话
  • ECS系列目录
    • ECS官方示例1:ForEach
    • ECS官方案例2:IJobForEach
    • ECS官方案例3:IJobChunk
    • ECS官方案例4:SubScene
    • ECS官方案例5:SpawnFromMonoBehaviour
    • ECS官方案例6:SpawnFromEntity
    • ECS官方案例7:SpawnAndRemove
    • ECS进阶:FixedTimestepWorkaround
    • ECS进阶:Boids
    • ECS进阶:场景切换器
    • ECS进阶:MegaCity0
    • ECS进阶:MegaCity1
    • UnityMMO资源整合&服务器部署
    • UnityMMO选人流程
    • UnityMMO主世界
    • UnityMMO网络同步
    • 用ECS做HexMap:自动生成地图系统
    • 用ECS做HexMap:利用RenderMesh绘制六边形
    • 用ECS做HexMap:利用RenderMesh为六边形涂色
    • 用ECS做HexMap:六边形单元的颜色混合
    • 用ECS做HexMap:重构地图系统
    • 用ECS做HexMap:鼠标点击六边形单元涂色

从点到面画六边形

上一篇中我们已经成功生成了地图矩阵,可是却不是基于六边形单元的,因为我们还没有开始绘制六边形单元。 如下图所示,画好的六边形单元是这样的: 在这里插入图片描述 如何画一个六边形呢? 首先要对图形学基础有一定的认识,Unity引擎当中渲染出来的图形都是由网格(Mesh)构成的,而网格又是由无数的顶点(Vertex)连接而成。其中每三个顶点又构成了一个基本单位:三角(Triangle),仔细看看网格的图片就会发现: 在这里插入图片描述在这里插入图片描述

复杂的外观下面是简单的图形学。

就如图中的正方体(Cube),一共六个面,每个面有两个三角,每个三角有三个顶点,拆解开了,就好绘制了(当然,还有法线/材质/贴图等等,这里暂时忽略。我们先做减法,后面再做加法)。 首先我们要计算三个顶点出来,这样我们就可以画出三角形了。

    /// 
    /// 把所有六边形单元中心点作为所有顶点的起始点
    /// 
    [BurstCompile]
    private struct CopyHexCellCenterPositionsToVerticesJob : IJobForEachWithEntity {
        public NativeArray Vertices;
        public void Execute(Entity entity, int index, [ReadOnly]ref Translation position)
        {
            var center = position.Value;

            Vertices[index] = new Vector3
            {
                x = center.x,
                y = center.y,
                z = center.z
            };
        }
    }
  1. 获取到上一篇中创建的HexCell,并得到其坐标作为三角的一个顶点,这个顶点放到六边形中正好是六边形的正中心; 在这里插入图片描述
  2. 如上图所示,中心那朵菊花就是六边形的圆心顶点,由这个顶点推算出另外两个顶点的坐标;
//HexMetrics.corners是上一篇中定义的六边形的个六个角
Vector3 顶点2=(center + HexMetrics.corners[0])
Vector3 顶点3=(center + HexMetrics.corners[1])
  1. 把数据交给网格组件进行渲染,三角就绘制出来了。
		//顶点和三角
     renderMesh.mesh.vertices = Vertices.ToArray();
     renderMesh.mesh.triangles = Triangles.ToArray();
     //重新计算法线
     renderMesh.mesh.RecalculateNormals();

在这里插入图片描述 如上图所示,三角就顺利画出来了,接下来把刚刚的算法循环六次,六个这样的三角就组成了六边形:

      Vector3 center = vertices[i];
      for (int j = 0; j             
关注
打赏
1664096582
查看更多评论
0.1497s