效果展示

1.首先先下载一个模型剖切插件Cross-Section插件 没有的下方链接自取

插件下载链接

2.下载之后导入到项目  导入之后的样子如下图

因项目需求需要剖切模型,要使用滑动条进行剖切,插件中有很多demo,其中就有使用滑动条的,可是只能进行单独一个面的剖切,换面操作模型会恢复原状,需求是可以同时操作三个面剖切,模型不恢复原状

插件demo     视频链接一      视频链接二

最后只能在插件里面修改

修改了CappedSectionBox这个脚本

修改结果如下 代码很长就折叠了

//The purpose of this script is to manipulate the scale and position of the capped section box gizmo object
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; namespace WorldSpaceTransitions
{
public class CappedSectionBox : MonoBehaviour, ISizedSection
{ //public LayerMask layer = 13;
//[Space(10)]
public Collider xAxis;
public Collider xAxisNeg;
[Space(10)]
public Collider yAxis;
public Collider yAxisNeg;
[Space(10)]
public Collider zAxis;
public Collider zAxisNeg; private enum GizmoAxis { X, Y, Z, Xneg, Yneg, Zneg, XYRotate, XZRotate, YZRotate, none };
private GizmoAxis selectedAxis; private RaycastHit hit;
private Ray ray, ray1;
private Plane dragplane;
private float rayDistance, newRotY, rayDistancePrev, distance;
private Vector3 lookCamera, startDrag, startPos, startDragRot, lookHitPoint, startScale;
private bool dragging; #region 自己加的改动 改成滑动条剖切
/// <summary>
/// 发射射线的物体 世界坐标的x轴 y轴 z轴 方向 各放一个位置作为起点
/// </summary>
public GameObject rayobj_X, rayobj_Y, rayobj_Z;
public Slider sliderX,sliderY,sliderZ; // Use this for initialization
void Start()
{ //滑动条的数值如果不是很准确 就把 maxValue minValue调试到合适的值就可以了
sliderX.maxValue = xAxis.transform.position.x;
sliderX.minValue = -(xAxis.transform.position.x);
sliderX.value = sliderX.maxValue;// + this.transform.position.x; sliderY.maxValue = yAxis.transform.position.y;
sliderY.minValue = -(yAxis.transform.position.y)/2;
sliderY.value = sliderY.maxValue;// + this.transform.position.y; //不准确自己手动调吧 其他轴不准确的也自己调一下就行了
sliderZ.maxValue = zAxis.transform.position.z;
sliderZ.minValue = -zAxis.transform.position.z;
sliderZ.value = sliderZ.maxValue; }
public void 滑动条按下(int aa)
{
if (aa==0)
{
dragplane = new Plane();
RaycastHit hit;
if (Physics.Raycast(rayobj_X.transform.position ,xAxis .transform.position , out hit, 1000f))
{
selectedAxis = GizmoAxis.X;
dragplane.SetNormalAndPosition(transform.right, transform.position);
}
distance = hit.distance;
startDrag = new Vector3(xAxis.transform.position.x, xAxis.transform.position.y, distance);
startPos = transform.position;
startScale = transform.localScale;
dragging = true;
}
else if (aa==1)
{ dragplane = new Plane();
RaycastHit hit;
if (Physics.Raycast(rayobj_Y.transform.position, yAxis.transform.position, out hit, 1000f))
{
selectedAxis = GizmoAxis.Y;
dragplane.SetNormalAndPosition(transform.up, transform.position);
} distance = hit.distance;
startDrag = new Vector3(yAxis.transform.position.x, yAxis.transform.position.y, distance);
startPos = transform.position;
startScale = transform.localScale;
dragging = true; }
else if (aa==2)
{
dragplane = new Plane();
RaycastHit hit;
if (Physics.Raycast(rayobj_Z.transform.position, zAxis.transform.position, out hit, 1000f))
{
selectedAxis = GizmoAxis.Z;
dragplane.SetNormalAndPosition(transform.forward, transform.position);
}
Debug.DrawLine(rayobj_Z.transform.position, zAxis.transform.position, Color.red,10f);
distance = hit.distance;
startDrag = new Vector3(zAxis.transform.position.x, zAxis.transform.position.y, zAxis.transform.position.z);
startPos = transform.position;
startScale = transform.localScale;
dragging = true;
} }
public void 滑动条拖动(int aa)
{
if (aa == 0)
{
if (dragging)
{
float lsx = startScale.x;
float lsy = startScale.y;
float lsz = startScale.z;
Vector3 onDrag = new Vector3(sliderX.value, xAxis.transform.position.y, distance);
Vector3 translation = onDrag - startDrag;
Vector3 projectedTranslation = Vector3.zero; projectedTranslation = Vector3.Project(translation, transform.right);
transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
lsx += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, transform.right));
transform.localScale = new Vector3(Mathf.Clamp(lsx, 0.01f, Mathf.Infinity), Mathf.Clamp(lsy, 0.01f, Mathf.Infinity), Mathf.Clamp(lsz, 0.01f, Mathf.Infinity));
}
}
else if (aa==1)
{
if (dragging)
{
float lsx = startScale.x;
float lsy = startScale.y;
float lsz = startScale.z;
Vector3 onDrag = new Vector3(yAxis.transform.position.x , sliderY.value, distance);
Vector3 translation = onDrag - startDrag;
Vector3 projectedTranslation = Vector3.zero; projectedTranslation = Vector3.Project(translation, transform.up);
transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
lsy += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, transform.up));
transform.localScale = new Vector3(Mathf.Clamp(lsx, 0.01f, Mathf.Infinity), Mathf.Clamp(lsy, 0.01f, Mathf.Infinity), Mathf.Clamp(lsz, 0.01f, Mathf.Infinity));
}
}
else if (aa==2)
{
if (dragging)
{
float lsx = startScale.x;
float lsy = startScale.y;
float lsz = startScale.z;
Vector3 onDrag = new Vector3(zAxis.transform.position.x, zAxis.transform.position.y, (distance+sliderZ.value));
Vector3 translation = onDrag - startDrag;
Vector3 projectedTranslation = Vector3.zero; projectedTranslation = Vector3.Project(translation, transform.forward);
transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
lsz += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, transform.forward));
transform.localScale = new Vector3(Mathf.Clamp(lsx, 0.01f, Mathf.Infinity), Mathf.Clamp(lsy, 0.01f, Mathf.Infinity), Mathf.Clamp(lsz, 0.01f, Mathf.Infinity));
}
}
}
public void 滑动条停止()
{
dragging = false;
} #endregion
// Update is called once per frame
void Update()
{ //if (Input.GetMouseButtonDown(0))
//{ // ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// dragplane = new Plane(); // RaycastHit hit;
// if (xAxis.Raycast(ray, out hit, 1000f))
// {
// selectedAxis = GizmoAxis.X;
// dragplane.SetNormalAndPosition(transform.up, transform.position);
// }
// else if (xAxisNeg.Raycast(ray, out hit, 1000f))
// {
// selectedAxis = GizmoAxis.Xneg;
// dragplane.SetNormalAndPosition(-transform.up, transform.position);
// }
// else if (yAxis.Raycast(ray, out hit, 1000f))
// {
// selectedAxis = GizmoAxis.Y;
// dragplane.SetNormalAndPosition(transform.forward, transform.position);
// }
// else if (yAxisNeg.Raycast(ray, out hit, 1000f))
// {
// selectedAxis = GizmoAxis.Yneg;
// dragplane.SetNormalAndPosition(-transform.forward, transform.position);
// }
// else if (zAxis.Raycast(ray, out hit, 1000f))
// {
// selectedAxis = GizmoAxis.Z;
// dragplane.SetNormalAndPosition(transform.up, transform.position);
// }
// else if (zAxisNeg.Raycast(ray, out hit, 1000f))
// {
// selectedAxis = GizmoAxis.Zneg;
// dragplane.SetNormalAndPosition(-transform.up, transform.position);
// }
// else
// {
// //Debug.Log(hit.collider.name);
// return;
// }
// distance = hit.distance;
// startDrag = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance));
// startPos = transform.position;
// startScale = transform.localScale;
// dragging = true;
//} //if (dragging)
//{
// ray = Camera.main.ScreenPointToRay(Input.mousePosition); // Vector3 onDrag = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance));
// Vector3 translation = onDrag - startDrag;
// Vector3 projectedTranslation = Vector3.zero; // if (dragging)
// {
// float lsx = startScale.x;
// float lsy = startScale.y;
// float lsz = startScale.z; // switch (selectedAxis)
// {
// case GizmoAxis.X:
// {
// projectedTranslation = Vector3.Project(translation, transform.right);
// transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
// lsx += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, transform.right));
// break;
// }
// case GizmoAxis.Xneg:
// {
// projectedTranslation = Vector3.Project(translation, -transform.right);
// transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
// lsx += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, -transform.right));
// break;
// }
// case GizmoAxis.Y:
// {
// projectedTranslation = Vector3.Project(translation, transform.up);
// transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
// lsy += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, transform.up));
// break;
// }
// case GizmoAxis.Yneg:
// {
// projectedTranslation = Vector3.Project(translation, -transform.up);
// transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
// lsy += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, -transform.up));
// break;
// }
// case GizmoAxis.Z:
// {
// projectedTranslation = Vector3.Project(translation, transform.forward);
// transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
// lsz += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, transform.forward));
// break;
// }
// case GizmoAxis.Zneg:
// {
// projectedTranslation = Vector3.Project(translation, -transform.forward);
// transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
// lsz += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, -transform.forward));
// break;
// } // } // transform.localScale = new Vector3(Mathf.Clamp(lsx, 0.01f, Mathf.Infinity), Mathf.Clamp(lsy, 0.01f, Mathf.Infinity), Mathf.Clamp(lsz, 0.01f, Mathf.Infinity)); // //foreach (UVScaler uvs in gameObject.GetComponentsInChildren<UVScaler>()) uvs.SetUV();
// } // if (Input.GetMouseButtonUp(0))
// {
// dragging = false;
// }
//}
} public void HideCage(bool val)
{
foreach (PlaneHover ph in gameObject.GetComponentsInChildren<PlaneHover>()) ph.GetComponent<Renderer>().enabled = val;
}
public void HideCaps(bool val)
{
foreach (Transform quad in gameObject.transform) if (quad.name.Contains("hatch")) quad.GetComponent<Renderer>().enabled = val;
} public void Size(Bounds b, GameObject g, BoundsOrientation orientation)
{
//Debug.Log(b.ToString());
float scale = 1f; Vector3 clearance = 0.01f * Vector3.one; transform.localScale = Vector3.one; transform.localScale = scale * b.size + clearance; transform.position = b.center;
}
}
}

