直线到弯曲

时间:2011-05-03 12:09:01

标签: c# graphics procedural-generation heightmap

我正在努力想出一种技术来为流星陨石坑生成高度图。我现在试图保持小而简单,并且有一个简单的算法,其中标记了火山口的中心,并且在其半径内,它周围的像素根据它们与中心的接近程度而着色。

这种方法的问题是生产V形陨石坑,我需要更多“U”形结果。由于使用了正弦波,所以我觉得插值不会很快,因为流星半径内有多少像素。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我假设您有一个纹理或其他图片格式,可以在宽度和高度(x,y)上编制索引,并且该凹坑也在x,y中以x,y在纹理内部给出,这将产生一种算法像这样。

Texture2D texture = ...;
Vector2 craterPosition = new Vector2(50,50);
double maxDistance = Math.Sqrt(Math.Pow(texture.Width,2) + Math.Pow(texture.Height,2));
for(int x = 0; x < texture.Width; x++)
{
    for(int y = 0; y < texture.Height; y++)
    {
        double distance = Math.Sqrt(Math.Pow(x - craterPosition.x, 2) + Math.Pow(y - craterPosition.y, 2));
        //the lower distance is, the more intense the impact of the crater should be
        //I don't know your color scheme, but let's assume that R=0.0f is the lowest point and R = 1.0f is the highest
        distance /= maxDistance;
        double height = (Math.Cos(distance * Math.Pi + Math.Pi) + 1.0) / 2.0;
        texture[x,y] = new Color((float)height,0,0,1);        
    }
}

这里最重要的一行可能是

double height = (Math.Cos(distance * Math.Pi + Math.Pi) + 1.0) / 2.0;

看看余弦曲线http://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Cos.svg/500px-Cos.svg.png它有一个很好的光滑'陨石坑',从Pi到TwoPi四舍五入。由于我们的距离变量从0到1缩放,我们使用距离* Pi + Pi。但是这将给出一个从-1到1的结果。所以我们在最终结果中加1,然后除以2得到0到1之间高度的平滑结果。

我希望这会对你有所帮助。