When generating a Geometry Collection from Fracture Mode > Generate > New > Use Root Proxies (ticked), eventually the GC’s transforms become mismatched.
Found moving the GC once created and then performing a few tasks then undoing caused this issue to occur.
I’ve been trying to replicate your setup here, but I’ve yet to reproduce the behavior you described.
Let me go through the steps I followed so you can let me know what I’m doing wrong:
I added a few cubes to the scene and arranged them into an L shape, following your pictures.
Selecting all of them, I went to Fracture mode and created a new Geometry Collection Asset, leaving the UseRootProxies option checked (the default setting in 5.6), and saved it as GC_CubeWithRootProxies.
For comparison, I did another GC with the UseRootProxies unchecked, called GC_CubeNoRootProxies.
Next, I tried moving GC_CubeWithRootProxies around, rotating it, scaling it, and copying and pasting it throughout the scene, later undoing the performed actions, but I’m yet to see a mismatch.
Hopefully, you can point me in the right direction, for each of these steps could be performed in any number of ways.
I’ll also attach to this reply the repro project I created.
Maybe you would prefer tweaking it so it reproduces the behavior.
I would like to shed light on this problem and provide a solution I found on my end. To fully reproduce the issue, the first static mesh selected in the group during GC creation (i.e. the one that will be used as the root node during root proxy transform calculation in the call to FracturedGeometryCollection->SetRootProxiesFromGeometrySources() on line 1013 of FractureToolGenerators.cpp) must possess a rotation. After creating the GC in this manner, you should see the visual pop.
As for the solution I found, I moved the section of code responsible for the root proxy transform generation starting on line 1010 of FractureToolGenerators.cpp to below the call to FracturedGeometryCollection->InvalidateCollection() on line 1025. This was done as the calls to AddSingleRootNodeIfRequired() and FracturedGeometryCollection->InvalidateCollection() directly above may result in the creation of a new root node, which invalidates the previously generated root proxy transforms as they were generated relative to a stale root node whose transform may differ from the new root node’s. Additionally, UGeometryCollectionComponent::RefreshCustomRenderer() uses the new root node’s transform as the component space root transform which will cause the root proxy to be rendered incorrectly if the root proxy transforms are generated prior to generating the new root node.
The behavior also reproduces if you spawn the Geometry Collection (GC) by dragging the asset from the Content Browser: the original rotation of the root node is reset, and the whole GC is rotated.
The same happens if you duplicate the GC in the scene by ALT+Dragging the originally rotated one.
If you select the rotated GC and go to FractureMode (Shift+6), the rotation is as expected, but immediately fails again when you are back to SelectionMode (Shift+1).
Thank you for providing your analysis and solution to the problem. That’s really helpful!
I’ll investigate some more, open a JIRA ticket, and ensure your suggestion is included.
I’ll share the public tracking link once I have it.
[mention removed]: As a workaround, for now, I suggest avoiding a rotated root.