Unity模型加面算法实验 - 利用切割插件实现

本次试验还是想实现水平方向对模型加面,上一篇是相对原始的切割算法,本次想利用已有的切割插件,来实现一个水平面直接对模型进行切割加面。

Mesh切割插件介绍

关于模型切割,自己用过的比较好用的插件有两个,一个是EsySlice,Gitbub上的非常好用的切割插件,支持使用一个平面对任意的convex Mesh 进行切割,基于C#实现,附上链接地址和例子,有兴趣的可以学习下。
Github - EsySlice
Github - EsySliceExample
另一个是Mesh Slicer,也是一个不错的网格模型切片插件,支持带有碰撞器的切片网格,同时还支持蒙皮网格等优化功能。UnityAssetStore有售,各大unity论坛也有介绍,感兴趣的同学也可以学习。

实验操作

这次使用的是EsySlice,导入框架和例子可以学习切割模型的源码,然后稍加变通,即可对模型进行水平切割加面操作。话不多说,试验如下:

using EzySlice;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SliceTest : MonoBehaviour
{
    /// 
    /// 场景内新建的水平Plane
    /// 
    public Transform panelSliceTrm;
    /// 
    /// 切割模型时切割面的材质
    /// 
    public Material crossMaterial;

    void Start()
    {
        MeshSubdivide(gameObject);
    }

    private GameObject MeshSubdivide(GameObject modelObj)
    {
        Vector3 foodPos = modelObj.transform.position;
        Transform parentTrm = modelObj.transform.parent;
        float minH = 1.352f;  //选定可以切割到模型的最低高度
        float maxH = 3f;      //选定可以切割到模型的最高高度
        float space = 0.1f;   //水平高度的切割间距
        float y = maxH;
        while (y > minH)
        {
            panelSliceTrm.position = new Vector3(panelSliceTrm.position.x, y, panelSliceTrm.position.z);
            y -= space;

            SlicedHull hull = SliceObject(modelObj, crossMaterial);

            if (hull != null)
            {
                GameObject hullObj = hull.CreateUpperHull(modelObj, crossMaterial);
                hullObj.transform.SetParent(parentTrm);
                hullObj.transform.position = foodPos;
                Destroy(modelObj);
                modelObj = hullObj;
            }
        }
        return modelObj;
    }

    /// 
    /// 切割模型
    /// 
    /// 
    /// 
    /// 
    public SlicedHull SliceObject(GameObject obj, Material crossSectionMaterial = null)
    {
        // slice the provided object using the transforms of this object
        return obj.Slice(panelSliceTrm.position, panelSliceTrm.up, crossSectionMaterial);
    }

}

实验结果如图:Unity模型加面算法实验 - 利用切割插件实现_第1张图片
基于模型切割实现的方法,可以更加灵活地针对各种不同类型的模型进行水平方向的加面,当模型不规则时是可行的实现方式。

你可能感兴趣的:(Unity,unity,mesh)