滤网外观损坏

Mesh Filter Cosmetic Damage

目前正在尝试编写一个脚本,该脚本允许球在通过关卡时受到装饰性网格物体的损坏。问题是,我一直无法找到移动顶点的正确方程。

这是我目前所拥有的

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;

public class MeshDenter : MonoBehaviour {
    Vector3[] originalMesh;
    public float dentFactor;
    public LayerMask collisionMask;
    private MeshFilter meshFilter;
    void Start() {
        meshFilter = GetComponent<MeshFilter>();
        originalMesh = meshFilter.mesh.vertices;
    }

    void OnCollisionEnter(Collision collision) {
        Vector3[] meshCoordinates = originalMesh;
        // Loop through collision points
        foreach (ContactPoint point in collision.contacts) {
            // Index with the closest distance to point.
            int lastIndex = 0;
            // Loop through mesh coordinates
            for (int i = 0; i < meshCoordinates.Length; i++) {
                // Check to see if there is a closer index
                if (Vector3.Distance(point.point, meshCoordinates[i])
                    < Vector3.Distance(point.point, meshCoordinates[lastIndex])) {
                    // Set the new index
                    lastIndex = i;
                }
            }
            // Move the vertex
            meshCoordinates[lastIndex] += /*Insert Rest Of Equation Here*/;
        }
        meshFilter.mesh.vertices = meshCoordinates;
    }

    void Reset() {
        meshFilter.mesh.vertices = originalMesh;
    }
}

引自: http://answers.unity3d.com/questions/962794/mesh-collision-damage.html#answer-966389

I would suggest two options:

Use a random deformation like:

meshCoordinates[lastIndex] += new Vector3(Random.Range(-DeformScale,DeformScale),

Random.Range(-DeformScale,DeformScale), Random.Range(-DeformScale,DeformScale));

Dent inwards by offsetting the vertex by the inverse normal like:

meshCoordinates[lastIndex] -= meshCoordinates[lastIndex].normalized * DeformScale;