コード例 #1
0
    void Update()
    {
        if (Input.GetMouseButtonUp(0))
        {
            Ray cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition);

            RaycastHit rayCastHitInfo = default(RaycastHit);
            if (Physics.Raycast(cameraRay, out rayCastHitInfo))
            {
                Mesh originMesh = rayCastHitInfo.collider.gameObject.GetComponent <MeshFilter>().sharedMesh;

                Vector3 slicerNormal  = rayCastHitInfo.normal;
                Vector3 pointOnSlicer = rayCastHitInfo.point - slicerNormal * SlicerOffset;
                Plane   slicerPlane   = new Plane(slicerNormal, pointOnSlicer);

                Matrix4x4 trs = Matrix4x4.TRS(rayCastHitInfo.collider.gameObject.transform.position, rayCastHitInfo.collider.gameObject.transform.rotation, rayCastHitInfo.collider.gameObject.transform.localScale);

                Mesh m = Object.Instantiate <Mesh>(originMesh);
                m.ApplyTransposeMatrix(trs);

                MeshSlicer slicer = new MeshSlicer(m, slicerPlane);


                slicer.Slice(false, false);

                slicer.RenderSlicedGameObject(SlicedUpperMaterial);
            }
        }
    }
コード例 #2
0
    private void OnGUI()
    {
        if (GUILayout.Button("slice mesh", GUILayout.Width(100), GUILayout.Height(60)))
        {
            Plane slicerPlane = new Plane(slicerNormal, slicerDistance);

            Mesh     targetMesh       = null;
            Material originalMaterial = null;

            MeshFilter meshFilter = TargetGameobject.GetComponentInChildren <MeshFilter>();
            if (meshFilter != null)
            {
                targetMesh = meshFilter.mesh;
            }
            else
            {
                SkinnedMeshRenderer skinMeshRenderer = TargetGameobject.GetComponentInChildren <SkinnedMeshRenderer>();
                if (skinMeshRenderer != null)
                {
                    targetMesh       = skinMeshRenderer.sharedMesh;
                    originalMaterial = skinMeshRenderer.material;
                }
            }

            if (!targetMesh)
            {
                Debug.LogError("target mesh is null");
                return;
            }

            if (!originalMaterial)
            {
                MeshRenderer meshRenderer = TargetGameobject.GetComponentInChildren <MeshRenderer>();
                if (meshRenderer)
                {
                    originalMaterial = meshRenderer.material;
                }
            }
            m_meshSlicer = new MeshSlicer(targetMesh, slicerPlane);
            m_meshSlicer.Slice(IncludeIntersection, IncludeOppsiteSide);

            if (!SlicedUpperMaterial)
            {
                SlicedUpperMaterial = originalMaterial;
            }

            m_meshSlicer.RenderSlicedGameObject(SlicedUpperMaterial, SlicedUnderMaterial, SlicedUpperIntersectionMaterial, SlicedUnderIntersectionMaterial, TargetGameobject.name);

            if (RemainOriginGameObject)
            {
                TargetGameobject.SetActive(false);
            }
            else
            {
                GameObject.Destroy(TargetGameobject);
            }
        }
    }