Unity Mesh实现图片切割(一)- 线与顶点

Posted on By

一、 PolygonCollider2D获取顶点和线段

在这里插入图片描述 PolygonCollider2D中有points属性,对应和图形的顶点,PolygonCollider2D的顶点可以手动添加或者删除,右键Element X可选择删除这个点。由于Unity 中所有图片都是连个三角面组成的矩形,在此需要手动拖动点勾勒出图片的有效切割范围。points属性的点顺序如图逆时针从Element0到Element3。

1. 顶点的获取方式

// 通过Collider获取顶点的世界坐标,根据gameObject的缩放和位置重新计算
Vector2[] GetVerticesFromPolygonCollider(){
	SpriteRenderer sr = gameObject.GetComponent<SpriteRenderer>();
	Sprite sprite = sr.sprite;
	PolygonCollider2D collider = gameObject.GetComponent<PolygonCollider2D>();
	Vector2[] vertices = collider.points;
	for (int i = 0; i < vertices.Length; i++)
	{
		Vector2 ver = vertices[i];
		// 根据缩放重算顶点坐标
		ver = new Vector2(ver.x * transform.localScale.x, ver.y * transform.localScale.y);
		// 根据位置重算顶点坐标
		ver = new Vector2(ver.x + transform.position.x, ver.y + transform.position.y);
		vertices[i] = ver;
	}
	return vertices;
}

2. 线段的获取方式

通过两个顶点算出线段的直线方程存放到linesList<Line>中。 Line类中需要有以下几个属性、方法,为接下来运算做准备: 1. 起点坐标 2. 终点坐标 3. 计算直线方程参数 k b(两点确定直线方程,y = kx + b) 4. 获取两条线段的交点(求直线交点,再判断是否再线段上) 5. 根据直线将点集分区域(分三部分:在线上、线的上方、线的下方 )

二、 LineRenderer画线

画的线也属于直线,应记录起始点,在画线结束时候生成Line的实例。 实现画线的功能:

LineRenderer lr;
Vector2 startPos;
Vector2 endPos;
void DrawLine(){
	if (startPos == null || endPos == null)
		return;
	points = new Vector3[2]{startPos, endPos};		
	if (lr){
		lr.startWidth = lineWidth; 
		lr.endWidth = lineWidth;
		lr.useWorldSpace = false;
		lr.sortingLayerID = sortingLayer;
		lr.sortingOrder = orderInLayer;
		lr.positionCount = points.Length;
		lr.material = lineMaterial;
		lr.SetPositions (points);
	}
}

在Update中实时更新endPos值,并实时画线。注意坐标转换为:

Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10))

下一遍博客将讲解交点坐标的求解以及为创建新的mesh顶点坐标的预处理: Unity Mesh实现图片切割(二)- 顶点计算

全文链接: Unity Mesh实现图片切割 - 概述