번개 효과를 만들려면 어떻게해야합니까?


26

번개를 생성하는 알고리즘이 있습니까?

볼트가 착륙하는 위치를 지정하는 세그먼트 또는 점 객체 목록을 생성하는 알고리즘을 원합니다. 이 방법에는 엔드 포인트와 함께 시작점 매개 변수가 필요합니다. 볼트에는 임의의 가지가 떨어지고 임의의 간격으로 지그재그가 있어야합니다. 결과는 다음과 같은 임의의 번개 효과가됩니다.


(출처 : wikimedia.org )

누구나 이것이 작동 할 수있는 알고리즘을 알고 있다면 도움을 주시면 감사하겠습니다!


2
Nvidia가 작성한이 논문은 너무 광범위 할 수 있지만 필요한 것이어야합니다. 슬라이드 7 ~ 11을 확인하면 목표를 정할 수있는 좋은 정보를 얻을 수 있습니다. 두 번째 링크를 따르면 소스 코드 (C ++, Direct3D)를 찾을 수 있습니다. developer.download.nvidia.com/SDK/10/direct3d/Source/Lightning/… developer.download.nvidia.com/SDK/10/direct3d/samples.html
오류

답변:


32

조명 볼트를 생성하는 데 사용할 수있는 매우 간단한 알고리즘이 있습니다.

상기 볼트의 원점 사이의 선분 (시작 O() 및 엔드 포인트 E)

해당 선에서 점 (대략 또는 정확히 중간)을 선택 S하고 선분을 선 선분 ( O->SS->E) 으로 분할합니다 . 작은 선량으로 S원래 선 세그먼트 (세그먼트의 법선을 따라)에서 멀어지게합니다. 이것은 당신에게 하나의 번개의 굴곡을 제공합니다.

굽힘을 계산 한 후 작은 임의 확률을 기반으로 세 번째 선 세그먼트 (일반적으로 세그먼트의 확장) 를 추가 할 수 있습니다 O->S. 이것이 번개에서 "포크"를 만드는 방법입니다. 포크는 더 어둡게 또는 더 미묘하게 흐리게하기를 원하기 때문에 일반적으로이 생성 과정에서 볼트의 강도에 대한 정보를 추적하려고합니다.

여기에 이미지 설명을 입력하십시오

그런 다음 가지고있는 모든 새 선분에 대해 위의 과정을 반복하십시오. 원하는 모양을 생성하는 반복 량을 선택해야합니다.

여기에 이미지 설명을 입력하십시오

여기 친구의 블로그 에이 기술에 대한 명확한 설명이 있습니다 ( 여기 에서 나는 사진을 뻔뻔스럽게 훔쳤습니다). 글로우 효과를 추가하는 방법에 대한 깊이도 더해집니다.

마지막으로, 동일한 기본 알고리즘 (자세한 내용도 포함) 을 설명하는NVIDIA 문서 도 있습니다.


13

다른 방법을 권장합니다. 빠르게 탐색하는 임의 트리 (RRT) . 한 가지 멋진 점은 모서리를 돌거나 모든 방향으로 폭발 할 수 있다는 것입니다.

알고리즘은 정말 기본입니다 :

// Returns a random tree containing the start and the goal.
// Grows the tree for a maximum number of iterations.
Tree RRT(Node start, Node goal, int maxIters)
{
    // Initialize a tree with a root as the start node.
    Tree t = new Tree();
    t.Root = start;


    bool reachedGoal = false;
    int iter = 0;

    // Keep growing the tree until it contains the goal and we've
    // grown for the required number of iterations.
    while (!reachedGoal || iter < maxIters)
    {
         // Get a random node somewhere near the goal
         Node random = RandomSample(goal);
         // Get the closest node in the tree to the sample.
         Node closest = t.GetClosestNode(random);
         // Create a new node between the closest node and the sample.
         Node extension = ExtendToward(closest, random);
         // If we managed to create a new node, add it to the tree.
         if (extension)
         {
             closest.AddChild(extension);

             // If we haven't yet reached the goal, and the new node
             // is very near the goal, add the goal to the tree.
             if(!reachedGoal && extension.IsNear(goal))
             {
                extension.AddChild(goal);
                reachedGoal = true;
             }
         }
         iter++;
    }
    return t;
}

RandomSampleExtendToward기능 을 수정하면 매우 다른 트리를 얻을 수 있습니다. 경우 RandomSample단지 균일하게 샘플 모든 곳에서, 나무는 모든 방향으로 균일하게 성장할 것입니다. 목표를 향해 편향되면 나무는 목표를 향해 자라는 경향이 있습니다. 항상 목표를 샘플링하면 시작부터 목표까지 직선이됩니다.

ExtendToward나무에 흥미로운 일을 할 수 있습니다. 우선, 벽과 같은 장애물이있는 경우 벽 과 충돌하는 확장을 거부 하여 나무가 그 주변 에서 자라는 것을 얻을 수 있습니다 .

목표를 향해 샘플링을 바이어스하지 않을 때의 모습입니다.

img
(출처 : uiuc.edu )

그리고 여기 벽이있는 모습이 있습니다.

RRT가 완료되면 몇 가지 멋진 속성 :

  • RRT는 절대 교차하지 않습니다
  • RRT는 결국 작고 작은 가지로 전체 공간을 덮을 것입니다
  • 시작부터 목표까지의 경로는 완전히 임의적이며 이상 할 수 있습니다.

방금이 알고리즘을 사용하여 번개 애니메이션을 생성했습니다. 나는 그것이 정말로 잘 작동했다고 말해야한다! 루프마다 증가하지 않는 것과 같은 코드에는 큰 오타가 있습니다. 이 게시로 사용할 준비가 거의 것을 제외하고
applejacks01
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.