gpt4 book ai didi

c# - 基于正方形内距离的 yield 递减

转载 作者:太空宇宙 更新时间:2023-11-03 15:27:30 28 4
gpt4 key购买 nike

简而言之,我正在将地形(2d 高度图)从生成的值平滑回到其原始值。

有一个仅使用生成值的 6 单位平坦区域,然后是一个从生成值移回原始值的 3 单位平滑区域(总共 9 个)

在平坦区域中,所有 x、z 值都被分配了一个 y 值,例如 4 那么 3 个平滑单元应该移回零,这意味着 3,然后 2,然后 1,这将使下一步(在如果零是我们的原始数字,则等式)回到 0。

从反复试验来看,我似乎需要分别计算角和边,因为角的最大距离是对角线,即 4.24,而边的最大距离仅为 3。我尝试了很多冗长的方法来到达我所在的位置,但它仍然无法正常工作。不用说,尽管我仍然会说,我不是数学奇才。

谁能比我更善于思考这个问题?

    Vector3 pos = holeCenter - terrain.transform.position;

//flatten area
int posX = Mathf.FloorToInt(pos.x * (td.heightmapResolution / td.size.x));
int posZ = Mathf.FloorToInt(pos.z * (td.heightmapResolution / td.size.z));
float[,] heightMap = td.GetHeights(0, 0, td.heightmapResolution, td.heightmapResolution);
float height = heightMap[posZ, posX];
int modZone = 9;
int flatZone = 6;
for (int x = posX - modZone; x <= posX + modZone; x++) {
for (int z = posZ - modZone; z <= posZ + modZone; z++) {
//if within 6 of cave ent (flat zone)
if (x >= posX - flatZone && x <= posX + flatZone && z >= posZ - flatZone && z <= posZ + flatZone) {
heightMap[z, x] = height + Random.Range(-0.00015f, 0.00015f);
}
//otherwise apply gently to the three rings around the flat area
else {
//if on a corner
bool corner = false;
if (x < posX - flatZone) {
if (z > posZ + flatZone) {
corner = true;
}
else if (z < posZ - flatZone) {
corner = true;
}
}
else if (x > posX + flatZone) {
if (z > posZ + flatZone) {
corner = true;
}
else if (z < posZ - flatZone) {
corner = true;
}
}

if (corner) {
//apply the new height to the old height decreasingly based on distance
float dist = Mathf.Sqrt(Mathf.Pow(Mathf.Abs(posX - x) - flatZone, 2f) +
Mathf.Pow(Mathf.Abs(posZ - z) - flatZone, 2f));
float maxDist = Mathf.Sqrt(Mathf.Pow(modZone - flatZone, 2f) * 2);
float multiplier = dist / maxDist;
heightMap[z, x] = (heightMap[z, x] * multiplier) + (height * (1 - multiplier)) + Random.Range(-0.00015f, 0.00015f);
}
else { //for an edge, only one value is in the modZone, find which, then apply
if (x < posX - flatZone || x > posX + flatZone) {
float multiplier = (Mathf.Abs(x - posX) - flatZone) / 4f;
heightMap[x, z] = (heightMap[z, x] * multiplier) + (height * (1 - multiplier)) + Random.Range(-0.00015f, 0.00015f);
}
else {
float multiplier = (Mathf.Abs(z - posZ) - flatZone) / 4f;
heightMap[x, z] = (heightMap[z, x] * multiplier) + (height * (1 - multiplier)) + Random.Range(-0.00015f, 0.00015f);
}
}
}
}
}
td.SetHeights(0, 0, heightMap);

最佳答案

回来后我让它工作了。

    int modZone = 11;
int flatZone = 7;
for (int x = posX - modZone; x <= posX + modZone; x++) {
for (int z = posZ - modZone; z <= posZ + modZone; z++) {
float dist = Mathf.Sqrt(Mathf.Pow(Mathf.Abs(x - posX), 2f) + Mathf.Pow(Mathf.Abs(z - posZ), 2f));
if (dist <= flatZone) { heightMap[z, x] = height + Random.Range(-0.00015f, 0.00015f); }
else {
float multiplier = Mathf.Clamp01((modZone - dist) / (modZone - flatZone));
heightMap[z, x] = (heightMap[z, x] * (1 - multiplier)) + ((height + Random.Range(0, 0.0003f)) * multiplier);
}
}
}

我放弃了方形方法,但效果很好,圆形方法也很好用。也可能会更好地应对更多不同的情况。

关于c# - 基于正方形内距离的 yield 递减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34636201/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com