Raycasts in deiner Unity App (AR Foundation) ausführen

Führen Sie einen raycast oder einen Treffertest durch, um die korrekte Platzierung eines 3D-Objekts in Ihrer Szene zu bestimmen. Durch die richtige Platzierung werden die AR-Inhalte in der richtigen (scheinbaren) Größe gerendert.

Trefferergebnistypen

Ein Treffertest kann vier verschiedene Arten von Trefferergebnissen liefern, wie in der folgenden Tabelle dargestellt.

Trefferergebnistyp Beschreibung Ausrichtung Anwendungsfall Methodenaufrufe
Tiefe Ermittelt anhand von Tiefeninformationen aus der gesamten Szene die korrekte Tiefe und Ausrichtung eines Punkts. Senkrecht zur 3D-Oberfläche Virtuelle Objekte auf einer beliebigen Oberfläche platzieren (nicht nur auf Böden und Wänden) Depth muss aktiviert sein, damit dies funktioniert.

ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.Depth)
Flugzeug Trifft auf horizontale und/oder vertikale Oberflächen, um die richtige Tiefe und Ausrichtung eines Punkts zu bestimmen Senkrecht zur 3D-Oberfläche Platzieren Sie ein Objekt auf einer Ebene (Boden oder Wand) unter Verwendung der vollständigen Geometrie der Ebene. Die richtige Skalierung ist sofort erforderlich. Fallback für den Tiefen-Treffertest ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.PlaneWithinPolygon)
Punktelement Nutzt visuelle Merkmale um den Punkt, an dem ein Nutzer getippt hat, um die richtige Position und Ausrichtung eines Punkts zu bestimmen Senkrecht zur 3D-Oberfläche Objekte auf einer beliebigen Oberfläche platzieren (nicht nur auf Böden und Wänden) ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.FeaturePoint)
Persistent Raycast (Sofortiges Placement) Nutzt den gesamten Bildschirm für die Platzierung von Inhalten. Zuerst wird die von der App geschätzte Tiefe verwendet. Funktioniert sofort, aber Haltung und tatsächliche Tiefe ändern sich, sobald ARCore die tatsächliche Szenengeometrie bestimmen kann. +Y nach oben, entgegen der Schwerkraft Platzieren Sie ein Objekt auf einer Ebene (Boden oder Wand) unter Verwendung der vollständigen Geometrie der Ebene, wenn eine schnelle Platzierung entscheidend ist und die Oberfläche unbekannte Anfangstiefe und -skala zulassen kann. ARRaycastManager.AddRaycast(Vector2 screenPoint, float estimatedDistance)

Standard-Raycast ausführen

Rufen Sie ARRaycastManager.Raycast(Vector2, List<ARRaycastHit>, TrackableType) auf, um einen Raycast (Treffertest) durchzuführen. ARRaycastManager unterstützt alle TrackableTypes.

var touch = Input.GetTouch(0);
if (touch.phase != TouchPhase.Began)
    return;

// Raycast against planes and feature points.
const TrackableType trackableTypes =
    TrackableType.FeaturePoint |
    TrackableType.PlaneWithinPolygon;
List<ARRaycastHit> hits = new List<ARRaycastHit>();
// Perform the raycast.
if (raycastManager.Raycast(touch.position, hits, trackableTypes))
{
    // Raycast hits are sorted by distance, so the first one will be the closest hit.
    var hit = hits[0];
    // Do something with hit.
}

Raycast mit einem beliebigen Strahl und einer beliebigen Richtung ausführen

Raycasts werden in der Regel als Strahlen vom Gerät oder von der Gerätekamera behandelt. Mit Raycast(Ray, List<ARRaycastHit>, TrackableType) können Sie jedoch einen Raycast mit einem beliebigen Strahl in Weltraumkoordinaten anstelle eines Bildschirmraumpunkts ausführen.

Anker mit einem ARRaycastHit erstellen

Sobald Sie einen Raycast-Treffer haben, erstellen Sie mit GameObject.AddComponent<ARAnchor> einen Anchor und fügen Sie ihn als Komponente zu GameObject hinzu. Verwenden Sie dabei den Raycast-Treffer als Eingabe. Die ARAnchor-Komponente aktualisiert kontinuierlich den Transform des Spielobjekts, damit das Spielobjekt für das Trefferergebnis mit dem zugrunde liegenden Trackable verbunden bleibt.

Persistente Raycasts (Instant Placement)

Bei persistenten Raycasts werden eine Bildschirmposition und eine geschätzte Entfernung zu einer Oberfläche als Eingabe verwendet, um eine neue ARRaycast zu erstellen, mit der AR-Inhalte in Ihrer Szene platziert werden. In ARCore wird dies als Instant Placement bezeichnet.

Rufe ARRaycastManager.AddRaycast() auf, um eine ARRaycast zu erstellen, die automatisch aktualisiert wird, bis du ARRaycastManager.RemoveRaycast() aufrufst oder die ARRaycastManager deaktivierst.

Die Entfernung der ARRaycast entspricht anfangs der Entfernung, die im AddRaycast()-Aufruf angegeben wurde. Sobald ARCore die lokale Geometrie kartografiert und eine sich schneidende Ebene gefunden hat, wird die Entfernung auf die tatsächliche Entfernung aktualisiert. Die Entfernung kann sich auf die scheinbare Größe oder den wahrgenommenen Maßstab des Objekts auswirken.

Weiteres Vorgehen