XGRIDSDocumentation
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • Lixel CyberColor

    • LCC Studio

      • Prise en main
      • Version et mises à jour
      • Téléchargement et installation
      • Aperçu de l’interface et navigation
      • Avant la reconstruction
      • Reconstruction du modèle
      • Reconstruction d’un modèle unique
      • Fusion cartographique
      • Fusion aérienne-terrestre
      • Reconstruction aérienne
      • Mes modèles
      • Autres fonctionnalités
      • Paramètres et compte
      • Convertisseur
      • Reconstruction vidéo
      • Questions fréquentes
    • LCC Scene Editor

      • Version et mises à jour
      • Compte et connexion
      • Présentation du produit et accueil
      • Interface de l’éditeur
      • Modes de navigation de scène
      • Fichier
      • Paramètres
      • Opérations d’édition
      • Fenêtre
      • Barre d’outils globale
      • Ressources et propriétés
      • Barre d’outils gauche
      • Points de vue
      • Portail
      • Skybox
      • Annotations
      • Mesure
      • Parcours
      • Rapport de scène
      • 3D Layout
      • Mini-carte
      • Mode Prévisualisation, Viewer
      • Aide
      • FAQ
      • Point d’apparition
    • LCC Model Editor

      • Version et mises à jour
      • Guide de l’utilisateur
      • Aperçu et interface
      • Opérations sur les fichiers
      • Sélecteurs
      • Modification des modèles
      • Mesure
      • Réglage des couleurs
      • Gestion des ressources
      • Paramètres et aide
      • Questions fréquentes
    • Bonnes Pratiques

      • Fusion de plusieurs modèles 3DGS de grande taille
  • Plugin & SDK

    • Unreal

      • Introduction
      • Démarrage rapide - Windows
      • Démarrage rapide - Linux
      • Démarrage rapide - Quest3
      • Éditions et licences
      • Rendu
      • Rastérisation Tiled (expérimental)
      • Réglages visuels
      • Normales et éclairage
      • Édition de scène
      • Paramètres de performance
      • Guide d'optimisation des performances
      • Intégration avec les plugins tiers et moteur
      • Maillage proxy
      • Animation de chargement
      • Collision
      • Prise en charge du système de navigation
      • Prise en charge de l'eau à couche unique
      • Localisation
      • Questions fréquentes
      • Dépannage
      • Journaux et diagnostics
      • Nous contacter
      • Bonnes pratiques

        • Rééclairer un 3DGS avec un maillage LixelStudio
        • Rendu indépendant par caméra
      • Référence API

        • ALCCActorBase
        • ULCCComponentBase
        • ULCCComponent
        • ULCC2Component
        • Actors SOG / SPZ / PLY
        • ALCC2ProxyMesh
        • ALCCClippingVolume
        • ALCCSectionPlane
        • ALCCLoadVolume
        • ULCCUtilLibrary
        • Enums
        • Structs
      • Journal des modifications

        • v3.5.0
        • v3.4.0
        • v3.3.1
        • v3.0.0
        • v2.2.1
        • v1.0.0
        • v0.9.0
        • v0.8.0
        • v0.7.1
        • v0.6.1
        • v0.5.2
        • v0.4.1
        • v0.4.0
        • v0.3.0
        • v0.0.5
        • v0.0.4
        • v0.0.3
        • v0.0.2
        • v0.0.1
    • Unity

      • Introduction au SDK Unity
      • Fonctionnalités techniques
      • Exigences de l'environnement de développement
      • Guide de démarrage rapide PC
      • Guide d'optimisation des paramètres de projet
      • Guide de développement Pico 4 Ultra
      • Guide de streaming PC du Pico 4 Ultra
      • Guide de développement Quest 3
      • Guide de streaming PC du Quest 3
      • Guide de développement OpenXR
      • Guide Business Streaming du Pico 4 Ultra
      • Glossaire
      • FAQ
      • Nous contacter
      • Guide de développement des fonctionnalités

        • Guide de développement du rendu mixte multi-scènes
        • Guide de développement de la réception des ombres
        • Guide de développement de l'éclairage en temps réel
        • Guide de développement du rendu multi-caméras
        • Guide de développement du rendu d'images haute résolution
        • Guide de développement de la compatibilité des formats de données LCC et LCC2
        • Guide de développement de l'effet de chargement
        • Guide de développement du basculement du mode de rendu Mip
        • Guide de développement de l'accrochage aux arêtes et aux coins
        • Guide de développement du décalque projeté
        • Guide de développement du décalque projeté vidéo
        • Guide de développement du surlignage
        • Guide de développement de la découpe en temps réel
        • Guide de développement du réglage des couleurs
        • Guide de développement de l'obtention des données Mesh de la scène
        • Guide de développement du mode éditeur
        • Guide de configuration des paramètres de performance de rendu
        • Guide de développement du co-packageage de l'application et des données
        • Guide de développement du système de collision
        • Guide des problèmes d'autorisation de développement macOS
        • Guide de développement de la compilation et du packageage sur appareil iOS
      • Référence de l'API

        • LCCManager
        • Renderer
        • Types de données
      • Journal des modifications

        • v2.3.0
        • v2.2.10
        • v2.2.0
        • v2.1.19
        • v2.0.14
  • API

    • Modélisation spatiale structurée

      • Guide d'accès
      • Flux de modélisation
      • Référence des API
      • Identifiants temporaires d'importation
      • Codes d'erreur

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 :

