मैं एक बिजली बोल्ट प्रभाव कैसे उत्पन्न कर सकता हूं?


26

क्या बिजली के बोल्ट को उत्पन्न करने के लिए एक एल्गोरिथ्म है?

मैं एक एल्गोरिथ्म चाहूंगा जो खंड या बिंदु वस्तुओं की एक सूची तैयार करता है जो निर्दिष्ट करता है कि बोल्ट कहां उतरेगा। विधि को एक समापन बिंदु के साथ, स्टार्ट पॉइंट पैरामीटर की आवश्यकता होगी। बोल्ट में यादृच्छिक शाखाएं होनी चाहिए, और यादृच्छिक अंतराल पर zig-zag। परिणाम एक यादृच्छिक बिजली प्रभाव होगा जो कुछ इस तरह दिखाई देगा


(स्रोत: wikimedia.org )

अगर किसी को एक एल्गोरिथ्म का पता है कि यह काम कर सकता है, तो मदद की बहुत सराहना की जाएगी!


2
एनवीडिया का यह पेपर सिर्फ वही होना चाहिए जो आपको चाहिए, हालांकि यह थोड़ा बहुत व्यापक हो सकता है। स्लाइड 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->Sऔर S->E) में विभाजित करें । Sकुछ छोटी यादृच्छिक राशि द्वारा मूल रेखा खंड (खंड के सामान्य के साथ) से विस्थापित करें । यह आपको बिजली की एक "मोड़" देता है।

आपके द्वारा मोड़ की गणना करने के बाद, एक छोटे यादृच्छिक अवसर के आधार पर आप तीसरी पंक्ति खंड (आमतौर पर खंड का एक विस्तार O->S) जोड़ना चाहते हैं । इस तरह आप बिजली में "कांटे" का उत्पादन करते हैं। आप आमतौर पर इस पीढ़ी की प्रक्रिया के दौरान बोल्ट की तीव्रता के बारे में जानकारी ट्रैक करना चाहते हैं, क्योंकि आप चाहते हैं कि कांटे धुंधले हों या अधिक सूक्ष्म धब्बा हो:

यहाँ छवि विवरण दर्ज करें

फिर, आपके पास नई पंक्ति के सभी खंडों के लिए उपरोक्त प्रक्रिया दोहराएं; आपको एक पुनरावृत्ति राशि चुनने की आवश्यकता होगी जो आपके जैसे आकार का निर्माण करती है:

यहाँ छवि विवरण दर्ज करें

मेरे मित्र के ब्लॉग पर इस तकनीक की काफी स्पष्ट व्याख्या है (यह वह जगह है जहां मैं बेशर्मी से चित्र चुरा लेता हूं); यह चमक प्रभाव को जोड़ने के बारे में अतिरिक्त गहराई में चला जाता है।

अंत में, यह NVIDIA पेपर भी है जो एक ही मूल एल्गोरिदम का वर्णन करता है (अधिक विवरण के साथ) का ।


13

मैं एक वैकल्पिक दृष्टिकोण की सिफारिश करूंगा: तेजी से तलाशने वाले यादृच्छिक पेड़ (आरआरटी) । इसके बारे में एक अच्छी बात यह है कि आप इसे कोनों के चारों ओर जाने के लिए, या सभी दिशाओं में विस्फोट कर सकते हैं।

एल्गोरिथ्म वास्तव में बुनियादी है:

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

RandomSampleऔर संशोधन करकेExtendToward कार्यों , आप बहुत अलग पेड़ प्राप्त कर सकते हैं। यदि RandomSampleहर जगह समान रूप से नमूने हैं, तो पेड़ सभी दिशाओं में समान रूप से बढ़ेगा। यदि इसका लक्ष्य के प्रति पक्षपाती है, तो पेड़ लक्ष्य की ओर बढ़ने लगेगा। यदि यह हमेशा लक्ष्य का नमूना लेता है, तो पेड़ शुरू से लक्ष्य तक एक सीधी रेखा होगी।

ExtendTowardआप के रूप में अच्छी तरह से पेड़ के लिए दिलचस्प बातें करने की अनुमति दे सकते हैं। एक बात के लिए, यदि आपके पास बाधाएं हैं (जैसे कि दीवारें), तो आप पेड़ को बढ़ने के लिए प्राप्त कर सकते हैं चारों ओर दीवारों से टकराते हैं।

जब आप लक्ष्य की ओर नमूनाकरण नहीं करते हैं तो यह ऐसा दिखता है:

img
(स्रोत: uiuc.edu )

और यहां दीवारों के साथ क्या दिखता है

RRT के कुछ शांत गुण एक बार इसके समाप्त हो जाने के बाद:

  • आरआरटी कभी खुद को पार नहीं करेगा
  • आरआरटी ​​अंततः पूरी जगह को छोटी और छोटी शाखाओं के साथ कवर करेगा
  • शुरू से लक्ष्य तक का रास्ता पूरी तरह से यादृच्छिक और अजीब हो सकता है।

मैंने अभी इस एल्गोरिथ्म का उपयोग एक बिजली के बोल्ट एनीमेशन को उत्पन्न करने के लिए किया है। मुझे कहना होगा कि यह वास्तव में अच्छी तरह से काम किया! कोड में एक प्रमुख टाइपो है, जैसे कि हर लूप को बढ़ाया नहीं जा रहा है। इसके अलावा यह लगभग पोस्ट के रूप में उपयोग करने के लिए तैयार है
Applejacks01
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.