在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
}
}
由于立方体和球体都是基元:
你可以找到这样的顶点(假设cube
是GameObject
):
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);
}
}