FormatDonnées de collisionPrise en charge
.lcccollision.lci dans le répertoire de données, collision.bin dans les versions antérieuresPrise en charge
.lcc2Fichiers .ply dans data/mesh/ du répertoire de donnéesPrise en charge
.sog / .spz / .plyAucune nativement ; l'édition Pro peut la dériver des gaussiennesPrise en charge (édition Pro)

Pour .lcc et .lcc2, le plugin recherche le fichier de collision fourni avec les données dans l'ordre collision.lci → collision.bin → data/mesh/*.ply ; en l'absence des trois, il émet un avertissement et désactive la collision.

Les formats à fichier unique (.sog / .spz / .ply) ne transportent aucune donnée de collision propre. L'édition Pro peut dériver automatiquement un maillage de collision à partir des gaussiennes, voir Génération automatique de collision pour les modèles mono-fichier ; l'édition gratuite nécessite de construire la collision vous-même.

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.lci doit être exporté avec LCC Studio v1.6.1 ou une version ultérieure ; les données exportées avec des versions antérieures utilisent collision.bin.

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èmeCauseContournement
Le personnage traverse le sol et tombe au démarrage du jeuLa collision n'est pas encore construiteSuré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 lointainLe personnage apparaît en dehors de la portée de chargement de la collision, et l'entrée déclenche un premier chargement synchronePlacez 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 rienLes zones au-delà de la portée de chargement ne génèrent pas de corps de collisionAugmentez 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 rapideLes blocs de collision de la nouvelle zone sont encore en chargementChargez 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équemmentRé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 navigationLes changements de collision déclenchent la mise à jour du NavMeshAugmentez 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

Activation de la collision LCC dans le panneau Details

Démonstration de la collision dynamique LCC

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

Affichage des corps de collision dans le mode d'affichage

Vérification des corps de collision avec le mode collision joueur ou collision de visibilité

Propriétés associées

PropriétéDescription
bEnableCollisionActive la collision
CollisionLoadMaxDistanceDistance de chargement maximale des données de collision (300 mètres par défaut)
Propriétés d'activation de la collision et de distance de chargement maximale

Configuration de l'état d'activation de la collision et de la distance de chargement maximale

