我想做这样的视频。 https://www.youtube.com/watch?v=ioiaDXOI6zI
我希望能够使用鼠标或键盘输入变形网格并改变形状。我正在寻找一种轻松的方法来完成这项工作,因为每次我更改顶点时都会创建一个在性能方面非常重的新网格。我也想比较两个网格,如果它们相似或不相似但我坚持这个,会感谢任何帮助或指导。感谢
到目前为止,这是我的代码:
public class MeshDeformation: MonoBehaviour {
MeshFilter mf;
Vector3[] verts;
public Vector3 value = new Vector3(0.01f,0.01f,0.01f);
void Start () {
mf = GetComponent<MeshFilter>();
verts = mf.mesh.vertices;
Debug.Log("Vertices" + verts.Length);
}
// Update is called once per frame
void Update () {
if(Input.GetMouseButton(0))
{
RaycastHit hit;
Vector3 input = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray,out hit, 300))
{
Vector3 hitVertices = FindNearestPoint(hit.point);
RaisePoint(hitVertices,value);
Debug.Log("coming inside");
}
}
}
private Vector3 FindNearestPoint(Vector3 point)
{
Vector3 NearestPoint = new Vector3();
float lastDistance = 99999999f;
for (int i = 0; i < verts.Length; i++)
{
float distance = GetDistance(point, verts[i]);
if (distance < lastDistance)
{
lastDistance = distance;
NearestPoint = verts[i];
}
}
return NearestPoint;
}
private float GetDistance(Vector3 start, Vector3 end)
{
return Mathf.Sqrt(Mathf.Pow((start.x - end.x), 2) + Mathf.Pow((start.y - end.y), 2) + Mathf.Pow((start.z - end.z), 2));
}
private void RaisePoint(Vector3 point, Vector3 val)
{
int index = -1;
for (int i = 0; i < verts.Length; i++)
{
if (verts[i] == point)
{
index = i;
break;
}
}
if (index == -1)
{
Debug.LogError("Could not match points");
}
else
{
Vector3 newPoint = verts[index];
newPoint += val;
verts[index] = newPoint;
// mf.mesh.Clear();
mf.mesh.vertices = verts;
mf.mesh.RecalculateNormals();
mf.mesh.RecalculateBounds();
}
}
}
答案 0 :(得分:1)
您希望按照Mesh documentation:
中的方式执行方案2
- 每帧修改顶点属性:
醇>
a)获得顶点
b)修改它们 c)将它们分配回网格。
因此,您根本不需要Clear()
调用(您现在已将其注释掉,但它不需要,仅包含在场景3中)。
同样,RecalculateNormals()
和RecalculateBounds()
可能相当密集。在用户释放鼠标按钮之前,您可能希望延迟执行这些操作。在修改过程中,网格会有不正确的阴影,但这可能是一种可接受的损失。
否则,您的代码看起来非常接近文档中的示例。
另请注意,Debug.Log(...)引入了相当大的开销,并且每帧调用它可能也会减慢速度。尝试对这些内容进行评论,看看您的性能问题是否消失,并与删除重新计算命令进行比较。