unity 3D Mesh 在同一个Y轴Height上寻找对齐的顶点
Unity 3D Mesh Find aligning vertices on the same Y axis Height
我试图从一个选定的顶点中查找相邻顶点。这些相邻顶点必须满足的一个条件是它们必须与选定的原始顶点处于相同的高度。
我有一个 int[] vertices
数组,还有一个 Dictionary<int, float> plateauDictionary
.
顶点数组包含整个网格的所有顶点。
字典包含高度(y 轴)大于 0.2f 的顶点集合。
我正在创建大的平坦高原,因此找到相同高度的相邻顶点应该很容易,因为大多数顶点在相同高度彼此相邻。
这是我到目前为止写的:
Matrix4x4 localToWorld = transform.localToWorldMatrix;
Vector3[] worldVectors = new Vector3[totalVertices];
foreach (KeyValuePair<int, float> u in plateauDictionary)
worldVectors[u.Key] = localToWorld.MultiplyPoint3x4(mesh.vertices[u.Key]);
这个 returns 一个由每个顶点的所有世界位置组成的 Vector3 数组。
现在我想随机选择一个或几个,然后获取相同高度的相邻顶点的数量,可能在指定的半径内,也可能在邻居列表中?我该如何解决这个问题?我是 LINQ 的新手,但我认为这可能是可行的方法?
提前致谢!
我的其他代码(对于这个问题不是很重要,但为了完整起见):
plateauDictionary = new Dictionary<int, float>();
for (int j = 0; j < plateaus; j++)
{
var rndSize = plateauSizes[Random.Range(0, plateauSizes.Length)];
var rndHeight = plateauHeights[Random.Range(0, plateauHeights.Length)];
var rndVertex = ((xSize + 2) + (Random.Range(0, xSize - rndSize - 1) * (xSize + 1))) +
Random.Range(0, xSize - rndSize - 1);
plateauVertexArray = new int[rndSize * rndSize];
for (int k = 0, i = 0; k < rndSize; k++)
{
for (int l = 0; l < rndSize; l++, i++)
{
plateauVertexArray[i] = (rndVertex + ((xSize + 1) * k)) + l;
if (!plateauDictionary.ContainsKey(plateauVertexArray[i]))
plateauDictionary.Add(plateauVertexArray[i], rndHeight);
您可以将剩余的 worldVectors.y 值与您选择的 selectedWorldVector.y 值进行比较。我不知道 linq,但我认为如果你想避免 if else 意大利面条代码,它是一个不错的选择。
除此之外,您还可以在每个顶点世界位置实例化一个空对象,为每个对象添加一个空盒碰撞器,然后使用来自您的 selectedWorldVector 位置的 Raycast.SphereCastAll()
。在 SphereCast 中设置您的半径以查看每个接近的顶点,然后过滤掉太 low/high.
的那些
我试图从一个选定的顶点中查找相邻顶点。这些相邻顶点必须满足的一个条件是它们必须与选定的原始顶点处于相同的高度。
我有一个 int[] vertices
数组,还有一个 Dictionary<int, float> plateauDictionary
.
顶点数组包含整个网格的所有顶点。 字典包含高度(y 轴)大于 0.2f 的顶点集合。
我正在创建大的平坦高原,因此找到相同高度的相邻顶点应该很容易,因为大多数顶点在相同高度彼此相邻。
这是我到目前为止写的:
Matrix4x4 localToWorld = transform.localToWorldMatrix;
Vector3[] worldVectors = new Vector3[totalVertices];
foreach (KeyValuePair<int, float> u in plateauDictionary)
worldVectors[u.Key] = localToWorld.MultiplyPoint3x4(mesh.vertices[u.Key]);
这个 returns 一个由每个顶点的所有世界位置组成的 Vector3 数组。
现在我想随机选择一个或几个,然后获取相同高度的相邻顶点的数量,可能在指定的半径内,也可能在邻居列表中?我该如何解决这个问题?我是 LINQ 的新手,但我认为这可能是可行的方法?
提前致谢!
我的其他代码(对于这个问题不是很重要,但为了完整起见):
plateauDictionary = new Dictionary<int, float>();
for (int j = 0; j < plateaus; j++)
{
var rndSize = plateauSizes[Random.Range(0, plateauSizes.Length)];
var rndHeight = plateauHeights[Random.Range(0, plateauHeights.Length)];
var rndVertex = ((xSize + 2) + (Random.Range(0, xSize - rndSize - 1) * (xSize + 1))) +
Random.Range(0, xSize - rndSize - 1);
plateauVertexArray = new int[rndSize * rndSize];
for (int k = 0, i = 0; k < rndSize; k++)
{
for (int l = 0; l < rndSize; l++, i++)
{
plateauVertexArray[i] = (rndVertex + ((xSize + 1) * k)) + l;
if (!plateauDictionary.ContainsKey(plateauVertexArray[i]))
plateauDictionary.Add(plateauVertexArray[i], rndHeight);
您可以将剩余的 worldVectors.y 值与您选择的 selectedWorldVector.y 值进行比较。我不知道 linq,但我认为如果你想避免 if else 意大利面条代码,它是一个不错的选择。
除此之外,您还可以在每个顶点世界位置实例化一个空对象,为每个对象添加一个空盒碰撞器,然后使用来自您的 selectedWorldVector 位置的 Raycast.SphereCastAll()
。在 SphereCast 中设置您的半径以查看每个接近的顶点,然后过滤掉太 low/high.