滤网外观损坏
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;
目前正在尝试编写一个脚本,该脚本允许球在通过关卡时受到装饰性网格物体的损坏。问题是,我一直无法找到移动顶点的正确方程。
这是我目前所拥有的
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;