赞
踩
PolygonCollider2D中有points属性,对应和图形的顶点,PolygonCollider2D的顶点可以手动添加或者删除,右键Element X可选择删除这个点。由于Unity
中所有图片都是连个三角面组成的矩形,在此需要手动拖动点勾勒出图片的有效切割范围。points属性的点顺序如图逆时针从Element0到Element3。
// 通过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; }
通过两个顶点算出线段的直线方程存放到lines
的List<Line>
中。
Line类中需要有以下几个属性、方法,为接下来运算做准备:
1. 起点坐标
2. 终点坐标
3. 计算直线方程参数 k b(两点确定直线方程,y = kx + b)
4. 获取两条线段的交点(求直线交点,再判断是否再线段上)
5. 根据直线将点集分区域(分三部分:在线上、线的上方、线的下方 )
画的线也属于直线,应记录起始点,在画线结束时候生成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实现图片切割 - 概述
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。