CappedSectionBox

修改完之后就是效果展示的样子了

项目Hierarchy截图  用的就是插件里面带的demo

最后再把插件修改过后的资源包发一下吧,以免其他小伙伴出错

修改之后的插件资源包下载

亲测2021.3.4可以打包

之后又更改了既可以滑动条模型剖切,也可以鼠标点击模型进行剖切

只改了一个脚本如下 复制替换即可 

//The purpose of this script is to manipulate the scale and position of the capped section box gizmo object
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI; namespace WorldSpaceTransitions
{
public class CappedSectionBox : MonoBehaviour, ISizedSection
{ //public LayerMask layer = 13;
//[Space(10)]
public Collider xAxis;
public Collider xAxisNeg;
[Space(10)]
public Collider yAxis;
public Collider yAxisNeg;
[Space(10)]
public Collider zAxis;
public Collider zAxisNeg; private enum GizmoAxis { X, Y, Z, Xneg, Yneg, Zneg, XYRotate, XZRotate, YZRotate, none };
private GizmoAxis selectedAxis; private RaycastHit hit;
private Ray ray, ray1;
private Plane dragplane;
private float rayDistance, newRotY, rayDistancePrev, distance;
private Vector3 lookCamera, startDrag, startPos, startDragRot, lookHitPoint, startScale;
private bool dragging;
private bool dragging_; #region 自己加的改动 改成滑动条剖切
/// <summary>
/// 发射射线的物体
/// </summary>
//public GameObject rayobj_X, rayobj_Y, rayobj_Z;
public Slider sliderX, sliderY, sliderZ; private float floatminX, floatminY, floatminZ, floatmaxX, floatmaxY, floatmaxZ;
private float flokmax, flokmay, flokmaz;
private float blx, bly, blz; // Use this for initialization
void Start()
{ //GetSliderData();
}
public void GetSliderData()
{
floatminX = xAxisNeg.transform.position.x;
floatminY = yAxisNeg.transform.position.y;
floatminZ = zAxisNeg.transform.position.z; floatmaxX = xAxis.transform.position.x;
floatmaxY = yAxis.transform.position.y;
floatmaxZ = zAxis.transform.position.z; sliderX.maxValue = floatmaxX;
sliderX.minValue = floatminX;
sliderX.value = floatmaxX;// + this.transform.position.x; sliderY.maxValue = floatmaxY;
sliderY.minValue = floatminY;
sliderY.value = floatmaxY;// + this.transform.position.y; sliderZ.maxValue = floatmaxZ;
sliderZ.minValue = floatminZ;
sliderZ.value = floatmaxZ; flokmax = transform.localScale.x;
flokmay = transform.localScale.y;
flokmaz = transform.localScale.z; blx = GetSpecific_value(floatmaxX, floatminX, flokmax);
bly = GetSpecific_value(floatmaxY, floatminY, flokmay);
blz = GetSpecific_value(floatmaxZ, floatminZ, flokmaz); }
public void 滑动条按下(int aa)
{
if (aa == 0)
{
dragplane = new Plane();
RaycastHit hit;
if (xAxis.Raycast(ray, out hit, 1000f))
{
selectedAxis = GizmoAxis.X;
dragplane.SetNormalAndPosition(transform.right, transform.position);
}
distance = hit.distance;
startDrag = new Vector3(xAxis.transform.position.x, xAxis.transform.position.y, distance);
startPos = transform.position;
startScale = transform.localScale;
}
else if (aa == 1)
{ dragplane = new Plane();
RaycastHit hit;
//if (Physics.Raycast(rayobj_Y.transform.position, yAxis.transform.position, out hit, 1000f))
if (yAxis.Raycast(ray, out hit, 1000f))
{
selectedAxis = GizmoAxis.Y;
dragplane.SetNormalAndPosition(transform.up, transform.position);
}
distance = hit.distance;
startDrag = new Vector3(yAxis.transform.position.x, yAxis.transform.position.y, distance);
startPos = transform.position;
startScale = transform.localScale;
}
else if (aa == 2)
{
dragplane = new Plane();
RaycastHit hit;
if (zAxis.Raycast(ray, out hit, 1000f))
{
selectedAxis = GizmoAxis.Z;
dragplane.SetNormalAndPosition(transform.forward, transform.position);
}
//Debug.DrawLine(rayobj_Z.transform.position, zAxis.transform.position, Color.red, 10f);
distance = hit.distance;
startDrag = new Vector3(zAxis.transform.position.x, zAxis.transform.position.y, zAxis.transform.position.z);
startPos = transform.position;
startScale = transform.localScale;
}
滑动条拖动(aa); }
public void 滑动条拖动(int aa)
{
if (aa == 0)
{
float lsx = startScale.x;
float lsy = startScale.y;
float lsz = startScale.z;
Vector3 onDrag = new Vector3(sliderX.value, xAxis.transform.position.y, distance);
Vector3 translation = onDrag - startDrag;
Vector3 projectedTranslation = Vector3.zero; projectedTranslation = Vector3.Project(translation, transform.right);
transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
lsx += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, transform.right));
transform.localScale = new Vector3(Mathf.Clamp(lsx, 0.01f, Mathf.Infinity), Mathf.Clamp(lsy, 0.01f, Mathf.Infinity), Mathf.Clamp(lsz, 0.01f, Mathf.Infinity));
}
else if (aa == 1)
{
float lsx = startScale.x;
float lsy = startScale.y;
float lsz = startScale.z;
Vector3 onDrag = new Vector3(yAxis.transform.position.x, sliderY.value, distance);
Vector3 translation = onDrag - startDrag;
Vector3 projectedTranslation = Vector3.zero; projectedTranslation = Vector3.Project(translation, transform.up);
transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
lsy += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, transform.up));
transform.localScale = new Vector3(Mathf.Clamp(lsx, 0.01f, Mathf.Infinity), Mathf.Clamp(lsy, 0.01f, Mathf.Infinity), Mathf.Clamp(lsz, 0.01f, Mathf.Infinity));
}
else if (aa == 2)
{
float lsx = startScale.x;
float lsy = startScale.y;
float lsz = startScale.z;
Vector3 onDrag = new Vector3(zAxis.transform.position.x, zAxis.transform.position.y, (sliderZ.value-distance));
Vector3 translation = onDrag - startDrag;
Vector3 projectedTranslation = Vector3.zero; projectedTranslation = Vector3.Project(translation, transform.forward);
transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
lsz += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, transform.forward));
transform.localScale = new Vector3(Mathf.Clamp(lsx, 0.01f, Mathf.Infinity), Mathf.Clamp(lsy, 0.01f, Mathf.Infinity), Mathf.Clamp(lsz, 0.01f, Mathf.Infinity));
}
}
#endregion
// Update is called once per frame
void Update()
{ if (Input.GetMouseButtonDown(0) && EventSystem.current.IsPointerOverGameObject() == false)
{ ray = Camera.main.ScreenPointToRay(Input.mousePosition);
dragplane = new Plane(); RaycastHit hit;
if (xAxis.Raycast(ray, out hit, 1000f))
{
selectedAxis = GizmoAxis.X;
dragplane.SetNormalAndPosition(transform.up, transform.position);
}
else if (xAxisNeg.Raycast(ray, out hit, 1000f))
{
selectedAxis = GizmoAxis.Xneg;
dragplane.SetNormalAndPosition(-transform.up, transform.position);
}
else if (yAxis.Raycast(ray, out hit, 1000f))
{
selectedAxis = GizmoAxis.Y;
dragplane.SetNormalAndPosition(transform.forward, transform.position);
}
else if (yAxisNeg.Raycast(ray, out hit, 1000f))
{
selectedAxis = GizmoAxis.Yneg;
dragplane.SetNormalAndPosition(-transform.forward, transform.position);
}
else if (zAxis.Raycast(ray, out hit, 1000f))
{
selectedAxis = GizmoAxis.Z;
dragplane.SetNormalAndPosition(transform.up, transform.position);
}
else if (zAxisNeg.Raycast(ray, out hit, 1000f))
{
selectedAxis = GizmoAxis.Zneg;
dragplane.SetNormalAndPosition(-transform.up, transform.position);
}
else
{
//Debug.Log(hit.collider.name);
return;
}
distance = hit.distance;
startDrag = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance));
startPos = transform.position;
startScale = transform.localScale; dragging_ = true;
} if (dragging_)
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition); Vector3 onDrag = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance));
Vector3 translation = onDrag - startDrag;
Vector3 projectedTranslation = Vector3.zero; float lsx = startScale.x;
float lsy = startScale.y;
float lsz = startScale.z; switch (selectedAxis)
{
case GizmoAxis.X:
{
projectedTranslation = Vector3.Project(translation, transform.right);
transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
lsx += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, transform.right));
break;
}
//case GizmoAxis.Xneg:
// {
// projectedTranslation = Vector3.Project(translation, -transform.right);
// transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
// lsx += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, -transform.right));
// break;
// }
case GizmoAxis.Y:
{
projectedTranslation = Vector3.Project(translation, transform.up);
transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
lsy += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, transform.up));
break;
}
//case GizmoAxis.Yneg:
// {
// projectedTranslation = Vector3.Project(translation, -transform.up);
// transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
// lsy += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, -transform.up));
// break;
// }
case GizmoAxis.Z:
{
projectedTranslation = Vector3.Project(translation, transform.forward);
transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
lsz += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, transform.forward));
break;
}
//case GizmoAxis.Zneg:
// {
// projectedTranslation = Vector3.Project(translation, -transform.forward);
// transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
// lsz += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, -transform.forward));
// break;
// } } transform.localScale = new Vector3(Mathf.Clamp(lsx, 0.01f, Mathf.Infinity), Mathf.Clamp(lsy, 0.01f, Mathf.Infinity), Mathf.Clamp(lsz, 0.01f, Mathf.Infinity)); //比例值根据公式计算所得 lsx (框)的区间 是0-lsx 滑动条上面也有一个值的区间 min-max
//公式: (0*x)+y= 滑动条最小值 min
// (lsx*x)+y=滑动条最大值 max
//最后求出 x值 y值 带进去即可 因为模型大小都不一样,比例值也不一致,需要自行计算
sliderX.value = lsx * blx + floatminX;
sliderY.value = lsy * bly + floatminY;
sliderZ.value = lsz * blz + floatminZ; if (Input.GetMouseButtonUp(0))
{
dragging_ = false;
}
}
}
public float GetSpecific_value(float MAX, float MIN, float LXYZ)
{
float AA = (MAX - MIN) / LXYZ;
return AA;
} public void HideCage(bool val)
{
foreach (PlaneHover ph in gameObject.GetComponentsInChildren<PlaneHover>()) ph.GetComponent<Renderer>().enabled = val;
}
public void HideCaps(bool val)
{
foreach (Transform quad in gameObject.transform) if (quad.name.Contains("hatch")) quad.GetComponent<Renderer>().enabled = val;
} public void Size(Bounds b, GameObject g, BoundsOrientation orientation)
{
//Debug.Log(b.ToString());
float scale = 1f; Vector3 clearance = 0.01f * Vector3.one; transform.localScale = Vector3.one; transform.localScale = scale * b.size + clearance; transform.position = b.center;
}
}
}

