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
      • Référence API

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

        • 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

Guide de développement du système de collision

Le LCC Unity SDK dispose d'un système de collision intégré, axé sur la résolution de l'accélération de la construction des colliders et de la détection de collision — c'est-à-dire le problème de performance de la collision. Le système Collider de Unity ne peut pas gérer la détection en temps réel dans de très grandes scènes.

Le LCC Unity SDK utilise son propre système de collision intégré, ne dépendant plus du composant MeshCollider de Unity ni des capacités associées, de sorte qu'il ne peut pas agir directement sur les GameObjects d'une scène Unity. Le format de données LCC officiel généré par XGrids (LCC Studio) génère des données Mesh utilisées pour la collision pendant la reconstruction, et le SDK utilise ces données de collision pour construire rapidement et efficacement la collision de la scène. Comme il s'agit d'un système de collision auto-construit, l'utilisation de la fonctionnalité de collision nécessite d'appeler les méthodes correspondantes fournies par le SDK.

Remarque :

Le système de collision intégré du SDK est incompatible avec le système Collider de Unity et ne peut pas agir directement sur les objets Rigidbody de Unity. La collision des personnages tels que les humains numériques doit être pilotée par les méthodes de détection du SDK (voir « Implémentation de la collision des humains numériques » ci-dessous).

Pour les scènes fixes, vous pouvez également extraire les données Mesh et les baker à l'avance dans un NavMesh, ce qui peut être compatible avec le système Collider de Unity ; voir le guide NavMesh pour plus de détails.

Prérequis de données

Le prérequis pour que la détection de collision fonctionne est que la scène possède des données de collision correspondantes. Les données reconstruites dans des versions antérieures peuvent ne pas contenir de données de collision ; dans ce cas, l'appel de SetColliderEnable(true) retourne false, et toutes les méthodes de détection ultérieures sont indisponibles.

Par conséquent, après avoir activé la collision, assurez-vous de vérifier la valeur de retour :

bool ok = renderer.SetColliderEnable(true);
if (!ok)
{
    Debug.LogWarning("Les données actuelles ne contiennent aucun collider, impossible d'activer la détection de collision");
}

Flux de travail d'utilisation de base

Le flux de travail de base de la fonctionnalité de collision comporte trois étapes :

  1. Chargez les données de la scène via la méthode Load().
  2. Dans le callback de fin de chargement, activez la collision via SetColliderEnable(true).
  3. Effectuez la détection de collision via les différentes méthodes de détection (RaycastMesh / IntersectsSphere / IntersectsCapsule).
// 1. Charger la scène
renderer.Load(dataPath, onProgress: null, onComplete: () =>
{
    // 2. Activer la collision après la fin du chargement
    if (renderer.SetColliderEnable(true))
    {
        colliderReady = true;
    }
});

void Update()
{
    if (!colliderReady) return;

    // 3. Effectuer la détection de collision à chaque image
    var capsule = new Capsule(footPos, headPos, 0.3f);
    if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
    {
        characterController.Move(delta);
    }
}

Remarque :

SetColliderEnable() est une méthode de Renderer, tandis que les méthodes de détection (RaycastMesh / IntersectsSphere / IntersectsCapsule / Raycast) se trouvent sur LCCManager. Appelez-les sur les objets correspondants respectivement.

Flux de travail de base du système de collision : charger la scène → activer la collision → détection de collision

Flux de travail de base du système de collision

Implémentation de la collision des humains numériques

Comme le système de collision du SDK n'agit pas sur le Rigidbody de Unity, la collision des humains numériques (personnages) doit être pilotée par les méthodes de détection. Il existe trois approches courantes :

  • Détection à double rayon : utilisez RaycastMesh() pour émettre un rayon vers le bas et un vers l'avant, et jugez si le personnage peut marcher en fonction des résultats de retour des rayons (sondez le sol vers le bas, sondez les obstacles vers l'avant).
  • Détection par capsule : utilisez IntersectsCapsule() pour détecter si la capsule dans laquelle se trouve l'humain numérique intersecte le mesh de collision, et jugez s'il peut marcher. Le _delta de la version surchargée retourne le décalage du prochain point atteignable en toute sécurité.
  • Détection par sphère : utilisez IntersectsSphere() pour détecter si la sphère dans laquelle se trouve l'humain numérique intersecte le mesh de collision, et jugez s'il peut marcher. Le _delta de la version surchargée retourne également le décalage d'un point atteignable en toute sécurité.
