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

    • PortalCam P1

      • Przegląd produktu
      • Podstawowa obsługa
      • Korzystanie z aplikacji LCC Scan
      • Konserwacja i pielęgnacja
      • FAQ
  • Seria Lixel K

    • Lixel K1

      • Przegląd produktu
      • Podstawowa obsługa
      • Aktywacja i połączenie urządzenia
      • Przebieg skanowania
      • Pozyskiwanie danych chmury punktów ze współrzędnymi bezwzględnymi
      • Fuzja map
      • Zalecenia dotyczące planowania trasy dla typowych scen
      • Środki ostrożności
      • FAQ
    • Lixel K2

      • Przegląd produktu
      • Podstawowa obsługa
      • Aktywacja i połączenie urządzenia
      • Przebieg skanowania
      • Pozyskiwanie danych chmury punktów ze współrzędnymi bezwzględnymi
      • Fuzja map
      • Zalecenia dotyczące planowania trasy dla typowych scen
      • Środki ostrożności
      • FAQ
  • Seria Lixel L

    • Lixel L2 Pro

      • Przegląd produktu
      • Podstawowa obsługa
      • Aktywacja i połączenie urządzenia
      • Proces skanowania
      • Pozyskiwanie danych chmury punktów ze współrzędnymi bezwzględnymi
      • Punkt pomiarowy
      • Dodatek
      • FAQ
    • Lixel L3

      • Przegląd produktu
      • Podstawowe funkcje urządzenia
      • Aktywacja i połączenie urządzenia
      • Przechwytywanie danych
      • Przechwytywanie współrzędnych bezwzględnych
      • Dodatek
  • Akcesoria

    • Stick Light

      • Przewodnik instalacji
      • Podstawowa obsługa
      • Często zadawane pytania
  • Lixel Studio

    • Wersja i prawa autorskie
    • Instalacja i aktywacja
    • Interfejs oprogramowania
    • Operacje na plikach
    • Przetwarzanie projektu
    • Narzędzia
    • Rysowanie 2D
    • Zastosowania
    • Ustawienia
    • Połączenie z urządzeniem
  • 07-plugin-sdk

    • Unity

      • Wprowadzenie do Unity SDK
      • Funkcje techniczne
      • Wymagania środowiska deweloperskiego
      • Przewodnik szybkiego startu dla PC
      • Przewodnik optymalizacji ustawień projektu
      • Przewodnik deweloperski dla Pico 4 Ultra
      • Przewodnik strumieniowania PC dla Pico 4 Ultra
      • Przewodnik deweloperski dla Quest 3
      • Przewodnik strumieniowania PC dla Quest 3
      • Przewodnik deweloperski dla OpenXR
      • Przewodnik Business Streaming dla Pico 4 Ultra
      • Słownik
      • Często zadawane pytania (FAQ)
      • Skontaktuj się z nami
      • Przewodnik programowania funkcji

        • Przewodnik mieszanego renderowania wielu scen
        • Przewodnik odbierania cieni
        • Przewodnik oświetlenia w czasie rzeczywistym
        • Przewodnik renderowania wielokamerowego
        • Przewodnik renderowania obrazów wysokiej rozdzielczości
        • Przewodnik zgodności formatów danych LCC i LCC2
        • Przewodnik efektu ładowania
        • Przewodnik przełączania trybu renderowania Mip
        • Przewodnik przyciągania do krawędzi i narożników
        • Przewodnik dekala projekcyjnego
        • Przewodnik wideo dekala projekcyjnego
        • Przewodnik podświetlania
        • Przewodnik przycinania w czasie rzeczywistym
        • Przewodnik korekcji kolorów
        • Przewodnik pobierania danych siatki sceny
        • Przewodnik trybu edytora
        • Przewodnik konfiguracji parametrów wydajności renderowania
        • Przewodnik współpakowania aplikacji i danych
        • Przewodnik systemu kolizji
        • Przewodnik problemów z uprawnieniami w deweloperstwie na macOS
        • Przewodnik kompilacji i pakowania na urządzenia iOS
      • Dokumentacja API

        • LCCManager
        • Renderer
        • Typy danych
      • Dziennik zmian

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

