너비와 높이 (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로 나눕니다.
이 도움이 되었기를 바랍니다.
정말 고마워요. 내가 찾고 있던 것과 정확히 같습니다. 가능하다면 분화구처럼 보이게하기 위해 지금 약간 조정할 필요가 있습니다.) –
기꺼이 도와 드리겠습니다. 어쩌면 펄린 노이즈를 추가하여 모든 것이 부드럽 지 않도록하십시오. 그리고 정말 멋진 효과를 얻으려면 소행성이 더 타원형의 분화구가있는 방향으로 나아갈 수 있습니다. http://3.bp.blogspot.com/_jiy24EN4vcc/SxMtM7Car3I/AAAAAAAAww/Na1nImPaY08/s1600/barringer_meteor_crater.jpg –
이것이 느린 경우,'Math.Sqrt()'호출을 제거함으로써 처리 속도를 높일 수 있습니다. 이렇게하면 모양이 약간 바뀌지 만 여전히 U 자형이됩니다. 아직 테스트하지는 않았지만'Math.Pow (a, 2) '대신'a * a'라고 말하는 것이 더 빠를 수도 있습니다. – LarsH