Trois approches d'implémentation de la collision des humains numériques : détection à double rayon, par capsule et par sphère

Trois approches d'implémentation de la collision des humains numériques

Choisir entre RaycastMesh et Raycast

Le SDK fournit deux types de méthodes de détection par rayon avec des objectifs différents :

MéthodeCible de détectionPrécisionVitesseScénario applicable
RaycastMesh()Mesh de collision (données Collider)Relativement faibleRapideCollision des humains numériques, détection par image
Raycast()Primitives gaussiennes (ne dépend pas du mesh de collision)Relativement élevéeLenteApplications de type mesure

Raycast() effectue la détection par rayon directement sur les primitives gaussiennes, avec une précision plus élevée mais une vitesse plus lente, et n'est pas recommandé pour les appels par image, il ne convient donc pas à la collision des humains numériques, uniquement à une utilisation de type mesure. Pour la collision des humains numériques, préférez RaycastMesh(), qui dépend du mesh de collision.

API associées

Parmi les méthodes liées à la collision ci-dessous, SetColliderEnable() se trouve sur Renderer, tandis que les méthodes de détection restantes se trouvent sur LCCManager. Toutes les méthodes de détection ne sont disponibles qu'après que la scène a fini de charger et que SetColliderEnable(true) a été appelé avec succès.

SetColliderEnable

// Valeur de retour : bool → true=défini avec succès, false=les données ne contiennent aucun collider ou l'instance n'est pas active
public bool SetColliderEnable(bool _enable)

Active/désactive la fonctionnalité de collider. Après l'activation, IntersectsSphere / IntersectsCapsule / RaycastMesh deviennent disponibles.

ParamètreTypeDescription
_enableboolS'il faut activer le collider

Exemple d'utilisation :

bool ok = renderer.SetColliderEnable(true);
if (!ok) Debug.LogWarning("Les données ne contiennent aucun collider");

Description :

  • Les données doivent contenir des données de collision (Mesh), sinon cela retourne false.
  • Nécessite que le Renderer soit dans un état actif.

RaycastMesh (coordonnées écran)

// Valeur de retour : bool → true=impact
public bool RaycastMesh(Vector3 mousePos, out HitResult _finalResult, float _disatnce = 70.0f)

Émet un rayon depuis des coordonnées écran pour détecter le mesh de collision. Utilise les données Collider pour la détection, plus rapide que Raycast mais avec une précision plus faible.

ParamètreTypeDescription
mousePosVector3Coordonnées écran
_finalResultout HitResultRésultat de l'impact
_disatncefloatDistance de détection maximale, défaut 70.0

Exemple d'utilisation :

if (m_manager.RaycastMesh(Input.mousePosition, out HitResult hit))
{
    Debug.Log(hit.hitPos);
}

Description :

  • Nécessite que la collision soit d'abord activée avec succès.
  • Nécessite d'abord d'appeler SetColliderEnable(true).

RaycastMesh (Ray + Bounds)

// Valeur de retour : bool → true=impact
public bool RaycastMesh(Ray ray, out HitResult result, out Bounds hitBounds, float maxDist = 70.0f)

Utilise un Ray personnalisé pour la détection du mesh de collision, et retourne également les informations de boîte englobante du nœud impacté.

ParamètreTypeDescription
rayRayLe rayon
resultout HitResultRésultat de l'impact
hitBoundsout BoundsBoîte englobante du nœud impacté (boîte englobante du nœud LOD impacté)
maxDistfloatDistance de détection maximale, défaut 70.0

