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) Dies funktioniert nur, wenn Depth aktiviert ist.

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 herum, 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.
}

Einen Raycast mit einem beliebigen Strahlen und einer beliebigen Richtung durchfü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.

Mit ARRaycastHit einen Anker 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)

Dauerhafte Raycasts verwenden die Bildschirmposition und die geschätzte Entfernung zu einer Oberfläche als Eingabe, um eine neue ARRaycast zu erstellen, mit der Sie AR-Inhalte in Ihrer Szene platzieren. In ARCore wird dies als Instant Placement bezeichnet.

Rufen Sie ARRaycastManager.AddRaycast() auf, um eine ARRaycast zu erstellen, die so lange automatisch aktualisiert wird, bis Sie ARRaycastManager.RemoveRaycast() aufrufen oder ARRaycastManager deaktivieren.

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 Abstandsänderung kann sich auf die sichtbare „Größe“ oder die wahrgenommene Größe des Objekts auswirken.

Weiteres Vorgehen