ฉันจะสร้างเอฟเฟกสายฟ้าได้อย่างไร


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->SและS->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;
}

ด้วยการแก้ไขRandomSampleและExtendTowardฟังก์ชั่นคุณจะได้รับต้นไม้ที่แตกต่างกันมาก หากRandomSampleตัวอย่างที่สม่ำเสมอทุกที่ต้นไม้จะเติบโตอย่างสม่ำเสมอในทุกทิศทาง หากลำเอียงไปสู่เป้าหมายต้นไม้จะมีแนวโน้มที่จะเติบโตไปสู่เป้าหมาย หากเป็นตัวอย่างเป้าหมายเสมอต้นไม้จะเป็นเส้นตรงตั้งแต่เริ่มต้นจนถึงเป้าหมาย

ExtendTowardช่วยให้คุณสามารถทำสิ่งที่น่าสนใจให้กับต้นไม้ได้เช่นกัน สำหรับสิ่งหนึ่งถ้าคุณมีสิ่งกีดขวาง (เช่นกำแพง) คุณสามารถทำให้ต้นไม้เติบโตรอบตัวพวกเขาได้ง่ายๆโดยการปฏิเสธส่วนขยายที่ชนกับกำแพง

นี่คือสิ่งที่ดูเหมือนว่าเมื่อคุณไม่เอนเอียงไปที่เป้าหมาย:

img
(ที่มา: uiuc.edu )

และนี่คือสิ่งที่ดูเหมือนกับกำแพง

คุณสมบัติเจ๋ง ๆ ของ RRT เมื่อเสร็จแล้ว:

  • RRT จะไม่มีวันข้ามตัวเอง
  • ในที่สุด RRT จะครอบคลุมพื้นที่ทั้งหมดด้วยสาขาที่เล็กกว่าและเล็กกว่า
  • เส้นทางจากจุดเริ่มต้นไปยังเป้าหมายสามารถสุ่มและแปลกอย่างสมบูรณ์

ฉันเพิ่งใช้อัลกอริทึมนี้เพื่อสร้างภาพเคลื่อนไหวสายฟ้าแ ฉันต้องบอกว่ามันใช้งานได้ดีจริงๆ! มีการพิมพ์ผิดที่สำคัญในรหัสเช่น iter จะไม่เพิ่มขึ้นทุกวง นอกจากนี้มันเกือบพร้อมที่จะใช้ตามที่โพสต์
applejacks01
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.