Exemple d'utilisation :

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (m_manager.RaycastMesh(ray, out HitResult hit, out Bounds bounds))
{
    Debug.Log(bounds.center);
}

Description :

  • Nécessite que la collision soit d'abord activée avec succès.
  • Cette méthode est couramment utilisée pour la détection à double rayon (vers le bas, vers l'avant) afin de juger si un humain numérique peut marcher.

IntersectsSphere

// Valeur de retour : bool → true=intersection
public bool IntersectsSphere(Sphere sphere)

// Valeur de retour : bool → true=intersection
public bool IntersectsSphere(Sphere sphere, out Vector3 delta)

Détecte si une sphère intersecte le mesh de collision. La deuxième surcharge retourne en plus le vecteur de pénétration delta (direction et distance de poussée), qui peut être utilisé pour calculer le prochain point atteignable en toute sécurité.

ParamètreTypeDescription
sphereSphereLa sphère à détecter
deltaout Vector3Vecteur de pénétration (direction et distance de poussée)

Exemple d'utilisation :

var sphere = new Sphere(transform.position, 0.5f);
if (m_manager.IntersectsSphere(sphere, out Vector3 delta))
{
    transform.position += delta;
}

Description :

  • Nécessite que la collision soit d'abord activée avec succès.
  • Nécessite d'abord d'appeler SetColliderEnable(true).
  • Itère sur tous les Renderers actifs.

IntersectsCapsule

// Valeur de retour : bool → true=intersection
public bool IntersectsCapsule(Capsule capsule)

// Valeur de retour : bool → true=intersection
public bool IntersectsCapsule(Capsule capsule, out Vector3 delta)

Détecte si une capsule intersecte le mesh de collision. Couramment utilisé pour la détection de collision des contrôleurs de personnage. La deuxième surcharge retourne le vecteur de pénétration delta, qui peut être utilisé comme décalage vers le prochain point atteignable en toute sécurité pour un humain numérique.

ParamètreTypeDescription
capsuleCapsuleLa capsule à détecter
deltaout Vector3Vecteur de pénétration

Exemple d'utilisation :

var capsule = new Capsule(footPos, headPos, 0.3f);
if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
{
    characterController.Move(delta);
}

Description :

  • Nécessite que les données contiennent des nœuds de collision.
  • Nécessite d'abord d'appeler SetColliderEnable(true).
  • Convient à la collision de personnage à la première / troisième personne.

Raycast

// Valeur de retour : bool → true=impact
public bool Raycast(Ray _ray, out HitResult _finalResult)

Utilise un Ray personnalisé pour effectuer la détection par rayon sur les primitives gaussiennes, itérant sur tous les Renderers actifs et retournant l'impact le plus proche. Ne dépend pas du mesh de collision ; précision plus élevée mais plus lent.

ParamètreTypeDescription
_rayRayLe rayon
_finalResultout HitResultRésultat de l'impact

Exemple d'utilisation :

Ray ray = new Ray(origin, direction);
if (m_manager.Raycast(ray, out HitResult hit))
{
    Debug.Log(hit.hitPos);
}

Description :

  • Ne dépend pas du mesh de collision, pas besoin de SetColliderEnable.
  • Précision plus élevée mais plus lent, non recommandé pour les appels par image, convient aux applications de type mesure, pas à la collision des humains numériques.

HitResult

Les résultats d'impact des méthodes de détection ci-dessus sont retournés via la struct HitResult :

public struct HitResult {
    public bool isHit;             // S'il y a eu impact
    public float distance;         // Distance
    public Vector3 hitPos;         // Coordonnées mondiales du point d'impact (le nom du champ est hitPos, pas position)
    public Vector3 normal;         // Normale d'impact
    public float hitAlpha;         // Alpha de l'ellipsoïde impacté
    public float dist2Origin;      // Distance par rapport à l'origine du rayon
    public float scale;            // Échelle de l'ellipsoïde
}

Remarque :

Le nom du champ des coordonnées mondiales du point d'impact est hitPos, pas position ; accédez-y par le nom de champ réel.