最近要跟别人联机打无主之地3,忙里抽闲做点东西,避免大脑萎缩。
Mesh的切割做如下思路:拟定切割的平面
求得新增的切割点
缝合截面
纠正绕序得到新Mesh
拟定切割面
首先看第一个,拟定切割面。其实这个步骤包含两步,第一步是从输入拿到世界坐标空间下的平面,第二步是把平面从世界坐标空间转到各个模型坐标空间。
先规划好数据类型吧:
public struct DividePlane
{
public Vector3 normal, point;
public Vector3 v1, v2, v3;
}
public struct DivideSegment
{
public Vector3 p0, p1;
public bool available { get { return p0 != p1; } }
public DivideSegment(Vector3 v0, Vector3 v1)
{
p0 = v0; p1 = v1;
}
}
DividePlane之所以要这么设计,是因为一个Plane对不同的模型有着不同的转换后的样式……从输出中拿平面是这样的:
private Vector3 pressStart, pressEnd;
public List waitForDivide = new List();
private void Update()
{
if (Input.GetMouseButtonDown(0))
pressStart = Input.mousePosition;
if (Input.GetMouseButtonUp(0))
{
pressEnd = Input.mousePosition;
if (pressEnd == pressStart) return;
DividePlane plane = new DividePlane();
plane.v1 = Camera.main.ScreenToWorldPoint(new Vector3(pressStart.x, pressStart.y, Camera.main.nearClipPlane));
plane.v2 = Camera.main.ScreenToWorldPoint(new Vector3(pressEnd.x, pressEnd.y, Camera.main.nearClipPlane));
plane.v3 = Camera.main.ScreenToWorldPoint(new Vector3(pressEnd.x, pressEnd.y, Camera.main.farClipPlane));
for (int i = waitForDivide.Count - 1; i >= 0; i--)
if (TransformPlane(waitForDivide[i], ref plane))
{