Marcher dans une scène 3DGS : prise en charge de la collision
LCC4Unreal prend en charge le chargement dynamique des données de collision : un personnage peut se déplacer et interagir librement dans le monde 3DGS.
Prérequis
La collision dépend des fichiers de collision fournis avec les données, et les exigences diffèrent selon le format :
| Format | Données de collision | Prise en charge |
|---|---|---|
.lcc | collision.lci dans le répertoire de données, collision.bin dans les versions antérieures | Prise en charge |
.lcc2 | Fichiers .ply dans data/mesh/ du répertoire de données | Prise en charge |
.sog / .spz / .ply | Aucune | Non prise en charge |
Le plugin recherche dans l'ordre collision.lci → collision.bin → data/mesh/*.ply ; en l'absence des trois, il émet un avertissement et désactive la collision. Après le chargement des données, HaveValidCollisionData() permet de vérifier si les données courantes contiennent des données de collision utilisables.
Note :
collision.lcidoit être exporté avec LCC Studio v1.6.1 ou une version ultérieure ; les données exportées avec des versions antérieures utilisentcollision.bin.
Solutions de remplacement pour les formats à fichier unique
.sog, .spz et .ply sont des formats à fichier unique : ils ne transportent pas de données de collision et le plugin ne peut pas en générer. Quand une collision est nécessaire, construisez-la vous-même dans la scène :
- Blocking Volume : composez le sol, les murs et les autres zones à bloquer avec les volumes de blocage du moteur ; adapté aux formes régulières, c'est la solution la moins coûteuse
- Maillage approximatif : placez un maillage épousant la forme du 3DGS et activez sa collision ; adapté aux scènes de forme complexe. Ce maillage peut réutiliser le maillage proxy, en passant simplement son préréglage de collision en mode bloquant
Ces deux méthodes sont indépendantes du mécanisme de chargement de collision de LCC : elles ne sont pas soumises à CollisionLoadMaxDistance et ne sont pas échangées dynamiquement au fil des déplacements de la caméra.
Mécanisme de chargement
Comme les données de rendu, les données de collision sont stockées par blocs spatiaux. Le plugin ne charge pas toute la collision d'un coup : il ne charge que les blocs situés dans une certaine distance autour de la caméra et les échange dynamiquement au fil des déplacements de la caméra.
Camera position changes
│
▼
Compute the set of collision blocks to load within range
│
▼
Compare with the previous set ── Same ──▶ Skip, do nothing
│ Different
▼
Load the new blocks → Hand them to the physics system for baking → Generate collision bodies
Quelques points d'implémentation :
- La portée de chargement est contrôlée par
Max Load Collision Distance(m); les zones au-delà de cette distance n'ont pas de collision - Le premier chargement est synchrone, pour éviter qu'un personnage traverse le sol et tombe avant que la collision soit prête ; les mises à jour suivantes sont asynchrones et ne bloquent pas le thread principal
- Une limitation de fréquence est appliquée : la collision n'est pas reconstruite à chaque image lors des déplacements continus de la caméra
- Quand l'ensemble des blocs visibles n'a pas changé, le traitement est ignoré : un petit déplacement sur place ne déclenche pas de reconstruction
- Le calcul se fait uniquement selon la caméra principale : les SceneCapture ne participent pas au chargement de la collision
Avantages
- L'occupation mémoire ne dépend que de la portée de chargement, pas du volume total de données, donc les grandes scènes peuvent aussi avoir de la collision
- Le nombre de corps de collision que le système physique doit traiter reste toujours maîtrisé et ne ralentit pas les calculs physiques quand la taille de la scène augmente
Coûts et contournements
| Problème | Cause | Contournement |
|---|---|---|
| Le personnage traverse le sol et tombe au démarrage du jeu | La collision n'est pas encore construite | Surélevez le PlayerStart, ou n'activez le déplacement du personnage qu'une fois la collision prête |
| Saccade quand le personnage entre dans la zone de la scène 3DGS depuis le lointain | Le personnage apparaît en dehors de la portée de chargement de la collision, et l'entrée déclenche un premier chargement synchrone | Placez le point d'apparition du personnage dans la portée de chargement de la collision, ou chargez toute la collision d'un coup |
| Pas de collision au loin, les tests de rayon n'atteignent rien | Les zones au-delà de la portée de chargement ne génèrent pas de corps de collision | Augmentez Max Load Collision Distance(m), ou utilisez une méthode de détection qui ne dépend pas de la collision |
| Absence de collision pendant un court instant après une téléportation ou un déplacement rapide | Les blocs de collision de la nouvelle zone sont encore en chargement | Chargez toute la collision d'un coup |
Saccades pendant les déplacements, temps Update Collision élevé | Les blocs de collision sont échangés et rebakés fréquemment | Réduisez la portée de chargement, ou vérifiez si la collision est réellement nécessaire |
| Le maillage de navigation est reconstruit à répétition avec la navigation | Les changements de collision déclenchent la mise à jour du NavMesh | Augmentez la portée de chargement pour que la zone cible soit chargée d'un coup, et utilisez un bake Static ; voir Prise en charge du système de navigation |
Charger toute la collision d'un coup
La plupart des coûts ci-dessus viennent des échanges dynamiques à l'exécution. Si la taille de la scène est limitée et que la mémoire a de la marge, augmentez Max Load Collision Distance(m) jusqu'à couvrir toute la scène pour que la collision soit entièrement construite au chargement des données.
Il n'y a alors plus d'échange de blocs de collision à l'exécution, et les problèmes du tableau précédent (chute à travers le sol, absence de collision après téléportation, saccades en déplacement, reconstruction répétée de la navigation) disparaissent. C'est particulièrement recommandé avec le système de navigation.
Le coût est un temps de chargement plus long au démarrage et une occupation mémoire fixée à la taille de la collision de toute la scène. Pour juger de la faisabilité : consultez Collision Data Usage dans stat xgrids et vérifiez que l'occupation mémoire après chargement complet reste acceptable.
Activation
LCCComponent->SetLCCCollisionEnable(true);
Ou cochez bEnableCollision dans le panneau Details.

Activation de la collision LCC dans le panneau Details

Collision dynamique d'un personnage dans une scène LCC
Vérification
Dans les réglages du mode d'affichage, choisissez la collision joueur ou la collision de visibilité pour observer si la collision est bien activée

Vérification des corps de collision avec le mode collision joueur ou collision de visibilité
Propriétés associées
| Propriété | Description |
|---|---|
| bEnableCollision | Active la collision |
| CollisionLoadMaxDistance | Distance de chargement maximale des données de collision (300 mètres par défaut) |

Configuration de l'état d'activation de la collision et de la distance de chargement maximale
Points de vigilance
- Une fois la collision activée, le LineTrace du moteur UE permet des tests de rayon basés sur les corps de collision, avec une portée de détection également limitée par la portée de chargement
- La mémoire occupée par les données de collision est visible dans
Collision Data Usagedestat xgrids, et le temps de mise à jour dansUpdate Collision; pour la signification des paramètres, voir Paramètres de performance