Génération automatique de collision pour les modèles mono-fichier (fonctionnalité de l'édition Pro)

Les modèles mono-fichier (.ply / .spz / .sog) ne transportent aucune donnée de collision propre. Le plugin dérive un maillage de collision à partir des gaussiennes elles-mêmes, le met en cache sous la forme <nom>.collision.ply à côté du modèle, puis le charge et le réutilise via le chemin de collision PLY existant.

C'est une fonctionnalité de l'édition Pro, qui ne génère qu'après l'enregistrement d'une App Key ; voir Éditions et licences. Sans licence, aucun maillage de collision n'est généré et vous devez construire la collision vous-même, comme décrit dans Approche manuelle sans génération automatique.

Étapes

  1. Cochez bEnableCollision dans le panneau du LCC Actor.
  2. Chargez un modèle mono-fichier (.ply / .spz / .sog).
  3. Le premier chargement passe à l'état Generating et construit le maillage de collision sur place. Cela prend de quelques secondes à quelques minutes selon le volume de données ; une fois terminé, l'état passe à Loaded et <nom>.collision.ply est écrit à côté du modèle.
  4. Lors d'un chargement ultérieur du même modèle, si le fichier de cache existe, l'état passe directement à Loaded et la génération est ignorée.
Un modèle mono-fichier générant un maillage de collision lors de son premier chargement

Avec la collision activée, un message apparaît en bas à droite lors du premier chargement d'un modèle mono-fichier pendant la génération du maillage de collision

L'état de génération et de collision peut être interrogé avec GetCollisionState() ou en écoutant l'événement OnCollisionStateChanged ; pour les valeurs, voir ULCCComponentBase - Requête d'état.

Astuce : pour éviter la génération à l'exécution, distribuez ou packagez le <nom>.collision.ply généré avec le modèle ; à l'exécution, le cache est réutilisé directement dès sa détection.

Astuce : il n'y a aucun message intégré lorsque la collision est générée dans un jeu packagé. Pour indiquer au joueur « génération de la collision », écoutez l'état Generating de OnCollisionStateChanged et affichez-le vous-même.

Astuce : une génération échouée passe à l'état Failed ; la cause précise figure dans l'Output Log, et désactiver puis réactiver la collision relance la tentative. Pour retester le processus de génération, supprimez d'abord le fichier de cache .collision.ply à côté du modèle.

Approche manuelle sans génération automatique

Pour contrôler entièrement la forme de la collision, ou lorsque les données ne se prêtent pas à la dérivation, vous pouvez laisser la génération automatique désactivée et construire la collision dans la scène vous-même :

  • 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 son préréglage de collision en mode bloquant

Ces deux approches manuelles sont indépendantes du mécanisme de chargement de collision de LCC : elles ne sont pas soumises à CollisionLoadMaxDistance et ne sont pas échangées au fil des déplacements de la caméra.

Zones de découpe de collision

La collision peut être découpée en même temps que les volumes de découpe et plans de coupe, afin que la portée de collision corresponde à l'image rendue. Un volume de découpe n'affecte que le rendu par défaut : la zone supprimée disparaît de l'image mais la collision subsiste, et un personnage heurte un mur invisible. Avec la découpe de collision (Clip Collision) activée, la collision est également supprimée dans la zone découpée.

Étapes

  1. Ajoutez et configurez un volume de découpe ou un plan de coupe sur le LCC Actor comme décrit dans Édition de scène, et vérifiez que l'image rendue est découpée comme prévu.
  2. Cochez Activer la collision (bEnableCollision) dans le panneau du LCC Actor.
  3. Cochez Clip Collision dans le panneau ; la collision est alors découpée par le volume de découpe et aucun corps de collision n'est généré dans la zone supprimée.

Les images ci-dessous utilisent le mode d'affichage collision de visibilité pour comparer le filaire de collision avant et après l'activation de Clip Collision. Désactivé, la collision couvre toute la zone :

Le filaire de collision est complet lorsque Clip Collision est désactivé

Clip Collision décoché : le filaire de collision couvre toute la zone

Activé, la collision à l'intérieur du volume de découpe est également supprimée, conformément au rendu :

La collision de la zone découpée est supprimée lorsque Clip Collision est activé

Clip Collision coché : la collision à l'intérieur de la zone découpée est également supprimée

Astuce : Clip Collision nécessite d'abord l'activation de la collision, et s'applique aussi à la collision générée automatiquement pour les modèles mono-fichier.

Requête et événements d'état de la collision

Vous pouvez interroger l'état courant de la collision, ou écouter les changements d'état de la collision, pour des logiques telles que « ne faire apparaître le personnage qu'une fois la collision prête » ou « afficher la progression pendant la génération » :

  • GetCollisionState() retourne l'état courant : NoCollision (désactivée ou aucun modèle) / Generating (un modèle mono-fichier génère son maillage de collision) / Loading (la collision près de la caméra est en cours de chargement/cook) / Loaded (la collision près de la caméra est en place) / Failed (impossible à fournir).
  • L'événement OnCollisionStateChanged est diffusé au changement d'état, ce qui permet d'activer le déplacement du personnage seulement après Loaded, ou d'afficher un message pendant Generating.

Pour l'interface complète et les conventions d'utilisation, voir ULCCComponentBase - Requête d'état.

Astuce : Loaded signifie que la collision près de la caméra est en place, pas que tout le modèle possède une collision — la collision continue d'être chargée en streaming au fil des déplacements de la caméra. Pour « ne pas traverser le sol sous les pieds », attendre Loaded suffit ; pour la collision au loin, augmentez la distance de chargement.

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 Usage de stat xgrids, et le temps de mise à jour dans Update Collision ; pour la signification des paramètres, voir Paramètres de performance