直线弯曲

问题描述:

我想要想出一个技术来生成一个流星陨石坑的高度图。我现在试图保持小而简单,并且有一个简单的算法,在这个算法中,火山口的中心被标记出来,并且在它的半径内,它周围的像素根据它们的中心有多近而被着色。直线弯曲

这种方法的问题是它产生V形陨石坑,我需要更多'U'形结果。我对使用正弦波不感兴趣,并且我感觉插值不能很快工作,因为流星半径内有多少像素。

有什么建议吗?

我假设你有一个可以在宽度和高度(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它已经从丕四舍五入到TwoPi一个不错的平稳“像火山口”。由于我们的距离变量从0〜1缩放,我们使用距离* Pi + Pi。但是这会给我们一个从-1到1的结果。所以我们给最终结果加1,然后除以2得到0到1之间高度的平滑结果。

我希望这对你有帮助。

+0

非常感谢,这就是我一直在寻找的东西。只需要稍微调整一下,使其看起来像火山口一样=) – 2011-05-03 12:47:43

+0

很高兴我能帮上忙。也许尝试添加一些perlin噪音,以便不是一切都很顺利。而且对于一个非常酷的效果,你还可以考虑小行星来自哪个方向的椭圆形火山口:http://3.bp.blogspot.com/_jiy24EN4vcc/SxMtM7Car3I/AAAAAAAAACw/Na1nImPaY08/s1600/barringer_meteor_crater.jpg – 2011-05-03 14:52:23

+0

如果这很慢,您可以通过删除'Math.Sqrt()'调用来加快速度。这会稍微改变形状,但它仍然是U形的。说'a * a'而不是'Math.Pow(a,2)'可能会更快,尽管我没有测试它。 – LarsH 2011-05-03 21:58:59