How to set up collisions between control rig physics and ground

> Any idea why that could be?

I’m not sure exactly what that view mode is showing, but I’ll do some digging to find out.

> I am not sure how to check that…I am not explictily doing anything with it in the CR (as in the landscape meshes are not used in any node I am using), or you mean it’s something I should be able to check in the Chaos Visual Debugger? If so, can you guide me how to do that?

Yeah, you can see this in the visual debugger. If you look in the Physics Outliner there, you’ll see that it lists the different Chaos solvers that are running in the scene at the moment. You should see one that says something like ‘World Type [PIE]’ and another that says something like ‘ControlRigPhysics’. So the question is whether the landscape mesh appears under the world solver and/or the CRP solver.

Because we duplicate world objects into the CRP solve to collide against, they need to exist in both solvers for things to work correctly. Here’s an example:

The purple cube exists under the Kinematic section of the CRP solver. But there’s an identical cube, that you can’t see since it’s in the same location, which is listed under the world solve:

One thing to note, however, is that the CRP mesh must be close to any world body for it to be pulled into the CRP simulation. My guess is that you’ll see the landscape mesh under the world solve, but not the CRP solve.

It is there, but I finally manage to figure it out thanks to the debugger. Turns out it wasn’t really about not colliding with the floor, but colliding with some PCG biome experimental stuff causing all kinds of wrong collisions and pushing the character to wrong places. When I delete it, everything is fine. Don’t know yet why exactly it happens (the PCGVolume has collisions set to ignore (query only), but maybe it is generating something that does not ignore), but hopefully will figure it out with the people who put it inside the level.

I’m sorry to have had you investigate the false lead about the streaming landscape, but at least it taught me how to use the chaos debugger. I think the thread can be closed now, or if you think it might be useful for somebody to learn what the issue with PCG is, you can leave it open for couple more days and hopefully I will be able to provide a final closure soon.

So I asked AI about it: The issue is caused by a PCGVolume with a brush component. The collision preset of this component has “ignore” set for all channels for “collision response”. Collision enabled is set to “Query only”. Why is it causing physical collisions with the physic bodies from the control rig’s solver? When I set “collision enabled” to some mode that does not include queries (“physics only”, “probe only” or “no collision”) the issue disappears.

…and let it look through the codebase. The answer it gave seems reasonable given the results I see, here is a shortened/edited version:

-------------------------------------------------------------------------------

Yes — this behavior makes sense from the current implementation. The PCGVolume brush component is being included because Control Rig Physics world collision first does a query overlap. That query is based on object type / broad overlap presence, not your per-channel “Ignore” responses in the way you’d expect here. Once found, the component is converted into an Immediate Physics kinematic collider and that collider is configured to block everything inside the Control Rig physics solver.

Why Query Only matters

In the world-object collection step, Control Rig Physics calls:

World->OverlapMultiByObjectType(…)

with object query params like:

AllStaticObjects and:

QueryParams.MobilityType = EQueryMobilityType::Any;

This is a scene query. So a component that is static, queryable and has collision enabled for queries can show up in the overlap results even if its collision responses are all set to Ignore.

Why “Ignore all channels” still doesn’t save it

Because after the overlap finds the component, Control Rig Physics creates an Immediate Physics actor from it and adds it to the solver’s colliding pairs. The important thing is that the imported actor’s shape filter is set to effectively block all for the immediate solver. In practice, that means the original component’s fine-grained Unreal collision-response setup is not being preserved for this Control Rig Physics world-collision path. So your brush component’s settings are used only enough to let it be discovered by the query, but once imported into the solver, it becomes a real collision object there.

A PCGVolume brush component often has large bounds, query-enabled geometry, unusual collision/body setup compared to a normal mesh and geometry that exists mainly for editor/procedural workflows, not for runtime rigid-body interaction.

So it’s exactly the kind of thing that can be harmless for normal gameplay collision, but still get picked up by a broad “find static queryable things near me” pass and then become a nasty solver collider.

-------------------------------------------------------------------------------

If this is right, it’s a bit unexpected behaviour. I would like the solver to not create physical collisions for query-only objects (at least as an option to toggle on the Spawn Solver node), do you think that might get implemented in the future?

Also, a bit unexpected is that it is going to ignore objects that have physical collision turned on, but not queries, having an option to include those could be useful, although I don’t have any particular application right now (I guess it’s a bit unusual to have something that is allowed to collide but being queried).

I tried the changelist and it resolves the issue, but regardless of whether the checkbox for Query is ticked or not. The first part of IsBodyDesiredInSim always culls it:

		if (Body->GetResponseToChannel(ECC_PhysicsBody) != ECollisionResponse::ECR_Block)
		{
			return false;
		}

If I comment it out, the checkbox starts to work as expected (when we are talking about objects that have “Query Only” collisions).

Anyway, solution like that would be good for me, I’ll be waiting for the “final” version. I’m not in a particular hurry with this, but if some unexpected obstacle appears that would delay this by more than 3 months, please let me know, thank you.

> Do you see those objects collide against the Skeletal Mesh Bodies if you run a regular world simulation (ie. by calling SetAllBodiesBelowSimulatePhysics or using Physics Control Component)?

No, they do not collide. To be clear, for my application, it is OK that the ECC_PhysicsBody filter culls it in the control rig case as well, it just surprised me because it basically made the checkbox you added irrelevant - but of course only for objects that don’t have ECC_PhysicsBody set to not-block.

Thinking about it I suppose it makes sense for the filter to be there, after all all the checks in the following code are only with PhysicsBody objects.

Yes, we can close this, thanks for all the help and information.