Przewodnik systemu kolizji

LCC Unity SDK ma wbudowany system kolizji, skoncentrowany na rozwiązywaniu przyspieszania konstrukcji koliderów i wykrywania kolizji — czyli problemu wydajności kolizji. System Collider Unity nie radzi sobie z wykrywaniem w czasie rzeczywistym w bardzo dużych scenach.

LCC Unity SDK używa własnego wbudowanego systemu kolizji, nie polegając już na komponencie MeshCollider Unity i powiązanych możliwościach, więc nie może bezpośrednio działać na GameObjects w scenie Unity. Oficjalny format danych LCC generowany przez XGrids (LCC Studio) generuje dane siatki używane do kolizji podczas rekonstrukcji w tym samym czasie, a SDK używa tych danych kolizji do szybkiego i wydajnego budowania kolizji sceny. Ponieważ jest to samodzielny system kolizji, użycie funkcji kolizji wymaga wywołania odpowiednich metod udostępnianych przez SDK.

Uwaga:

Wbudowany system kolizji SDK jest niekompatybilny z systemem Collider Unity i nie może bezpośrednio działać na obiektach Rigidbody w Unity. Kolizja postaci, takich jak cyfrowi ludzie, musi być napędzana metodami wykrywania SDK (zobacz „Implementacja kolizji cyfrowego człowieka" poniżej).

Dla scen stałych możesz również wyodrębnić dane siatki i wypiec je wcześniej w NavMesh, co może być kompatybilne z systemem Collider Unity; szczegóły znajdziesz w przewodniku NavMesh.

Wymagania wstępne danych

Warunkiem zadziałania wykrywania kolizji jest to, że scena ma odpowiednie dane kolizji. Dane rekonstruowane we wcześniejszych wersjach mogą nie zawierać danych kolizji; w takim przypadku wywołanie SetColliderEnable(true) zwraca false, a wszystkie późniejsze metody wykrywania są niedostępne.

Dlatego po włączeniu kolizji koniecznie sprawdź wartość zwracaną:

bool ok = renderer.SetColliderEnable(true);
if (!ok)
{
    Debug.LogWarning("Bieżące dane nie zawierają kolidera, nie można włączyć wykrywania kolizji");
}

Podstawowy przepływ użycia

Podstawowy przepływ funkcji kolizji ma trzy kroki:

  1. Załaduj dane sceny przez metodę Load().
  2. W wywołaniu zwrotnym zakończenia ładowania włącz kolizję przez SetColliderEnable(true).
  3. Wykonuj wykrywanie kolizji przez różne metody wykrywania (RaycastMesh / IntersectsSphere / IntersectsCapsule).
// 1. Załaduj scenę
renderer.Load(dataPath, onProgress: null, onComplete: () =>
{
    // 2. Włącz kolizję po zakończeniu ładowania
    if (renderer.SetColliderEnable(true))
    {
        colliderReady = true;
    }
});

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

    // 3. Wykonuj wykrywanie kolizji co klatkę
    var capsule = new Capsule(footPos, headPos, 0.3f);
    if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
    {
        characterController.Move(delta);
    }
}

Uwaga:

SetColliderEnable() jest metodą Renderer, natomiast metody wykrywania (RaycastMesh / IntersectsSphere / IntersectsCapsule / Raycast) znajdują się w LCCManager. Wywołuj je odpowiednio na odpowiednich obiektach.

Podstawowy przepływ systemu kolizji: załaduj scenę → włącz kolizję → wykrywanie kolizji

Podstawowy przepływ systemu kolizji

Implementacja kolizji cyfrowego człowieka

