2011-05-03 2 views
1

나는 유성 분화구에 대한 높이지도를 생성하는 기술을 고안하려고합니다. 나는 작고 단순하게 유지하려고 노력하고 있으며, 분화구의 중심이 표시되어있는 간단한 알고리즘을 가지고 있습니다. 그리고 그 반경 내에서, 주변의 픽셀은 중심에 얼마나 가까운 지에 따라 색상이 지정되어 있습니다.직선에서 곡선으로

이 방법의 문제점은 V 자형 크레이터가 생성된다는 것입니다. 더 많은 'U'자 모양의 결과가 필요합니다. 나는 사인파의 사용에 비할 바가 없으며 유성 반경 안에 얼마나 많은 픽셀이있을 수 있는지를 고려해 보았을 때 느낌 보간이 매우 빨리 작동하지는 않습니다.

제안 사항?

답변

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; 

그것이 TwoPi에 파이에서 반올림 편안한 부드러운 '와 같은 분화구'가 http://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Cos.svg/500px-Cos.svg.png 코사인 곡선을 살펴보십시오입니다. distance 변수는 0에서 1로 스케일링되므로 distance * Pi + Pi를 사용합니다. 그러나 이것은 -1에서 1로 결과를 줄 것입니다. 그래서 우리는 최종 결과에 1을 더하고 0에서 1 사이의 높이에 대해 부드러운 결과를 얻기 위해 2로 나눕니다.

이 도움이 되었기를 바랍니다.

+0

정말 고마워요. 내가 찾고 있던 것과 정확히 같습니다. 가능하다면 분화구처럼 보이게하기 위해 지금 약간 조정할 필요가 있습니다.) –

+0

기꺼이 도와 드리겠습니다. 어쩌면 펄린 노이즈를 추가하여 모든 것이 부드럽 지 않도록하십시오. 그리고 정말 멋진 효과를 얻으려면 소행성이 더 타원형의 분화구가있는 방향으로 나아갈 수 있습니다. http://3.bp.blogspot.com/_jiy24EN4vcc/SxMtM7Car3I/AAAAAAAAww/Na1nImPaY08/s1600/barringer_meteor_crater.jpg –

+0

이것이 느린 경우,'Math.Sqrt()'호출을 제거함으로써 처리 속도를 높일 수 있습니다. 이렇게하면 모양이 약간 바뀌지 만 여전히 U 자형이됩니다. 아직 테스트하지는 않았지만'Math.Pow (a, 2) '대신'a * a'라고 말하는 것이 더 빠를 수도 있습니다. – LarsH

관련 문제