Unity:如何将网格柔和地包裹在其他网格周围?

4

假设有一个网格(如左侧的立方体)和另一个自定义球形网格(在右侧;如果更容易,可以是其他形状),在Unity和C#中如何在运行时轻松地将第二个网格软包裹在第一个网格周围?谢谢!

enter image description here

1个回答

5
以下方法来自VirtualMethodStudio的指引,它使用一个包装球体,并针对其中每个顶点向内投射一条射线,然后调整该顶点到击中点。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ShrinkWrapSphere : MonoBehaviour {

    void Start() {
        Debug.Log("Starting...");

        MeshFilter meshFilter = gameObject.GetComponent<MeshFilter>();
        Mesh mesh = meshFilter.mesh;

        Vector3[] vertices = new Vector3[mesh.vertices.Length];
        System.Array.Copy(mesh.vertices, vertices, vertices.Length);

        for (int i = 0; i < vertices.Length; i++) {
            Vector3 rayDirection = -mesh.normals[i];

            RaycastHit hit;
            if ( Physics.Raycast( vertices[i], rayDirection, out hit, 100f ) ) {
                vertices[i] = hit.point * 2f;
            }
            else {
                vertices[i] = Vector3.zero;
            }
        }

        mesh.vertices = vertices;

        Debug.Log("Done. Vertices count " + vertices.Length);

        // mesh.RecalculateBounds();
        // mesh.RecalculateNormals();
        // mesh.RecalculateTangents();
    }

}

enter image description here

通过 this asset 的Simplify函数,可以进一步简化生成的网格。

除此之外,还可以使用Collider.ClosestPoint(vertexPoint)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接