程序生成的地形不与邻近地形对齐
Procedural generated terrain not lining up with neighboring terrain
我使用 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坐标找到它们的起始生成位置(size * position)。然后他们添加循环偏移(x 或 z)并除以地形分辨率。理论上,这应该允许噪声生成器获取相邻地形对象的 x、z 坐标和 return 对齐的高度图。
关于为什么这些地形游戏对象不排列的任何想法?
如果有人想看一下整个项目,我已经将项目上传到 Github 那里可以查看和下载。
有些可疑,因为你的前提不成立
In theory, this should allow the noise generator...
如果你的前提是正确的,那么如果你计算一个坐标,比如说 zCoord
对于两个相邻的图块,它应该是相等的。
所以,假设 position=(0,0),z=zRes(循环的最后一个 z 元素之后的理论索引)
并与 position(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;
}
}
}
我的程序地形生成代码最近遇到了类似的问题,这就是它解决我的不连续问题的方法:
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;
}
}
}
注释1:
一个按大小划分位置以标准化坐标
(例如:pos(200,50) size(50,50) 表示在这个地形和原点之间有 4 个地形沿 x 轴和 1 个地形沿 z 轴)
注释2:
地形的相对坐标不会从 0 到 1,
但是从 0 到几乎 1(因为 z 只到(zRes-1))。
我使用 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坐标找到它们的起始生成位置(size * position)。然后他们添加循环偏移(x 或 z)并除以地形分辨率。理论上,这应该允许噪声生成器获取相邻地形对象的 x、z 坐标和 return 对齐的高度图。
关于为什么这些地形游戏对象不排列的任何想法?
如果有人想看一下整个项目,我已经将项目上传到 Github 那里可以查看和下载。
有些可疑,因为你的前提不成立
In theory, this should allow the noise generator...
如果你的前提是正确的,那么如果你计算一个坐标,比如说 zCoord
对于两个相邻的图块,它应该是相等的。
所以,假设 position=(0,0),z=zRes(循环的最后一个 z 元素之后的理论索引) 并与 position(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;
}
}
}
我的程序地形生成代码最近遇到了类似的问题,这就是它解决我的不连续问题的方法:
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;
}
}
}
注释1: 一个按大小划分位置以标准化坐标 (例如:pos(200,50) size(50,50) 表示在这个地形和原点之间有 4 个地形沿 x 轴和 1 个地形沿 z 轴)
注释2: 地形的相对坐标不会从 0 到 1, 但是从 0 到几乎 1(因为 z 只到(zRes-1))。