2011-05-03 160 views
1

我想要想出一個技術來生成一個流星隕石坑的高度圖。我現在試圖保持小而簡單,並且有一個簡單的算法,在這個算法中,火山口的中心被標記出來,並且在它的半徑內,它周圍的像素根據它們的中心有多近而被着色。直線彎曲

這種方法的問題是它產生V形隕石坑,我需要更多'U'形結果。我對使用正弦波不感興趣,並且我感覺插值不能很快工作,因爲流星半徑內有多少像素。

有什麼建議嗎?

回答

2

我假設你有一個可以在寬度和高度(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