Ponieważ system kolizji SDK nie działa na Rigidbody Unity, kolizja dla cyfrowych ludzi (postaci) musi być napędzana metodami wykrywania. Istnieją trzy popularne podejścia:

  • Wykrywanie podwójnym promieniem: użyj RaycastMesh(), aby wystrzelić jeden promień w dół i jeden do przodu, i oceniaj, czy postać może iść, na podstawie wyników zwracanych przez promień (sonda podłoża w dół, sonda przeszkód do przodu).
  • Wykrywanie kapsułą: użyj IntersectsCapsule(), aby wykryć, czy kapsuła, w której znajduje się cyfrowy człowiek, przecina siatkę kolizji, i oceniaj, czy może iść. Przeciążona wersja _delta zwraca przesunięcie następnego bezpiecznie osiągalnego punktu.
  • Wykrywanie sferą: użyj IntersectsSphere(), aby wykryć, czy sfera, w której znajduje się cyfrowy człowiek, przecina siatkę kolizji, i oceniaj, czy może iść. Przeciążona wersja _delta również zwraca przesunięcie bezpiecznie osiągalnego punktu.
Trzy podejścia implementacji kolizji cyfrowego człowieka: wykrywanie podwójnym promieniem, kapsułą i sferą

Trzy podejścia implementacji kolizji cyfrowego człowieka

Wybór między RaycastMesh a Raycast

SDK udostępnia dwa typy metod wykrywania promieniem o różnych celach:

MetodaCel wykrywaniaPrecyzjaSzybkośćZastosowanie
RaycastMesh()Siatka kolizji (dane Collidera)Stosunkowo niskaSzybkaKolizja cyfrowego człowieka, wykrywanie co klatkę
Raycast()Prymitywy gaussowskie (nie polega na siatce kolizji)Stosunkowo wysokaWolnaAplikacje typu pomiarowego

Raycast() wykonuje wykrywanie promieniem bezpośrednio na prymitywach gaussowskich, z wyższą precyzją, ale wolniej, i nie jest zalecany do wywołań co klatkę, więc nie nadaje się do kolizji cyfrowego człowieka, tylko do użycia pomiarowego. Dla kolizji cyfrowego człowieka preferuj RaycastMesh(), który polega na siatce kolizji.

Powiązane API

Spośród poniższych metod związanych z kolizją SetColliderEnable() znajduje się w Renderer, a pozostałe metody wykrywania w LCCManager. Wszystkie metody wykrywania są dostępne tylko po zakończeniu ładowania sceny i pomyślnym wywołaniu SetColliderEnable(true).

SetColliderEnable

// Wartość zwracana: bool → true=ustawiono pomyślnie, false=dane nie zawierają kolidera lub instancja nie jest aktywna
public bool SetColliderEnable(bool _enable)

Przełącza funkcję kolidera. Po włączeniu IntersectsSphere / IntersectsCapsule / RaycastMesh stają się dostępne.

ParametrTypOpis
_enableboolCzy włączyć kolider

Przykład użycia:

bool ok = renderer.SetColliderEnable(true);
if (!ok) Debug.LogWarning("Dane nie zawierają kolidera");

Opis:

  • Dane muszą zawierać dane kolizji (siatki), w przeciwnym razie zwraca false.
  • Wymaga, aby Renderer był w stanie aktywnym.

RaycastMesh (współrzędne ekranu)

// Wartość zwracana: bool → true=trafienie
public bool RaycastMesh(Vector3 mousePos, out HitResult _finalResult, float _disatnce = 70.0f)

Wystrzeliwuje promień ze współrzędnych ekranu, aby wykryć siatkę kolizji. Używa danych Collidera do wykrywania, szybciej niż Raycast, ale z niższą precyzją.

ParametrTypOpis
mousePosVector3Współrzędne ekranu
_finalResultout HitResultWynik trafienia
_disatncefloatMaksymalna odległość wykrywania, domyślnie 70.0

Przykład użycia:

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

Opis:

  • Wymaga wcześniejszego pomyślnego włączenia kolizji.
  • Wymaga wcześniejszego wywołania SetColliderEnable(true).

RaycastMesh (Ray + Bounds)

// Wartość zwracana: bool → true=trafienie
public bool RaycastMesh(Ray ray, out HitResult result, out Bounds hitBounds, float maxDist = 70.0f)

