我使用CoherentNoise库创建了在Unity中生成的程序地形。生成本身工作得很好,添加到场景中的每个地形对象都能正确生成高度图并应用它们。问题是我生成的噪声从地形对象到地形对象是不连续的,如下图所示。
为每个地形对象生成噪声的函数列在下面
public void GenerateHeightMap() {
for (int z = 0; z < zRes; z++) {
for (int x = 0; x < xRes; x++) {
var xCoord = (float)((size.x * position.x) + x) / (xRes - 1);
var zCoord = (float)((size.z * position.z) + z) / (zRes - 1);
var value = settings.GetModule().GetValue(xCoord, zCoord, 0);
heights[x, z] = (float)(value / 2f) + 0.5f;
}
}
}
快速解释xCoord
和zCoord
:
首先,这些x和z坐标找到它们的起始位置(大小*位置)。然后他们添加循环偏移(x或z)并除以地形的分辨率。理论上,这应该允许噪声生成器抓取相邻地形对象的x,z坐标并返回排列的高度图。
关于为什么这些地形游戏对象不排队的任何想法?
如果有人想看一下整个项目,我已将项目上传到Github,可在其中查看和下载。
答案 0 :(得分:2)
有些东西可疑,因为你的前提并不存在
理论上,这应该允许噪声发生器......
如果你的前提是正确的,那么如果你计算一个坐标,让两个相邻的瓷砖说zCoord
,它应该是相等的。
所以,让我们说position =(0,0),z = zRes(循环的最后一个z元素之后的理论索引) 并与位置(0,1)进行比较,z = 0。
在一个案例中,您最终得到zCoord=zRes / (zRes-1)
,而另一个zCoord=size.z / (zRes-1)
。因此存在差异。
尝试这样的事情(对不起,我旅行,没有团结来试试):
public void GenerateHeightMap() {
for (int z = 0; z < zRes; z++) {
for (int x = 0; x < xRes; x++) {
var xCoord = (float)((size.x * position.x) + x * size.x/xRes) / (xRes - 1);
var zCoord = (float)((size.z * position.z) + z * size.z/zRes) / (zRes - 1);
var value = settings.GetModule().GetValue(xCoord, zCoord, 0);
heights[x, z] = (float)(value / 2f) + 0.5f;
}
}
}
答案 1 :(得分:0)
我最近遇到了类似程序地形生成代码的问题,这就是我如何修复我的不连续性问题:
public void GenerateHeightMap()
{
for (int z = 0; z < zRes; z++)
{
// ratio annotation1 annotation2
var zCoord=((float)z/(float)zRes) + (position.z/size.z)*((zRes-1)/zRes); // place the zCoord here so the calculation won't be repeated (zRes-1) times
for (int x = 0; x < xRes; x++)
{
var xCoord=((float)x/(float)xRes) + (position.x/size.x)*((xRes-1)/xRes);
var value = settings.GetModule().GetValue(xCoord, zCoord, 0);
heights[x, z] = (float)(value / 2f) + 0.5f;
}
}
}
annotation1: 一个按大小划分位置以标准化坐标 (例如:pos(200,50)大小(50,50)表示在此地形和原点之间沿x轴有4个地形,沿z轴有1个地形)
annotation2: 地形的相对坐标不会从0变为1, 但从0到差不多1(因为z只到(zRes-1))。