修改之后的脚本

再加一个自动设置剖切的脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using WorldSpaceTransitions; public class AutoSheScript : MonoBehaviour
{
public GameObject pouqieObj;
public SectionSetup sectionSetup_;
public CappedSectionBox cappedSectionBox_; // Start is called before the first frame update
void Start()
{
//模型标签"PouQie"
pouqieObj = GameObject.FindGameObjectWithTag("PouQie");
}
//执行剖切 剖切框就会自动设置好
public void Perform_Cutting()
{ sectionSetup_.model = pouqieObj;
sectionSetup_.RecalculateBounds();
sectionSetup_.CheckShaders();
sectionSetup_.CreateSectionMaterials();
cappedSectionBox_.GetSliderData(); }
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown (KeyCode.Space))
{
Perform_Cutting();
}
}
}

自动设置剖切

修改之后的效果

没有积分的可以评论区联系我,看到会回复的

如果喜欢请给我点个赞吧,谢谢

搜索

复制

Unity模型剖切的更多相关文章

  1. xBIM WeXplorer xViewer的导航,相机、剖切、隐藏 等操作

    目录 基础 xBIM WeXplorer 简要介绍 xBIM WeXplorer xViewer 基本应用 xBIM WeXplorer xViewer 浏览器检查 xBIM WeXplorer xV ...

  2. SkylineGlobe 7.0.1 & 7.0.2版本Web开发 如何实现对三维模型和地形的剖切展示

    现在很多三维项目中,不仅仅要用到三维地形,正射影像和矢量数据,还会融合到各种三维模型,包括传统的3DMax手工建模,BIM,倾斜摄影自动建模,激光点云模型,三维地质体模型等等. 三维平台首先要做的是把 ...

  3. xBIM 基础12 WeXplorer xViewer的导航、相机、剖切、隐藏等操作

    系列目录    [已更新最新开发文章,点击查看详细]  本篇将学习xViewer的导航,剪切和隐藏.这应该足以使用户能够通过所有缩放,平移,轨道运行和隐藏可能的障碍物来检查建筑物内部.点击这里可以看到 ...

  4. 【VR视频播放】解决Unity模型贴图反转的问题

    使用UV贴图网模型上贴的时候, 会出现图片反过来的情况. 根本原因是因为, 一般系统的屏幕坐标系(例如Android)是左上角为原点(0,0), 但是Unity的贴图是以左下角为原点(0,0) 方法有 ...

  5. Unity模型导入的若干问题

    原地址:http://tieba.baidu.com/p/2807225555 我觉得有三点感觉在导出时比较重要的1.单位的设置3dsmax系统单位设置就设成厘米显示单位公制也设成厘米这样在max里的 ...

  6. unity模型任意无限切割插件

    概述 3d模型的任意切割一直是游戏开发里的一个很大的问题,模型切割的关键点就只有生成横切面的新顶点以及切口纹理的缝合,理论上解决了这两点,就近乎可以做到以假乱真的程度了.本篇文章就这两点进行描述 详细 ...

  7. unity 模型层次细节

    http://blog.csdn.net/qq_25210959/article/details/51734517 层次细节(LOD),它是根据物体在游戏画面中所占视图的百分比来调用不同复杂度的模型的 ...

  8. unity模型法线反转问题

    fbx模型导入unity正常 但只要绑了骨骼,在3dmax中正常,进入unity就法线反转 原因是3dmax中模型用到复制和镜像的导出需要多一步处理 1重置变换 2反转法线 按顺序进行这两个,在绑定模 ...

  9. Unity 模型导入导出

    从3DMAX导出,参考: http://tieba.baidu.com/p/2807225555 -> 使用3dmax 2013,会自带导出 fbx 的功能 -> 从 3dmax 导出 - ...

  10. Unity模型导入导出

    从3DMAX导出,参考: http://tieba.baidu.com/p/2807225555 -> 使用3dmax 2013,会自带导出 fbx 的功能 -> 从 3dmax 导出 - ...

随机推荐

  1. NG-ZORRO + Angular11使用Echarts实现柱折线图-折柱混合,并给图表添加点击打印图表数据!!!详细代码

    先上效果图 HTML代码 <div echarts #myEchart [options]="option"></div> ts代码 import { Co ...

  2. Markdown快速入门——我不学 甚至没这篇文章

    Markdown快速入门---我不学甚至没这篇文章 写在前 俗话说:"工欲善其事,必先利其器".那么码字前,自然是要找到合适的工具.我这里就选用了VSCode+Markdown.( ...

  3. try catch finally,try里有return,finally还执行么?

    执行,并且finally的执行早于try里面的return: 结论: 1.不管有木有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: ...

  4. 读Java8函数式编程笔记01_Lambda表达式

    1. Java 8函数式编程 1.1. 没有单子 1.2. 没有语言层面的惰性求值 1.3. 没有为不可变性提供额外支持 1.4. 集合类可以拥有一些额外的方法:default方法 2. 现实世界中, ...

  5. epoll分布式通讯

    参考http://www.xmailserver.org/linux-patches/nio-improve.html  epoll通讯 参考https://blog.csdn.net/yangqua ...

  6. 【开源】libserial_parse_text:命令行解析的基础库

    借助五一假期,写了一个命令行解析的基础库,一般可用于串口命令解析.TCP命令解析等等. 具有以下几种特点: 不涉及到具体硬件, 纯软件协议,与具体硬件分离. 支持不定长命令行,逐个字符解码,可以支持不 ...

  7. Selenium4.6版本浏览器自动退出问题

    Selenium4.6版本浏览器自动退出问题 代码 from selenium import webdriver driver = webdriver.Chrome() driver.get('htt ...

  8. Markdown箭头总汇

    Markdown箭头的汇总 普通箭头 \[\uparrow \] $$\uparrow$$ \[\Uparrow \] $$\Uparrow$$ \[\downarrow \] $$\downarro ...

  9. CAS 悲观锁 乐观锁

    前面的偏向锁,轻量级锁,重量级锁都是悲观锁, 都会认为必须要对操作对象进行互斥访问,不然就会产生异常, 所以线程只供一个线程使用,阻塞其他线程,是悲观的 在某些情况下,同步的耗时远大于线程切换的时间, ...

  10. 2.4.rpx单位有内置的视图容器组件

    所有的视图组件,包括view.swiper等,本身不显示任何可视化元素.它们的用途都是为了包裹其他真正显示的组件. # view 视图容器. 它类似于传统html中的div,用于包裹各种元素内容. 如 ...