Bir şimşek etkisi nasıl üretebilirim?


26

Şimşek üretmek için bir algoritma var mı?

Cıvatanın nereye ineceğini belirten bir parça veya nokta nesnesi listesi üreten bir algoritma istiyorum. Yöntemin bir bitiş noktasıyla birlikte bir başlangıç ​​noktası parametresine ihtiyacı olacaktır. Cıvatanın içinden rastgele dallar çıkması ve rastgele aralıklarla zig-zag olması gerekir. Sonuç, bu şekilde görünecek rastgele bir yıldırım etkisi olacak


(kaynak: wikimedia.org )

Bunun işe yarayabileceği bir algoritma bilen birileri varsa, yardım çok takdir edilecektir!


2
Nvidia'nın bu makalesi tam ihtiyacınız olan şey olmalı, ancak biraz fazla kapsamlı olabilir. 7'den 11'e kadar olan slaytları kontrol edin, size neyi hedefleyeceğine dair bir fikir vermesi gereken güzel kenarlara sahipler. İkinci bağlantıyı takip ederseniz, kaynak kodunu (C ++, Direct3D) bulacaksınız. developer.download.nvidia.com/SDK/10/direct3d/Source/Lightning/… developer.download.nvidia.com/SDK/10/direct3d/samples.html
hatası

Yanıtlar:


32

Aydınlatma cıvataları oluşturmak için kullanabileceğiniz oldukça basit bir algoritma var.

Cıvatanın orijini ( O) ile bitiş noktası ( E) arasında bir çizgi parçası ile başlayın.

Bu çizgiden bir nokta seçin (yaklaşık olarak veya tam olarak ortada), adı verin Sve segmenti iki çizgi segmentine ( O->Sve S->E) bölün . Yerini Sbazı küçük rasgele miktarda (kademeli normal birlikte) orijinal çizgi parçasının uzak. Bu size tek bir yıldırım çarpması verir.

Bükümü hesapladıktan sonra, rastgele bir şans esasına dayanarak, üçüncü bir çizgi segmenti eklemek istersiniz (genellikle parçanın bir uzantısı O->S). Yıldırımda “çatalları” böyle üretiyorsunuz. Bu nesil işlem sırasında genellikle cıvatanın yoğunluğuyla ilgili bilgileri izlemek isteyeceksiniz, çünkü çatalların daha kısık olmasını veya daha ince bir bulanıklığa sahip olmasını isteyeceksiniz:

görüntü tanımını buraya girin

Ardından, sahip olduğunuz tüm yeni hat segmentleri için yukarıdaki işlemi tekrarlayın; İstediğiniz şekilleri üreten bir tekrar miktarı seçmeniz gerekir:

görüntü tanımını buraya girin

Arkadaşımın blogunda bu tekniğin oldukça açık bir açıklaması var (oradaki fotoğrafları utanmadan çaldım); parlama efekti ekleme konusunda ek derinliğe de iner.

Son olarak, aynı temel algoritmayı tanımlayan bu NVIDIA kağıdı da var (ayrıca daha fazla ayrıntıyla).


13

Alternatif bir yaklaşım öneriyorum: Hızla keşfedilen rastgele ağaç (RRT) . Bununla ilgili güzel bir şey, köşelerde dolaşma ya da her yöne patlayabilmeniz.

Algoritma gerçekten çok basit:

// 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;
}

RandomSampleVe ExtendTowardişlevlerini değiştirerek, çok farklı ağaçlar elde edebilirsiniz. Her RandomSampleyerde eşit şekilde örneklenirse, ağaç her yöne eşit şekilde büyür. Hedefe yönelik önyargılı ise, ağaç hedefe doğru büyüme eğiliminde olacaktır. Her zaman hedefi hedeflerse, ağaç baştan hedefe doğru düz bir çizgi olacaktır.

ExtendTowardAğaca da ilginç şeyler yapmanıza izin verebilir. Birincisi, eğer engelleriniz varsa (duvarlar gibi), ağacın etraflarında , duvarlarla çarpışan uzantıları reddederek büyümesini sağlayabilirsiniz.

Bu, örneklemeyi hedefe doğru yöneltmediğinizde görünen şey:

img
(kaynak: uiuc.edu )

Ve işte duvarlarda nasıl göründüğü

RRT'nin bazı harika özellikleri tamamlandığında:

  • RRT kendini asla geçmeyecek
  • RRT sonunda tüm alanı daha küçük ve daha küçük dallarla kaplar.
  • Baştan hedefe giden yol tamamen rastgele ve tuhaf olabilir.

Bu algoritmayı şimşek işareti animasyonu üretmek için kullandım. Gerçekten iyi çalıştığını söylemeliyim! Kodda, her döngüde artırılmaması gibi büyük bir yazım hatası vardır. Bunun dışında bu neredeyse yayınlanan olarak kullanıma hazır
applejacks01
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.