碰撞检测算法——分离轴算法在Unity中实现(一)

       在实现分离轴算法前,需要做一些准备工作,在Unity中实现自定义多边形的显示,以及获取多边形的顶点和边的数据。

1.实现自定义多边形显示

        Unity中MeshFilter是负责处理Mesh(网格)的信息的引用,MeshRender是渲染MeshFilter中引用的网格,自定义网格需要同过这两个组件来显示。有了显示组件,下面就需要来生成我们需要的多边形mesh,mesh的生成是通过顶点生成三角形,然后三角形连接起来组成需要的Mesh。例如:在原点通过三个点生成一个三角形,

碰撞检测算法——分离轴算法在Unity中实现(一)_第1张图片

生成结果:

碰撞检测算法——分离轴算法在Unity中实现(一)_第2张图片

代码如下:

public void CreateTriangle()
{
    MeshRenderer meshRenderer = gameObject.GetComponent();
    meshRenderer.sharedMaterial = new Material(Shader.Find("Standard"));

    MeshFilter meshFilter = gameObject.GetComponent();

    Mesh mesh = new Mesh();

    Vector3[] vertices = new Vector3[3]
   {
        new Vector3(.5f ,  0, 0),
        new Vector3(-.5f, 0, 0),
        new Vector3(0,  .5f , 0)
   };

    mesh.vertices = vertices;

    int[] tris = new int[3]
    {
        // 左下方三角形
        1,2,0
    };
    mesh.triangles = tris;

    Vector3[] normals = new Vector3[3]
    {
        Vector3.forward,
        Vector3.forward,
        Vector3.forward,

    };
    mesh.normals = normals;

    Vector2[] uv = new Vector2[3]
    {
        new Vector2(.5f * width, 0),
        new Vector2(-.5f * width, 0),
        new Vector2(.5f * width, .5f * height)
    };
    mesh.uv = uv;

    base.meshFilter.mesh = mesh;

       有了生成形状的逻辑,还需要获取顶点数据和边数据的脚本,而这些逻辑都是所有形状共有的,所以可以将这些逻辑都封装到一个Polygon的脚本中。

  首先要提供一个更新顶点位置的方法,因为物体不是固定不变的。

public void UpdatePointInfo()
{
    points.Clear();
    //获取所有顶点
    Vector3[] v = meshFilter.sharedMesh.vertices;

    for (int i = 0; i < v.Length; i++)
    {
        //将顶点转换到世界坐标
        Vector3 vn = this.gameObject.transform.TransformPoint(v[i]);
        points.Add(vn);
    }
}

 然后还需要再顶点位置变了以后,边的信息也将改变,因此还需要有个建立边信息的方法。

public void BuildEdges()
{
    Vector2 p1;
    Vector2 p2;
    edges.Clear();
    for (int i = 0; i < points.Count; i++)
    {
        p1 = points[i];
        if (i + 1 >= points.Count)
        {
            p2 = points[0];
        }
        else
        {
            p2 = points[i + 1];
        }
        edges.Add(p2 - p1);
    }
}

2.创建矩形

矩形的草图如图所示:

碰撞检测算法——分离轴算法在Unity中实现(一)_第3张图片

创建矩形需要两个三角形,一共需要6个顶点,但是其中有两个顶点可以共用,所以四个顶点就足够了。

代码:

   public void CreteRectangle()
   {
       MeshRenderer meshRenderer = gameObject.GetComponent();
       meshRenderer.sharedMaterial = new Material(Shader.Find("Standard"));

       meshFilter = gameObject.GetComponent();

       Mesh mesh = new Mesh();

       Vector3[] vertices = new Vector3[4]
       {
           new Vector3(.5f, -.5f , 0),
           new Vector3(.5f,  .5f , 0),
           new Vector3(-.5f, -.5f , 0),
           new Vector3(-.5f,  .5f , 0)
       };
       mesh.vertices = vertices;

       int[] tris = new int[6]
       {
           // 左下方三角形
           0, 2, 1,
           // 右上方三角形
           2, 3, 1
       };
       mesh.triangles = tris;

       Vector3[] normals = new Vector3[4]
       {
           Vector3.forward,
           Vector3.forward,
           Vector3.forward,
           Vector3.forward
       };
       mesh.normals = normals;

       Vector2[] uv = new Vector2[4]
       {
           new Vector2(0, 0),
           new Vector2(1, 0),
           new Vector2(0, 1),
           new Vector2(1, 1)
       };
       mesh.uv = uv;

       base.meshFilter.mesh = mesh;
   }

演示:

碰撞检测算法-分离轴算法简介:分离轴算法演示,具体细节可以看我在这里写的https://;更多实用攻略教学,爆笑沙雕集锦,你所不知道的游戏知识,热门游戏视频7*24小时持续更新,尽在哔哩哔哩bilibili 视频播放量 6、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 浅陌95sss, 作者简介 记录自己的学习成果,分享自己的快乐,相关视频:学习记录--BFS寻路算法,学习记录--网络状态机实现,学习记录--设计模式之命令模式,排行榜模拟,学习记录--网格系统,选择排序演示,Comsol-模型收敛性,学习记录--Rpg雷达图,直接插入排序演示,预制菜的防腐剂,自我检测结果出了,结果很失望,出乎你我的预料icon-default.png?t=N7T8https://www.bilibili.com/video/BV1qp4y1M7WU/?spm_id_from=333.999.0.0

 参考资料:

Example: creating a quad - Unity 手册icon-default.png?t=N7T8https://docs.unity.cn/cn/current/Manual/Example-CreatingaBillboardPlane.html

你可能感兴趣的:(知识点记录,U3d,算法)