Używa własnego Ray do wykrywania siatki kolizji, a także zwraca informacje o prostokącie ograniczającym trafionego węzła.

ParametrTypOpis
rayRayPromień
resultout HitResultWynik trafienia
hitBoundsout BoundsProstokąt ograniczający trafionego węzła (prostokąt ograniczający trafionego węzła LOD)
maxDistfloatMaksymalna odległość wykrywania, domyślnie 70.0

Przykład użycia:

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

Opis:

  • Wymaga wcześniejszego pomyślnego włączenia kolizji.
  • Ta metoda jest powszechnie używana do wykrywania podwójnym promieniem (w dół, do przodu), aby ocenić, czy cyfrowy człowiek może iść.

IntersectsSphere

// Wartość zwracana: bool → true=przecięcie
public bool IntersectsSphere(Sphere sphere)

// Wartość zwracana: bool → true=przecięcie
public bool IntersectsSphere(Sphere sphere, out Vector3 delta)

Wykrywa, czy sfera przecina siatkę kolizji. Drugie przeciążenie dodatkowo zwraca wektor penetracji delta (kierunek i odległość wypchnięcia), który można wykorzystać do obliczenia następnego bezpiecznie osiągalnego punktu.

ParametrTypOpis
sphereSphereSfera do wykrycia
deltaout Vector3Wektor penetracji (kierunek i odległość wypchnięcia)

Przykład użycia:

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

Opis:

  • Wymaga wcześniejszego pomyślnego włączenia kolizji.
  • Wymaga wcześniejszego wywołania SetColliderEnable(true).
  • Iteruje po wszystkich aktywnych Rendererach.

IntersectsCapsule

// Wartość zwracana: bool → true=przecięcie
public bool IntersectsCapsule(Capsule capsule)

// Wartość zwracana: bool → true=przecięcie
public bool IntersectsCapsule(Capsule capsule, out Vector3 delta)

Wykrywa, czy kapsuła przecina siatkę kolizji. Powszechnie używane do wykrywania kolizji kontrolera postaci. Drugie przeciążenie zwraca wektor penetracji delta, który można wykorzystać jako przesunięcie do następnego bezpiecznie osiągalnego punktu dla cyfrowego człowieka.

ParametrTypOpis
capsuleCapsuleKapsuła do wykrycia
deltaout Vector3Wektor penetracji

Przykład użycia:

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

Opis:

  • Wymaga, aby dane zawierały węzły kolizji.
  • Wymaga wcześniejszego wywołania SetColliderEnable(true).
  • Odpowiednie do kolizji postaci pierwszoosobowej / trzecioosobowej.

Raycast

// Wartość zwracana: bool → true=trafienie
public bool Raycast(Ray _ray, out HitResult _finalResult)

Używa własnego Ray do wykrywania promieniem na prymitywach gaussowskich, iterując po wszystkich aktywnych Rendererach i zwracając najbliższe trafienie. Nie polega na siatce kolizji; wyższa precyzja, ale wolniejsze.

ParametrTypOpis
_rayRayPromień
_finalResultout HitResultWynik trafienia

Przykład użycia:

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

Opis:

  • Nie polega na siatce kolizji, nie wymaga SetColliderEnable.
  • Wyższa precyzja, ale wolniejsze, nie zalecane do wywołań co klatkę, odpowiednie do aplikacji pomiarowych, nie do kolizji cyfrowego człowieka.

HitResult

Wyniki trafień powyższych metod wykrywania są zwracane przez strukturę HitResult:

public struct HitResult {
    public bool isHit;             // Czy trafiono
    public float distance;         // Odległość
    public Vector3 hitPos;         // Współrzędne świata punktu trafienia (nazwa pola to hitPos, nie position)
    public Vector3 normal;         // Normalna trafienia
    public float hitAlpha;         // Alfa trafionej elipsoidy
    public float dist2Origin;      // Odległość do początku promienia
    public float scale;            // Skala elipsoidy
}

Uwaga:

Nazwa pola współrzędnych świata punktu trafienia to hitPos, nie position; uzyskuj do niego dostęp według rzeczywistej nazwy pola.