Namensstring
XR_ANDROID_raycast
Erweiterungstyp
Instanzerweiterung
Registrierte Durchwahlnummer
464
Revision
1
Erweiterungs- und Versionsabhängigkeiten
Datum der letzten Änderung
2024-10-02
IP-Status
Es sind keine Ansprüche aufgrund von Urheberrechten bekannt.
Mitwirkende
Spencer Quin, Google
Nihav Jain, Google
John Pursey, Google
Jared Finder, Google
Levana Chen, Google
Kenny Vercaemer, Google
Übersicht
Mit dieser Erweiterung kann die Anwendung Raycasts auf Tracker in der Umgebung ausführen. Raycasts können nützlich sein, um Objekte in der Umgebung zu erkennen, die von einem Strahl geschnitten werden. Beispiel:
- Mit einem vertikalen Raycast wird ermittelt, wohin ein schwebendes Objekt fallen würde, wenn es losgelassen wird.
- Hier wird mithilfe eines nach vorne gerichteten Strahls ermittelt, wo ein Nutzer gerade hinsieht.
Unterstützte Raycast-Funktionen abfragen
Die Funktion xrEnumerateRaycastSupportedTrackableTypesANDROID ist so definiert:
XrResult xrEnumerateRaycastSupportedTrackableTypesANDROID(
XrInstance instance,
XrSystemId systemId,
uint32_t trackableTypeCapacityInput,
uint32_t* trackableTypeCountOutput,
XrTrackableTypeANDROID* trackableTypes);
Parameterbeschreibungen
instance
ist die XrInstance, aus dersystemId
abgerufen wurde.systemId
ist dieXrSystemId
, deren unterstützte trackbare Typen für das Raytracing aufgezählt werden.trackableTypeCapacityInput
ist die Kapazität dertrackableTypes
oder 0, um die erforderliche Kapazität abzurufen.trackableTypeCountOutput
ist ein Verweis auf die Anzahl der Elemente im Array oder ein Verweis auf die erforderliche Kapazität, fallstrackableTypeCountOutput
nicht ausreicht.trackableTypeCapacityInput
trackableTypes
ist ein Verweis auf ein Array von XrTrackableTypeANDROID, kann aber auchNULL
sein, wenntrackableTypeCapacityInput
0
ist.
- Eine ausführliche Beschreibung zum Abrufen der erforderlichen
trackableTypes
-Größe findest du im Abschnitt Parameter für die Puffergröße.
xrEnumerateRaycastSupportedTrackableTypesANDROID listet die Trackable-Typen auf, die das Raytracing durch die aktuelle Sitzung unterstützen.
Gültige Verwendung (implizit)
- Die Erweiterung
XR_ANDROID_raycast
muss aktiviert sein, bevor xrEnumerateRaycastSupportedTrackableTypesANDROID aufgerufen wird. instance
muss ein gültiger XrInstance-Alias seintrackableTypeCountOutput
muss ein Verweis auf einenuint32_t
-Wert sein- Wenn
trackableTypeCapacityInput
nicht0
ist, musstrackableTypes
ein Verweis auf ein Array vontrackableTypeCapacityInput
-Werten vom Typ XrTrackableTypeANDROID sein.
Rückgabecodes
XR_SUCCESS
XR_ERROR_VALIDATION_FAILURE
XR_ERROR_RUNTIME_FAILURE
XR_ERROR_HANDLE_INVALID
XR_ERROR_INSTANCE_LOST
XR_ERROR_SIZE_INSUFFICIENT
XR_ERROR_SYSTEM_INVALID
XR_ERROR_FUNCTION_UNSUPPORTED
Raycast ausführen
Die Funktion xrRaycastANDROID ist so definiert:
XrResult xrRaycastANDROID(
XrSession session,
const XrRaycastInfoANDROID* rayInfo,
XrRaycastHitResultsANDROID* results);
Parameterbeschreibungen
session
ist die XrSession, die den Raycast ausführt.rayInfo
ist die XrRaycastInfoANDROID, die den zu werfenden Strahl beschreibt.results
ist ein Verweis auf die XrRaycastHitResultsANDROID, die die Ergebnisse des Raycasts empfängt.
Die Anwendung kann Raycasts ausführen, indem xrRaycastANDROID aufgerufen wird.
- Wenn ein Raycast mehr Trackables als XrRaycastHitResultsANDROID::maxResults schneidet, muss die Laufzeit die Trefferergebnisse zurückgeben, die dem Ursprung XrRaycastHitResultsANDROID::origin des Strahls am nächsten sind.
- Wenn ein Raycast ein Trackable vom Typ
XR_TRACKABLE_TYPE_ANDROID_PLANE
schneidet, das von einer anderen Ebene überdeckt wird, muss die Laufzeit nur das Trefferergebnis für die überdeckende Ebene zurückgeben. - Die Laufzeit muss die Trefferergebnisse in der Reihenfolge von „am nächsten“ bis „am weitesten entfernt“ von XrRaycastInfoANDROID::origin entlang des Vektors XrRaycastInfoANDROID::trajectory zurückgeben.
- Die Laufzeit muss
XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROID
zurückgeben, wenn der Trackable-Typ, der den XrTrackableTrackerANDROID-Handles in XrRaycastInfoANDROID::trackers entspricht, nicht von xrEnumerateRaycastSupportedTrackableTypesANDROID aufgelistet wird.
Gültige Verwendung (implizit)
- Die Erweiterung
XR_ANDROID_raycast
muss aktiviert sein, bevor xrRaycastANDROID aufgerufen wird. session
muss ein gültiger XrSession-Alias sein.rayInfo
muss ein Verweis auf eine gültige XrRaycastInfoANDROID-Struktur seinresults
muss ein Verweis auf eine XrRaycastHitResultsANDROID-Struktur sein
Rückgabecodes
XR_SUCCESS
XR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTED
XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROID
XR_ERROR_VALIDATION_FAILURE
XR_ERROR_RUNTIME_FAILURE
XR_ERROR_HANDLE_INVALID
XR_ERROR_INSTANCE_LOST
XR_ERROR_SESSION_LOST
XR_ERROR_OUT_OF_MEMORY
XR_ERROR_LIMIT_REACHED
XR_ERROR_POSE_INVALID
XR_ERROR_TIME_INVALID
XR_ERROR_FEATURE_UNSUPPORTED
Die Struktur XrRaycastInfoANDROID ist so definiert:
typedef struct XrRaycastInfoANDROID {
XrStructureType type;
void* next;
uint32_t maxResults;
uint32_t trackerCount;
const XrTrackableTrackerANDROID* trackers;
XrVector3f origin;
XrVector3f trajectory;
XrSpace space;
XrTime time;
} XrRaycastInfoANDROID;
Beschreibungen von Mitgliedern
type
ist der XrStructureType dieser Struktur.next
istNULL
oder ein Zeiger auf die nächste Struktur in einer Strukturkette. Solche Strukturen sind in OpenXR oder dieser Erweiterung nicht definiert.maxResults
ist die maximale Anzahl vonuint32_t
zurückzugebenden Ergebnissen.trackerCount
ist dieuint32_t
-Anzahl destrackers
-Arrays.trackers
ist das Array von XrTrackableTrackerANDROID, an dem der gestreamte Strahl geprüft werden sollte.origin
ist der XrVector3f, von dem aus der Strahl gesendet wird.trajectory
ist der XrVector3f, auf den der Strahl ausgerichtet ist.space
ist der XrSpace, in dem der Strahl geworfen wird.time
ist derXrTime
, auf den der Strahl geworfen wird.
Die Struktur XrRaycastInfoANDROID beschreibt den zu werfenden Strahl.
- Das Array XrRaycastInfoANDROID::trackers kann Tracker verschiedener Typen enthalten.
- Das Array XrRaycastInfoANDROID::trackers darf nicht mehrere Tracker desselben Typs enthalten. Andernfalls muss die Laufzeit
XR_ERROR_VALIDATION_FAILURE
zurückgeben.
Gültige Verwendung (implizit)
- Die Erweiterung
XR_ANDROID_raycast
muss aktiviert sein, bevor XrRaycastInfoANDROID verwendet werden kann. type
mussXR_TYPE_RAYCAST_INFO_ANDROID
sein.next
mussNULL
oder ein gültiger Zeiger auf die nächste Struktur in einer Strukturkette sein.trackers
muss ein Verweis auf ein Array vontrackerCount
gültigen XrTrackableTrackerANDROID-Handlen sein.space
muss ein gültiger XrSpace-Handle sein- Der Parameter
trackerCount
muss größer als0
sein. - Sowohl
space
als auch die Elemente vontrackers
müssen in derselben XrSession erstellt, zugewiesen oder abgerufen worden sein.
Die Struktur XrRaycastHitResultsANDROID ist so definiert:
typedef struct XrRaycastHitResultsANDROID {
XrStructureType type;
void* next;
uint32_t resultsCapacityInput;
uint32_t resultsCountOutput;
XrRaycastHitResultANDROID* results;
} XrRaycastHitResultsANDROID;
Beschreibungen von Mitgliedern
type
ist der XrStructureType dieser Struktur.next
istNULL
oder ein Zeiger auf die nächste Struktur in einer Strukturkette. Solche Strukturen sind in OpenXR oder dieser Erweiterung nicht definiert.resultsCapacityInput
ist die Kapazität desresults
-Arrays oder 0, um eine Anfrage zum Abrufen der erforderlichen Kapazität anzugeben.resultsCountOutput
ist ein Verweis auf die Anzahl der geschriebenenresults
oder ein Verweis auf die erforderliche Kapazität, fallsresultsCapacityInput
nicht ausreicht.results
ist ein Verweis auf ein Array von XrRaycastHitResultANDROID-Strukturen. Es kannNULL
sein, wennresultsCapacityInput
0 ist.- Eine ausführliche Beschreibung zum Abrufen der erforderlichen
results
-Größe findest du im Abschnitt Parameter für die Puffergröße.
XrRaycastHitResultsANDROID enthält das Array der Treffer eines Raycasts.
Die Laufzeit muss resultsCountOutput
auf einen Wert festlegen, der kleiner oder gleich XrRaycastInfoANDROID::maxResults ist.
Gültige Verwendung (implizit)
- Die Erweiterung
XR_ANDROID_raycast
muss aktiviert sein, bevor XrRaycastHitResultsANDROID verwendet werden kann. type
mussXR_TYPE_RAYCAST_HIT_RESULTS_ANDROID
sein.next
mussNULL
oder ein gültiger Zeiger auf die nächste Struktur in einer Strukturkette sein.results
muss ein Verweis auf ein Array vonresultsCapacityInput
XrRaycastHitResultANDROID-basierten Strukturen sein.- Der Parameter
resultsCapacityInput
muss größer als0
sein.
Die Struktur XrRaycastHitResultANDROID ist so definiert:
typedef struct XrRaycastHitResultANDROID {
XrTrackableTypeANDROID type;
XrTrackableANDROID trackable;
XrPosef pose;
} XrRaycastHitResultANDROID;
Beschreibungen von Mitgliedern
type
ist der XrTrackableTypeANDROID des Objekts, das vom Raycast getroffen wurde.trackable
ist dieXrTrackableANDROID
, auf die der Raycast trifft, oderXR_NULL_TRACKABLE_ANDROID
, wenn die trackbaretype
XR_TRACKABLE_TYPE_DEPTH_ANDROID
war.pose
ist die XrPosef, auf die der Raycast trifft.
XrRaycastHitResultANDROID enthält die Details eines Raycast-Treffers.
Die XrRaycastHitResultANDROID::pose für einen Flächeneinschlag muss so sein, dass X und Z parallel zur Fläche und die Y-Achse normal zur Fläche ist.
Art des trackbaren Treffers |
Beschreibung |
|
Trifft auf horizontale und/oder vertikale Oberflächen, um die richtige Tiefe und Ausrichtung eines Punkts zu bestimmen. |
|
Es werden Tiefeninformationen aus der gesamten Szene verwendet, um die richtige Tiefe und Ausrichtung eines Punkts zu bestimmen. |
Gültige Verwendung (implizit)
- Die Erweiterung
XR_ANDROID_raycast
muss aktiviert sein, bevor XrRaycastHitResultANDROID verwendet werden kann. type
muss ein gültiger Wert für XrTrackableTypeANDROID sein
Beispielcode für Raytracing
Im folgenden Beispielcode wird gezeigt, wie Sie Raycasts ausführen.
XrSession session; // previously initialized
XrTime updateTime; // previously initialized
XrSpace appSpace; // space created for XR_REFERENCE_SPACE_TYPE_LOCAL.
XrPosef headPose; // latest pose of the HMD.
XrTrackableTrackerANDROID planeTracker; // tracker for plane trackables.
XrTrackableTrackerANDROID depthTracker; // tracker for depth trackables.
// Perform a raycast against multiple trackers.
XrTrackableTrackerANDROID trackers[] = {
&planeTracker,
&depthTracker,
};
XrRaycastInfoANDROID rayInfo = {XR_TYPE_RAYCAST_INFO_ANDROID};
rayInfo.trackerCount = sizeof(trackers) / sizeof(XrTrackableTrackerANDROID);
rayInfo.trackers = trackers;
rayInfo.origin = headPose.position;
rayInfo.trajectory = CalculateForwardDirectionFromHeadPose(headPose);
rayInfo.space = appSpace;
rayInfo.time = updateTime;
uint32_t totalHitResults = 0;
constexpr uint32 NUM_DESIRED_RESULTS = 2;
XrRaycastHitResultANDROID hitResult[NUM_DESIRED_RESULTS];
XrRaycastHitResultsANDROID hitResults = {XR_TYPE_RAYCAST_HIT_RESULTS_ANDROID};
hitResults.maxResults = NUM_DESIRED_RESULTS;
hitResults.resultsCapacityInput = NUM_DESIRED_RESULTS;
hitResults.results = hitResult;
XrResult result = xrRaycastANDROID(session, &rayInfo, &hitResults);
if (result == XR_SUCCESS && hitResults.resultsCountOutput >= 1) {
// Hit results are returned in closest-to-farthest order in
// hitResults.results[0] .. hitResults.results[hitResults.resultsCountOutput - 1]
}
Neue Enum-Konstanten
Die Aufzählung XrStructureType wurde um folgende Elemente erweitert:
XR_TYPE_RAYCAST_INFO_ANDROID
XR_TYPE_RAYCAST_HIT_RESULTS_ANDROID
Neue Strukturen
Neue Funktionen
Probleme
Versionsverlauf
- Revision 1, 02.10.2024 (Kenny Vercaemer)
- Erste Beschreibung der Erweiterung