在Unity中选择时如何显示立方体上的顶点(运行时)

本文关键字:立方体 Unity 运行时 顶点 显示 选择 何显示 | 更新日期: 2023-09-27 18:19:36

我正试图编写一个脚本,使多维数据集变蓝,并在运行时选中时显示其上的多维数据集顶点。所以基本上,当点击时,它会显示所有的顶点,然后允许用户选择立方体的不同顶点。

这就是我到目前为止所做的,基本上只是把立方体变成蓝色。如何将立方体的顶点显示为球体?我希望以后能够选择这些顶点。

using UnityEngine;
using System.Collections;
public class Cube : MonoBehaviour {
    void OnMouseDown() {
        Renderer rend = GetComponent<Renderer>();
        rend.material.color = Color.blue;
        //insert method to display vertices
    }
}

在Unity中选择时如何显示立方体上的顶点(运行时)

由于立方体和球体都是基元:

你可以找到这样的顶点(假设cubeGameObject):

Vector3[] vertices = cube.GetComponent<MeshFilter>().mesh.vertices;

然后创建球体(需要using System.Linq):

GameObject[] spheres = vertices.Select(vert =>
{
    GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere)
    sphere.transform.position = vert;
    return sphere;
})
.ToArray();

更新:好吧,我现在看到了你的问题,顶点太多了,这就是我要做的,我个人会把阈值设为球体的半径,这样一旦球体开始重叠,它们就会变成一个:

float threshold = 0.1f;
public void CreateSpheres()
{
    List<GameObject> spheres = new List<GameObject>();
    foreach (Vector3 vert in vertices)
    {
        if (spheres.Any(sph => (sph.transform.position - vert) < threshold)) continue;
        GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere)
        sphere.transform.position = vert;
        spheres.Add(sphere);
    }
}

无法使Select函数如前一个示例中所示工作。坐标是使用GetComponent<MeshFilter>.mesh.vertices;找到的,如另一个答案中所述。

void OnMouseDown() {
    Renderer rend = GetComponent<Renderer>();
    rend.material.color = Color.blue;
    Vector3[] vertices = GetComponent<MeshFilter>().mesh.vertices;
    Vector3[] verts = removeDuplicates(vertices);
    drawSpheres(verts);
}

顶点数组包含24个元素,原因如下所示。因此,函数removeDuplicates是为了去除重复的顶点而编写的。此功能如下所示:

Vector3[] removeDuplicates(Vector3[] dupArray) {
    Vector3[] newArray = new Vector3[8];  //change 8 to a variable dependent on shape
    bool isDup = false;
    int newArrayIndex = 0;
    for (int i = 0; i < dupArray.Length; i++) {
        for (int j = 0; j < newArray.Length; j++) {
            if (dupArray[i] == newArray[j]) {
                isDup = true;
            }
        }
        if (!isDup) {
            newArray[newArrayIndex] = dupArray[i];
            newArrayIndex++;
            isDup = false;
        }
    }
    return newArray;
}

最后,使用新的verts阵列绘制球体,使用drawSpheres函数如下所示:

void drawSpheres(Vector3[] verts) {
    GameObject[] Spheres = new GameObject[verts.Length];
    for (int i = 0; i < verts.Length; i++) {
        Spheres[i] = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        Spheres[i].transform.position = verts[i];
        Spheres[i].transform.localScale -= new Vector3(0.8F, 0.8F, 0.8F);
    }
}