Announcement

Collapse
No announcement yet.

Collision Filtering

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

    Collision Filtering

    Hi guys! Thanks for stopping by today! Lead engine programmer James Golding has a new post for you guys today on collision filtering in UE4. Enjoy!


    Choosing what collides is obviously very important, but it can be tricky, and it’s a problem that we have spent quite a while discussing while developing UE4. The system we have can seem a little complex at first, but it is very powerful and consistent, so I wanted to give a little background on how we arrived at it. We’ll talk about the different responses to collision, how we use channels to filter collisions, and outline the difference between simple and complex collision geometry.

    Blocking, Overlapping and Ignoring

    The first thing to know is that when you say something should collide, you have to choose whether you can penetrate it or not. A brick wall will ‘Block’ a player, but a trigger will ‘Overlap’ them, allowing them to pass through. Both generate an event (‘Hit’ or ‘Overlap’ respectively, in UE4 terminology) but it is an important difference*. Other objects may ‘Ignore’ the collision altogether, giving us our three response types.

    Trace Channels and Object Channels

    The next big question at the heart of collision filtering is “who gets to choose?” Is it the object that decides what types of query to collide with? Or does the query decide what types of object it is looking for? In different scenarios they both make sense, so UE4 supports both!

    Imagine we define two ‘Trace Channels’ in our game, one for ‘Visibility’ and one for ‘Weapon’ queries. A brick wall is set up to block both, a shrub blocks visibility but not weapons, and bulletproof glass blocks weapons but not visibility. When you do this kind of query you specify a single Trace Channel.



    If I changed this around so the game code had to know what types of object to query for, our game could need a huge number of different types to handle all these situations! It also allows us to make ‘spot fixes’ in content later on, instead of changing the calling code itself and possibly breaking other things.

    There are however some situations where you do want to query for objects based purely on their type, and this is where we use ‘Object Channels’. One example is an explosion going off, and you want to quickly find all objects of type ‘Pawn’ or ‘PhysicsBody’ within a certain radius. When you do this kind of query, you can specify multiple Object Channels.

    UE4 has a few ‘built in’ Trace Channels (Visibility, Camera) and Object Channels (WorldStatic, WorldDynamic, Pawn, PhysicsBody, Vehicle, Destructible), but you can easily add your own under Edit -> Project Settings -> Collision, though you are limited to 32 in total.

    Collisions Between Moving Objects

    Things get a bit more complicated when you want to handle collisions between moving objects, because there can be so many combinations. In UE4 each object knows its own Object Channel, plus a list of how it responds to other Object Channels. When two objects intersect, we look at how they respond to each other, and take the least blocking interaction, like so:



    So imagine the following scene:



    Now the player moves forward. First he will overlap the shrub. The Player is of type Pawn, and the Shrub wants to Overlap that. The Shrub is of type WorldStatic, and the Player wants to Block that. Checking the chart, the final result is Overlap! Similarly the Brick Wall and Player both want to Block each other, so the player walks through the Shrub (generating an Overlap event) and is stopped by the wall (generating a Hit event).



    If you had two players and one wanted to become ‘ghostly’, he could change his response to the Pawn channel from Block to Ignore, and then he could walk right through other players.

    Collision Presets

    Even though this system gives a lot of control over what objects in your level will collide with, in practice most objects fall into common configurations. To make things easier, UE4 has a ‘Collision Preset’ system. Each Preset contains an Object Type, and a response to each Trace and Object Channel in your game. When you select an object in the level, you will see a simple dropdown, allowing you to select a Preset:



    UE4 has several of these built in (e.g. Invisible Wall, Physics Actor etc), and again you can create your own inside Project Settings. If you don’t want to use a Preset, you can choose ‘Custom…’ and then you can modify every response, liked we talked about above:



    Simple and Complex Collision

    One final thing to understand is that each object in UE4 can have both a ‘complex’ and ‘simple’ collision representation. Complex Collision refers to using the actual rendering geometry for collision. This is most useful for things like weapon traces, where you want to be able to shoot exactly what you see. You don’t always want to collide with this though, and so each mesh can also have a Simple Collision representation consisting of a collection of spheres, boxes, capsules and convex hulls. When you perform a collision query, you tell UE4 what kind of geometry you want to collide with. Player movement, for example, collides against simple geometry, to avoid getting ‘stuck’ on little details.

    In the editor there is a handy View Mode that lets you see the world as a player will collide with it:





    Conclusion

    So that is the whole, heady world of collision filtering in UE4! I hope it was helpful to understand some of the problems we are trying to solve and how to make use of it for your own game. Any questions or comments? Post about it below or you can hit me up on Twitter at @EpicJamesG.
    --
    *We can actually stop looking for collisions after the first blocking collision, which is a good performance optimization - imagine firing a gun with a range of 1km at a brick wall 1m in front of you, we just skipped 999 meters of work!
    Attached Files

    #2
    Thanks James, it's quite helpful. In UE3 we had lots of options for collision, but for more complicated scenarios it could become confusing, and honestly names of some of them wouldn't help either. But it seems more straight forward in UE4, the most used ones being grouped together in one place, and we still have access to most those advanced settings yet.

    Comment


      #3
      Thanks for the overview. You speak of Trace Responses for Visibility and Weapon. In the UE4 interface, it's Visibility and Camera. So... is Weapon == Camera?

      Comment


        #4
        Originally posted by Daerst View Post
        Thanks for the overview. You speak of Trace Responses for Visibility and Weapon. In the UE4 interface, it's Visibility and Camera. So... is Weapon == Camera?
        That part of the article is only a simple example of two channels in an imaginary project, to help you get the idea. Also it's showing a use of channels and not responses.

        Comment


          #5
          Right, I should have read more carefully. Thanks for clarification.

          Comment


            #6
            Hi,

            There is any built-in optimization for cases when you have too many movable objects. For example imagine 3000 moving ants all with Overlap enabled because I want to know when any of them are close enough to will interact/communicate with each other....

            Will UE iterate all my objects each frame no matter how far is one ant from the other?

            What i'm trying to reproduce with UE4 is this simulation I made many years ago with Delphi:
            Here I had to implement an spacial grid localize groups of ants by region to avoid the problem of exponential decrease in performance when the number of ants increased.



            Since I wish to create my simulation with Blueprints only I need to know if some similar optimization is already there so I can use it.


            Thanks,
            Regards,
            Denys

            WIP: Crabby Ball (2D platform game)

            Comment


              #7
              The only thing honestly missing is per-object filtering. For example, telling my projectile to ignore the actor that shot it, but not other actors.

              Comment


                #8
                Originally posted by DamirH View Post
                The only thing honestly missing is per-object filtering. For example, telling my projectile to ignore the actor that shot it, but not other actors.
                You can do this, you just need to call the Ignore Actor When Moving node and feed it a reference to the actor in question.

                Comment

                Working...
                X