[HN Gopher] Boids
       ___________________________________________________________________
        
       Boids
        
       Author : jonbaer
       Score  : 277 points
       Date   : 2020-03-28 07:30 UTC (15 hours ago)
        
 (HTM) web link (en.wikipedia.org)
 (TXT) w3m dump (en.wikipedia.org)
        
       | timtimmy wrote:
       | Boids are my favourite hello world for 3D simulation
       | environments. For the last few weeks, I've been using boids to
       | update my GPU programming skills and knowledge of related
       | algorithms in Unity and Unreal.
       | 
       | Yesterday I got 0.5 million boids simulating in Unreal Engine at
       | 45 fps on a GTX 1080 [0]. The bottle neck is rendering so many
       | instanced cone meshes, the simulation without rendering can do 1
       | million boids at 120 fps. I'm borrowing a common data structure
       | used in GPU fluid simulations, the dynamic hashed grid, to
       | calculate the neighbourhood of each boid (cool tutorial here with
       | full source code [1]). We need the neighbourhoods to calculate
       | their urges. My code is a mess at the moment, but if there is
       | interest I can post it to GitHub (Unity and Unreal).
       | 
       | Boids are an example of agent-based modelling and swarm systems.
       | I used agent-based modelling in my PhD thesis to construct and
       | simulate realtime, interactive 3D biomolecular models of
       | mitochondria and neuromuscular synapses [2,3]. Now that I'm free
       | (graduated), I'm building an iPad app to teach and communicate
       | structural and molecular biology with immersive, and realtime
       | simulations. Our vision is to make molecular and structural
       | biology immersive and fun. It's not a textbook, it's a little
       | more like Neil Stephenson's young lady's illustrated primer! :D
       | 
       | [0]: https://twitter.com/timd_ca/status/1243941167005192192?s=20
       | 
       | [1]: https://wickedengine.net/2018/05/21/scalabe-gpu-fluid-
       | simula...
       | 
       | [2]: https://prism.ucalgary.ca/handle/1880/111493
       | 
       | [3]: https://youtu.be/6CsxADBpal0
        
         | banana-slug wrote:
         | Here is a thematically-related boids simulation from 2006:
         | https://www.red3d.com/cwr/papers/2006/PSCrowdSandbox2006.pdf
         | 
         | Did 10,000 to 20,000 agents at 60 fps. Puny compared to yours,
         | but not bad for 14 years ago!
         | https://www.youtube.com/watch?v=Jpy5rJSVLj8
         | https://www.youtube.com/watch?v=ZZoy-8xK0YI
        
         | carapace wrote:
         | That's insanely cool!
        
       | gdubs wrote:
       | I recently implemented boids in a compute shader [1]. It's using
       | Apple's Metal framework, and rendered in 3D. The boids are simple
       | triangles, and I added a bit of specular shading to give them a
       | little bit of a "shimmer" as they flock.
       | 
       | I implemented an NVIDIA algorithm for running n-body simulations
       | on the GPU. The constraint is memory access, which can freeze up
       | in a case like this. [2]. Converting from CUDA to Metal wasn't
       | too bad.
       | 
       | 1:
       | https://www.instagram.com/p/B4t4ewCplfR/?igshid=1uxnng6idsqb...
       | 
       | 2: https://developer.nvidia.com/gpugems/gpugems3/part-v-
       | physics...
       | 
       | edit: Here's a low-res animated GIF for anyone who doesn't want
       | to click an instagram link:
       | http://gregorywieber.com/assets/images/art/murmuration.gif
        
         | afro88 wrote:
         | Love it, and the others on your instagram. You should start a
         | dedicated account for them. I would like to follow your art,
         | but feels weird seeing family photos of someone I don't know :/
        
       | anotheryou wrote:
       | Beautiful example:
       | 
       | https://twitter.com/OskSta/status/1219340987299966976
       | 
       | https://twitter.com/OskSta/status/1219343599336333319
       | 
       | https://twitter.com/OskSta/status/1225037781858234368
        
         | mshafer wrote:
         | Oskar's tweets showing his city-builder are some of my
         | favourite things on the internet. His combination of 3D
         | rendering and artistic style is just black magic to me.
        
           | anotheryou wrote:
           | A real challenger to the Return of the Obra Din Devlog :)
           | 
           | https://forums.tigsource.com/index.php?PHPSESSID=qvfvkcqtfr9.
           | ..
        
       | glouwbug wrote:
       | StarCraft 2 used boids, and I'm using boids to rewrite Age of
       | Empires II:
       | 
       | github.com/glouw/openempires
        
         | marktangotango wrote:
         | I've often pondered the feasibility of using boids (or a boid
         | like rule system) to implement ancient combat formations like
         | pike squares skirmish lines. Is that what you're doing?
        
           | glouwbug wrote:
           | Yes, though I'm not at the formation stage just yet. Boids
           | just know how to stear organically much like Zerglings do.
           | 
           | Boids just provide distancing at the micro level. Astar or
           | Greedy First Best at the macro level ultimately provides the
           | boid with a final destination, and the boids organically work
           | together on path to their respective final destinations.
           | 
           | Rise of Nations did it almost perfectly in the early 2000s
           | with left box drag for selection and right box drag for
           | retangular placement. Rome Total War upped the antics a bit
           | with 10,000 unit scales over Rise of Nations 200 unit scales,
           | but suffered some serious bugs. In my opinion no one except
           | Julius Caesar can "program" so many units to properly do
           | their bidding!
        
           | pugworthy wrote:
           | Here's an answer I put up on gamedev stackexchange a while
           | back with that idea in mind ->
           | https://gamedev.stackexchange.com/questions/166448/rts-
           | attac...
        
       | jbverschoor wrote:
       | I remember boids was one of the example programs with the
       | direct3d sdk back in the '90s
        
       | qubex wrote:
       | I recommend one of my favourite books, Gary William Flake's 1998
       | _The Computational Beauty of Nature_ to anybody interested in
       | boids or other computational models of social, chemical, and
       | physical phenomena.
       | 
       | Therein the author covers boids extensively and in detail. If I
       | am not mistaken it is in section 16.3 that the author treats
       | boids fairly extensively.
        
         | SanderSantema wrote:
         | That's right, currently reading it for my uni course :)
        
       | juanuys wrote:
       | I made a Three.js boids implementation for an interview once. The
       | role was for web dev, but the theme was "come and teach us about
       | something that interests you" :)
       | 
       | https://github.com/juanuys/boids
        
       | matsemann wrote:
       | I have an implementation here [0] if people want to play with it.
       | Supports dynamically changing the controls, has obstacles and
       | predators. Setting weights for separation, alignment and cohesion
       | to zero and then increasing only one of them nicely shows which
       | role each of them plays. It's actually made as a workshop [1] for
       | my company, where the shell is provided and one has to implement
       | it step by step. In Norwegian, though.
       | 
       | Update: Dang linked other discussions, and I see I commented on
       | one from 2015 [2]. Someone there asked for the course content,
       | and that's available (in English!) in a PDF in [1]. This
       | workshop/implementation is actually an example of what I wanted
       | the students to make at the time. Which I then retrofitted to a
       | fun workshop for my colleagues.
       | 
       | [0]: https://matsemann.github.io/boids-workshop/ [1]:
       | https://github.com/Matsemann/boids-workshop [2]:
       | https://news.ycombinator.com/item?id=9300142
        
         | nitrogen wrote:
         | Works great on my phone. I noticed that flocks tended to split
         | when they wrap around the edge of the field, as if forces
         | weren't being computed wrapped. Makes it hard to accomplish my
         | goal of merging all the boids into a single flock :).
        
         | parhamn wrote:
         | I had fun playing with the parameters, thanks! Now, I want a
         | wallpaper version of this with low maxSpeeds. Very relaxing.
        
         | zanderwohl wrote:
         | These guys behave just like the implementation I wrote! I
         | worked out how to do separation, cohesion, and alignment based
         | on written descriptions as an exercise.
        
         | kpgiskpg wrote:
         | That's fun, thanks!
        
       | jonbaer wrote:
       | https://github.com/search?q=boids
        
         | banana-slug wrote:
         | Note that this one (https://github.com/meshula/OpenSteer) is
         | the "semi official" port of OpenSteer, a library for steering
         | behaviors, which is the generalization of the ideas underlying
         | boids, as described in
         | http://www.red3d.com/cwr/papers/1999/gdc99steer.html
        
       | ur-whale wrote:
       | Slightly OT, but this is a _very_ interesting problem to
       | implement on a GPU because it very much resembles in its
       | structure the implementation of exact N-body simulator on
       | massively parallel machines.
        
         | glouwbug wrote:
         | Yes boids are great for parallelization. Each boid must compute
         | a stressor imposed by neighboring boids based on the three
         | rules in the paper (separation, alignment, and drifting towards
         | center of mass). The stressor for each boid is simply applied
         | to each boids velocity. Given a thousand threads / cpus / cuda
         | cores, what have you, each unit can be applied to a single boid
        
       | jonbaer wrote:
       | Boids in 3D Unity: https://github.com/SebLague/Boids and the
       | excellent related video
       | https://www.youtube.com/watch?v=bqtqltqcQhw
        
         | juanuys wrote:
         | Does it use the GPU?
         | 
         | https://github.com/SebLague/Boids/blob/master/Assets/Scripts...
         | 
         | If so, then awesome :)
        
         | semi-extrinsic wrote:
         | Blender also has boids you can play with. Here are some fishy
         | ones:
         | 
         | https://m.youtube.com/watch?v=zN2bhKyCJwk
         | 
         | It looks really good even though the "fish" are just made from
         | two pyramids.
        
       | mehmetoguzderin wrote:
       | WGSL [0] implementation of Boids:
       | https://dawn.googlesource.com/tint/+/refs/heads/master/test/...
       | 
       | [0]: http://gpuweb.github.io/gpuweb/wgsl
        
       | bschne wrote:
       | Dan Shiffman over on The Coding Train has a nice walkthrouhg of
       | implementing this in P5.js
       | 
       | https://www.youtube.com/watch?v=mhjuuHl6qHM
        
         | mar77i wrote:
         | Recently did that code as presented using pygame, but I haven't
         | uploaded it anywhere yet, that might be a good idea, though.
        
       | [deleted]
        
       | robotresearcher wrote:
       | Reynolds put up a page about Boids in 1995 and added links to
       | related work for a few years. Great stuff.
       | 
       | https://www.red3d.com/cwr/boids/
        
       | miniatureape wrote:
       | I posted this simple boid drawing toy a year or two ago:
       | https://miniatureape.github.io/boiddraw/
        
       | DonHopkins wrote:
       | I've confirmed with Craig Reynolds that yes indeed, then name of
       | Boids was inspired by The Producers:
       | 
       | https://www.youtube.com/watch?v=aL6mTMShVyk
       | 
       | >"He's up on the roof with his boids. He keeps boids. Doity,
       | disgusting, filthy, lice ridden boids." -The Concierge, not a
       | Madam
        
         | rootbear wrote:
         | I had no idea! I would have guessed it was a contraction of
         | "bird-oid", or something like that.
        
           | DonHopkins wrote:
           | That too, but it's only the cover story for people without a
           | New York Metropolitan accent!
           | 
           | https://en.wikipedia.org/wiki/Boids
           | 
           | >Boids is an artificial life program, developed by Craig
           | Reynolds in 1986, which simulates the flocking behaviour of
           | birds. His paper on this topic was published in 1987 in the
           | proceedings of the ACM SIGGRAPH conference. The name "boid"
           | corresponds to a shortened version of "bird-oid object",
           | which refers to a bird-like object. Incidentally, "boid" is
           | also a New York Metropolitan dialect pronunciation for
           | "bird".
        
       | jaltekruse wrote:
       | Might be a dumb thing to post on hacker news, but I tried using
       | the word boid or boids in Scrabble and my competitive wife
       | wouldn't let me because it wasn't in the dictionary. It fit so
       | well too!
        
         | banana-slug wrote:
         | You need a better dictionary: https://www.merriam-
         | webster.com/dictionary/boid
         | 
         | Long before the flocking model, "boid" referred to snakes of
         | the Boidae family, like boas and anacondas.
        
           | fanf2 wrote:
           | Scrabble doesn't use any dictionary:
           | 
           | https://scrabble.merriam.com/finder/boid (for the USA and
           | Canada)
           | 
           | https://www.collinsdictionary.com/scrabble/ (for English in
           | the rest of the world)
        
           | contingencies wrote:
           | Previously we played with the Australian reference, the
           | Macquarie Dictionary. Subsequently, as an international
           | family finding that an expensive and static resource
           | insufficiently engaged with international usage we began to
           | play admitting anything in either dictionary.com or
           | wiktionary with an English entry, excepting proper names and
           | non-naturalized acronyms. As official scrabble cheat words
           | cover a lot of random Scots/Welsh, you might choose to permit
           | those (single result page on Wiktionary). It starts to get
           | ridiculous fast. I personally love the learning aspect and we
           | do not play the traditional "challenge" rule, in fact we
           | actively encourage consultation of reference works before and
           | after each play. I am a big fan of Wiktionary, occasionally
           | adding to existing English and Middle Chinese entries.
           | 
           | For example, according to Wiktionary, _boid_ (and its plural)
           | should be permitted under etymology two, ie. _member of the
           | family Boidae of non-venomous snakes_ or etymology three, ie.
           | _Nonstandard spelling of bird representing the New York City
           | pronunciation_. We would not permit it under etymology one
           | (computer program name). Now look - you learned something!
           | https://en.wiktionary.org/wiki/boid#English
        
       | jzting wrote:
       | I also have an implementation [0] that shows the paths of the
       | boids. Based on the parameters, some very interesting patterns
       | emerge!
       | 
       | [0] http://jzlabs.com/
        
       | dang wrote:
       | Related from 2015: https://news.ycombinator.com/item?id=9298338
       | 
       | 2011: https://news.ycombinator.com/item?id=2504652
       | 
       | 2014: https://news.ycombinator.com/item?id=7293350
       | 
       | One comment from 2018:
       | https://news.ycombinator.com/item?id=17167077
       | 
       | (Links for the curious. Reposts are ok after a year:
       | https://news.ycombinator.com/newsfaq.html)
        
       | [deleted]
        
       | anoopelias wrote:
       | Now who doesn't have an implementation of Boids of their own...
       | :)
       | 
       | https://anoopelias.github.io/boids/
        
         | postnihilism wrote:
         | It's a classic :)
         | 
         | I made a little framework for building these types of models:
         | https://github.com/jrhdoty/SwarmJS
         | 
         | Here's a boids implementation using it:
         | http://jrhdoty.github.io/SwarmJS/
        
       | foreigner wrote:
       | Good old Boids! I implemented a clone of Boids in C as my senior
       | project in high school. It included 3D wireframe graphics from
       | scratch. My teacher said it was "A nice screensaver".
        
       | banana-slug wrote:
       | Nice boid-related tutorial:
       | https://www.youtube.com/watch?v=bqtqltqcQhw
        
       | diggan wrote:
       | If you're in 3D animation/modeling/whatever and have a little bit
       | of experience, Blender has a pretty stable simulation of Boids
       | that is lots of fun to play around with. It's been built-in into
       | Blender since... For as long as I remember, and it has lots of
       | properties you can play around with, and you can also make the
       | boids be rigid bodies as well so they can interact with other
       | elements in your scene.
       | 
       | Some links if you want to try it out:
       | 
       | - https://docs.blender.org/manual/en/latest/physics/particles/...
       | 
       | - https://www.blendernation.com/2019/07/06/how-to-use-boids-in...
       | 
       | - https://www.blendernation.com/2008/01/05/simulating-flocks-h...
       | 
       | - http://feeblemind.tuxfamily.org/blog/index.php?post/2007/12/...
        
       | jsilence wrote:
       | Could that be used to simulate the pandemic?
        
         | wwwhizz wrote:
         | Maybe, but a simulation is only as good as its model. If this
         | model of boids does not have the same properties as the
         | pandemic, the simulation is probably not good enough.
         | 
         | For a nice visualization and simulation of a spreading virus
         | and why social distancing is a good idea:
         | https://www.washingtonpost.com/graphics/2020/world/corona-si...
        
         | qubex wrote:
         | No, definitely not: 'boids' serve to show how synchronised
         | collective behaviour can arise in swarms of agents that can
         | observe only a handful of their closest neighbours whilst
         | following pre-determined rules. Virii have no such perceptive
         | capability.
         | 
         | S-I-R (Susceptible, Infected, Recovered/Removed) models of
         | epidemiology are a far better place to begin for reasonably
         | realistic and tractable modelling and prediction of epidemics.
        
         | [deleted]
        
         | jonbaer wrote:
         | I think (maybe) a better question might be if a boids strategy
         | could somehow be used to avoid a pandemic(?) - if all
         | information is known. Seems like we are all performing a 6ft.
         | collision detection @ the moment.
        
           | DonHopkins wrote:
           | Speaking of boids and social distancing, Craig Reynolds
           | (author of Boids) has also developed the open source
           | library/toolkit "OpenSteer: Steering Behaviors for Autonomous
           | Characters". It's based on his GDC 1999 paper, "Steering
           | Behaviors For Autonomous Characters". I think there's a
           | Unity3D plugin that incorporates a derivative of that code.
           | 
           | In OpenSteer terms, social distancing would include
           | "unaligned collision avoidance" and "separation" steering
           | behaviors, which can be combined with other behaviors
           | including "seek", "flee", "pursuit", "evasion", "offset
           | pursuit", "arrival", "obstacle avoidance", "wanderer", "path
           | following", "wall following", "containment", "flow field
           | following", "cohesion", "alignment", and "leader following".
           | You can also implement your own custom plug-ins, if you need
           | something special like "curly floor spinning".
           | 
           | https://www.youtube.com/watch?v=T2iZPRif2i4
           | 
           | http://www.red3d.com/cwr/steer/
           | 
           | http://www.red3d.com/cwr/papers/1999/gdc99steer.html
           | 
           | http://www.red3d.com/cwr/steer/gdc99/
           | 
           | https://forum.unity.com/threads/opensteer-for-unity3d.26906/
           | 
           | https://code.google.com/archive/p/opensteerdotnet/
           | 
           | https://github.com/ricardojmendez/UnitySteer
           | 
           | http://opensteer.sourceforge.net/
           | 
           | OpenSteer is a C++ library to help construct steering
           | behaviors for autonomous characters in games and animation.
           | In addition to the library, OpenSteer provides an OpenGL-
           | based application called OpenSteerDemo which displays
           | predefined demonstrations of steering behaviors. The user can
           | quickly prototype, visualize, annotate and debug new steering
           | behaviors by writing a plug-in for OpenSteerDemo.
           | 
           | OpenSteer provides a toolkit of steering behaviors, defined
           | in terms of an abstract mobile agent called a "vehicle."
           | Sample code is provided, including a simple vehicle
           | implementation and examples of combining simple steering
           | behaviors to produce more complex behavior. OpenSteer's
           | classes have been designed to flexibly integrate with
           | existing game engines by either layering or inheritance.
           | 
           | OpenSteerDemo's plug-in framework allows a game AI programmer
           | to quickly prototype behaviors during game design, and to
           | develop behaviors before the main game engine is finished.
           | OpenSteerDemo allows the user to interactively adjust aspects
           | of the simulation. The user can: start, stop and single step
           | time, select the vehicle/ character/ agent of interest,
           | adjust the camera's view and its tracking behavior.
           | 
           | OpenSteer is distributed as open source software in
           | accordance with the MIT License. OpenSteer was developed with
           | the generous support of Sony Computer Entertainment America.
           | OpenSteer is supported on Linux, Mac OS X and Windows.
           | 
           | Last modified: October 25, 2004
        
         | vortico wrote:
         | No. It's an unrelated set of rules. The best way to simulate a
         | disease is to model each person in the country as an individual
         | agent. Even a naive movement model for humans won't look like
         | anything like bird flocking.
        
         | pinkfoot wrote:
         | #3Blue1Brown has decent (simple) SIR epidemic simulation
         | 
         | https://youtu.be/gxAaO2rsdIs
        
           | timtimmy wrote:
           | It's a great video. His source is here: https://github.com/3b
           | 1b/manim/blob/shaders/from_3b1b/active/...
        
       | escot wrote:
       | > Incidentally, "boid" is also a New York Metropolitan dialect
       | pronunciation for "bird".
        
       | diekhans wrote:
       | It is a beautiful paper, well worth reading the original.
        
       ___________________________________________________________________
       (page generated 2020-03-28 23:00 UTC)