Làm thế nào tôi có thể tạo ra một hiệu ứng tia sét?


26

Có một thuật toán để tạo ra một tia sét?

Tôi muốn một thuật toán tạo ra một danh sách các đối tượng phân đoạn hoặc điểm chỉ định nơi bu lông sẽ hạ cánh. Phương thức sẽ cần một tham số điểm bắt đầu, cùng với điểm cuối. Bu lông nên có các nhánh ngẫu nhiên đi ra và zig-zag theo các khoảng thời gian ngẫu nhiên. Kết quả sẽ là một hiệu ứng sét ngẫu nhiên trông giống như thế này


(nguồn: wikidia.org )

Nếu bất cứ ai biết về một thuật toán mà điều này có thể làm việc, sự giúp đỡ sẽ được đánh giá rất cao!


2
Bài viết này của Nvidia sẽ chỉ là những gì bạn cần, mặc dù nó có thể hơi quá rộng. Kiểm tra các slide 7 đến 11, chúng có một số hình ảnh đẹp sẽ cho bạn ý tưởng về những gì cần nhắm đến. Nếu bạn theo liên kết thứ hai, bạn sẽ tìm thấy mã nguồn (C ++, Direct3D). developer.doad.nvidia.com/SDK/10/direct3d/Source/Lightning/iến developer.doad.nvidia.com/SDK/10/direct3d/samples.html
Lỗi

Câu trả lời:


32

Có một thuật toán khá đơn giản mà bạn có thể sử dụng để tạo ra các bu lông chiếu sáng.

Bắt đầu với một đoạn thẳng giữa gốc của bu lông ( O) và điểm cuối ( E)

Chọn một điểm trên dòng đó (xấp xỉ hoặc chính xác ở giữa), được gọi Svà chia đoạn thành hai đoạn ( O->SS->E). Tránh Sxa phân khúc dòng ban đầu (dọc theo phân khúc bình thường) bằng một số lượng ngẫu nhiên nhỏ. Điều này cung cấp cho bạn một "uốn cong" của sét.

Sau khi bạn tính toán độ uốn cong, dựa trên cơ hội ngẫu nhiên nhỏ, bạn sẽ muốn thêm phân khúc dòng thứ ba (thường là phần mở rộng của O->Sphân khúc). Đây là cách bạn tạo ra "dĩa" trong sét. Bạn thường muốn theo dõi thông tin về cường độ của bu-lông trong quá trình tạo thế hệ này, bởi vì bạn sẽ muốn các dĩa mờ hơn hoặc có độ mờ tinh tế hơn:

nhập mô tả hình ảnh ở đây

Sau đó, lặp lại quy trình trên cho tất cả các phân đoạn dòng mới mà bạn có; bạn sẽ cần chọn số tiền lặp lại tạo ra các hình dạng bạn thích:

nhập mô tả hình ảnh ở đây

Có một lời giải thích khá rõ ràng về kỹ thuật này tại blog của bạn tôi ở đây (đó là nơi tôi xấu hổ lấy trộm những bức ảnh từ đó); nó cũng đi sâu vào việc thêm hiệu ứng phát sáng.

Cuối cùng, cũng có bài báo NVIDIA này mô tả cùng một thuật toán cơ bản (cũng có nhiều chi tiết hơn).


13

Tôi muốn giới thiệu một cách tiếp cận khác: cây ngẫu nhiên khám phá nhanh (RRT) . Một điều thú vị về nó là bạn có thể khiến nó đi vòng quanh các góc, hoặc nổ tung theo mọi hướng.

Thuật toán thực sự cơ bản:

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

Bằng cách sửa đổi các chức năng RandomSampleExtendToward, bạn có thể nhận được các cây rất khác nhau. Nếu RandomSamplechỉ cần mẫu đồng đều ở khắp mọi nơi, cây sẽ phát triển đồng đều theo mọi hướng. Nếu nó thiên về mục tiêu, cây sẽ có xu hướng phát triển về phía mục tiêu. Nếu nó luôn lấy mẫu mục tiêu, cây sẽ là một đường thẳng từ đầu đến mục tiêu.

ExtendTowardcó thể cho phép bạn làm những điều thú vị cho cây. Đối với một điều, nếu bạn có chướng ngại vật (như tường), bạn có thể khiến cây phát triển xung quanh chúng chỉ bằng cách từ chối các phần mở rộng va chạm với tường.

Đây là những gì nó trông giống như khi bạn không thiên vị lấy mẫu về mục tiêu:

img
(nguồn: uiuc.edu )

Và đây là những gì nó trông giống như với các bức tường

Một số thuộc tính tuyệt vời của RRT sau khi hoàn thành:

  • RRT sẽ không bao giờ vượt qua chính nó
  • RRT cuối cùng sẽ bao phủ toàn bộ không gian với các nhánh nhỏ hơn và nhỏ hơn
  • Con đường từ đầu đến mục tiêu có thể hoàn toàn ngẫu nhiên và kỳ lạ.

Tôi chỉ sử dụng thuật toán này để tạo ra một hình ảnh tia sét. Tôi phải nói rằng nó hoạt động thực sự tốt! Có một lỗi đánh máy chính trong mã, chẳng hạn như iter không được tăng lên mỗi vòng lặp. Ngoài ra, điều này gần như đã sẵn sàng để sử dụng như đã đăng
applejacks01
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.