【发布时间】:2017-01-15 10:25:44
【问题描述】:
我正在尝试制作一个接收高度图的函数,然后根据输入创建单个等距网格。我得到它来相当容易地制作代表立方体顶部的三角形,但是让它沿着立方体的侧面下降是我似乎遇到麻烦的地方。该功能不完整,并且在完成之前遇到了麻烦,只制作了两个方面。
基本上似乎正在发生的事情是一些三角形被翻转,而另一些则没有,我不知道为什么。您可以看到有些边的两个三角形都朝向相同的方向,而另一些边只有一个三角形可见,因为正方形的第二个朝向另一个方向。
它似乎偶尔也会制作一个正方形,从网格的一侧延伸到另一侧,留下那些长线。
总的来说,我对网格和 3d 非常陌生,尽管这比实际情况要容易得多。我也很确定我映射 UV 的方式是完全错误的,但那将在以后出现。
public static MeshData generateIsoMesh(float [,] heightMap, int heightMax, AnimationCurve heightCurve)
{
int height = heightMap.GetLength(0);
int width = heightMap.GetLength(1);
int triangleNum = 0;
int blockHeight = 0 ;
int nextHeight = 0;
int heightDif = 0;
List<Vector3> vecList = new List<Vector3>();
List<int> triangleList = new List<int>();
List<Vector2> uvList = new List<Vector2>();
for (int y = 0; y < height; y ++)
{
for (int x = 0; x < width; x ++)
{
blockHeight = ((int)(heightMap[x, y]*10)) * heightMax;
vecList.Add(new Vector3(x, blockHeight , y));
vecList.Add(new Vector3(x, blockHeight, y+ 1));
vecList.Add(new Vector3(x+1, blockHeight, y+1));
vecList.Add(new Vector3(x + 1, blockHeight, y));
uvList.Add(new Vector2(x / (float)width, y / (float)height));
uvList.Add(new Vector2(x / (float)width, y / (float)height));
uvList.Add(new Vector2(x / (float)width, y / (float)height));
uvList.Add(new Vector2(x / (float)width, y / (float)height));
if ((x < width-1) && (y < height-1))
{
triangleList.Add(triangleNum);
triangleList.Add(triangleNum + 1);
triangleList.Add(triangleNum + 2);
triangleList.Add(triangleNum );
triangleList.Add(triangleNum + 2 );
triangleList.Add(triangleNum + 3);
triangleNum += 4;
}
if (x < width-1 && x > 3 && x > 0)
{
nextHeight = ((int)(heightMap[x+1,y]*10)) * heightMax;
heightDif = (nextHeight - blockHeight)/heightMax;
if (heightDif > 0)
{
for (int z = 0; z < heightDif; z ++)
{
uvList.Add(new Vector2(x / (float)width, y / (float)height));
uvList.Add(new Vector2(x / (float)width, y / (float)height));
vecList.Add(new Vector3(x + 1, blockHeight - (1 + z), y));
vecList.Add(new Vector3(x + 1, blockHeight - (1 + z), y + 1));
triangleList.Add(triangleNum - 1);
triangleList.Add(triangleNum - 2);
triangleList.Add(triangleNum + 1);
triangleList.Add(triangleNum - 1);
triangleList.Add(triangleNum + 1);
triangleList.Add(triangleNum );
triangleNum += 4;
}
}
else if (heightDif < 0)
{
;
}
}
}
}
输出网格:和没有执行降级代码的循环的相同网格
感谢您的所有帮助。 https://imageshack.us/i/poHdrZFmp
【问题讨论】: