在实现分离轴算法前,需要做一些准备工作,在Unity中实现自定义多边形的显示,以及获取多边形的顶点和边的数据。
1.实现自定义多边形显示
Unity中MeshFilter是负责处理Mesh(网格)的信息的引用,MeshRender是渲染MeshFilter中引用的网格,自定义网格需要同过这两个组件来显示。有了显示组件,下面就需要来生成我们需要的多边形mesh,mesh的生成是通过顶点生成三角形,然后三角形连接起来组成需要的Mesh。例如:在原点通过三个点生成一个三角形,
生成结果:
代码如下:
public void CreateTriangle()
{
MeshRenderer meshRenderer = gameObject.GetComponent<MeshRenderer>();
meshRenderer.sharedMaterial = new Material(Shader.Find("Standard"));
MeshFilter meshFilter = gameObject.GetComponent<MeshFilter>();
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.创建矩形
矩形的草图如图所示:
创建矩形需要两个三角形,一共需要6个顶点,但是其中有两个顶点可以共用,所以四个顶点就足够了。
代码:
public void CreteRectangle()
{
MeshRenderer meshRenderer = gameObject.GetComponent<MeshRenderer>();
meshRenderer.sharedMaterial = new Material(Shader.Find("Standard"));
meshFilter = gameObject.GetComponent<MeshFilter>();
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雷达图,直接插入排序演示,预制菜的防腐剂,自我检测结果出了,结果很失望,出乎你我的预料https://www.bilibili.com/video/BV1qp4y1M7WU/?spm_id_from=333.999.0.0
参考资料:
Example: creating a quad - Unity 手册https://docs.unity.cn/cn/current/Manual/Example-CreatingaBillboardPlane.html