Ciąg znaków nazwy
XR_ANDROID_raycast
Typ rozszerzenia
Rozszerzenie instancji
Zarejestrowany numer wewnętrzny
464
Wersja
1
Zależności rozszerzeń i wersji
Data ostatniej modyfikacji
2024-10-02
Stan adresu IP
Brak znanych roszczeń dotyczących praw autorskich do treści objętych ochroną prawną.
Twórcy
Spencer Quin, Google
Nihav Jain, Google
John Pursey, Google
Jared Finder, Google
Levana Chen, Google
Kenny Vercaemer, Google
Omówienie
To rozszerzenie umożliwia aplikacji wykonywanie rzutów promieniowych na obiekty śledzenia w środowisku. Promienie mogą być przydatne do wykrywania obiektów w otoczeniu, z którymi się przecinają. Na przykład:
- Aby określić, gdzie spadnie unoszący się obiekt, użyj pionowego rzutowania promieniowego.
- Aby określić, na co patrzy użytkownik, używając skierowanego do przodu promienia.
Zapytanie o obsługiwane funkcje raycast
Funkcja xrEnumerateRaycastSupportedTrackableTypesANDROID jest zdefiniowana w ten sposób:
XrResult xrEnumerateRaycastSupportedTrackableTypesANDROID(
XrInstance instance,
XrSystemId systemId,
uint32_t trackableTypeCapacityInput,
uint32_t* trackableTypeCountOutput,
XrTrackableTypeANDROID* trackableTypes);
Opisy parametrów
instanceto XrInstance, z którego pobierane są danesystemId.systemIdtoXrSystemId, którego obsługiwane typy śledzonych danych na potrzeby raycastingu są wymieniane.trackableTypeCapacityInputto pojemnośćtrackableTypes, a 0 – wymagana pojemność.trackableTypeCountOutputto wskaźnik do liczby tablicy lub wskaźnik do wymaganej pojemności w przypadku, gdytrackableTypeCapacityInputjest niewystarczający.trackableTypesto wskaźnik do tablicy XrTrackableTypeANDROID, ale może byćNULL, jeślitrackableTypeCapacityInputto0.
- Szczegółowy opis pobierania wymaganego rozmiaru
trackableTypesznajdziesz w sekcji Parametry rozmiaru bufora.
xrEnumerateRaycastSupportedTrackableTypesANDROID wylicza typy śledzonych obiektów, które obsługują rzutowanie promieniowe w ramach bieżącej sesji.
Prawidłowe użycie (domyślne)
- Przed wywołaniem funkcji xrEnumerateRaycastSupportedTrackableTypesANDROID musi być włączona rozszerzenia
XR_ANDROID_raycast. instancemusi być prawidłowym identyfikatorem XrInstancetrackableTypeCountOutputmusi być wskaźnikiem na wartośćuint32_t- Jeśli
trackableTypeCapacityInputnie jest0,trackableTypesmusi być wskaźnikiem do tablicy wartościtrackableTypeCapacityInputXrTrackableTypeANDROID
Kody zwrotne
XR_SUCCESS
XR_ERROR_VALIDATION_FAILUREXR_ERROR_RUNTIME_FAILUREXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_FUNCTION_UNSUPPORTED
Wykonywanie zapytania o przecięciu
Funkcja xrRaycastANDROID jest zdefiniowana w ten sposób:
XrResult xrRaycastANDROID(
XrSession session,
const XrRaycastInfoANDROID* rayInfo,
XrRaycastHitResultsANDROID* results);
Opisy parametrów
sessionto XrSession, która wykonuje rzutowanie promieniowe.rayInfoto XrRaycastInfoANDROID, który opisuje promień do prześwietlenia.resultsto wskaźnik do XrRaycastHitResultsANDROID, który odbiera wyniki rzutowania promienia.
Aplikacja może wykonywać rzutowanie promieniowe, wywołując xrRaycastANDROID.
- Jeśli rzutowanie promienia przecina więcej obiektów śledzenia niż XrRaycastHitResultsANDROID::maxResults, środowisko wykonawcze musi zwrócić wyniki uderzenia, które są najbliższe XrRaycastHitResultsANDROID::origin promienia.
- Jeśli rzut promienia przecina obiekt śledzenia typu
XR_TRACKABLE_TYPE_ANDROID_PLANE, który jest objęty przez inną płaszczyznę, środowisko uruchomieniowe musi zwrócić wynik trafienia tylko dla płaszczyzny objętej. - W czasie wykonywania należy zwracać wyniki uderzenia w kolejności od najbliższego do najdalszego od XrRaycastInfoANDROID::origin wzdłuż wektora XrRaycastInfoANDROID::trajectory.
- Na etapie wykonywania kodu trzeba zwrócić
XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROID, jeśli typ śledzenia odpowiadający XrTrackableTrackerANDROID handle w XrRaycastInfoANDROID::trackers nie jest wyliczany przez xrEnumerateRaycastSupportedTrackableTypesANDROID.
Prawidłowe użycie (domyślne)
- Przed wywołaniem xrRaycastANDROID musi być włączone rozszerzenie
XR_ANDROID_raycast. sessionmusi być prawidłowym identyfikatorem XrSessionrayInfomusi być wskaźnikiem do prawidłowej struktury XrRaycastInfoANDROIDresultsmusi być wskaźnikiem do struktury XrRaycastHitResultsANDROID
Kody zwrotne
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROIDXR_ERROR_VALIDATION_FAILUREXR_ERROR_RUNTIME_FAILUREXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_POSE_INVALIDXR_ERROR_TIME_INVALIDXR_ERROR_FEATURE_UNSUPPORTED
Struktura XrRaycastInfoANDROID jest zdefiniowana jako:
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;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktury. Nie ma żadnych takich struktur zdefiniowanych w podstawowej wersji OpenXR ani w tym rozszerzeniu.maxResultsto maksymalna liczba wyników do zwrócenia (uint32_t).trackerCountto liczba elementówuint32_tw tablicytrackers.trackersto tablica XrTrackableTrackerANDROID, z którą powinien być testowany za pomocą zastosowanego typu danych.originto wektor XrVector3f, z którego jest rzucany promień.trajectoryto wektor XrVector3f, na który kierowany jest promień.spaceto XrSpace, w którym pada promień.timetoXrTime, do którego kierowany jest promień.
Struktura XrRaycastInfoANDROID opisuje promień do prześwietlenia.
- Tablica XrRaycastInfoANDROID::trackers może zawierać śledzenie różnych typów.
- Tablica XrRaycastInfoANDROID::trackers musi nie zawierać wielu śledzenia tego samego typu, w przeciwnym razie środowisko uruchomieniowe musi zwrócić
XR_ERROR_VALIDATION_FAILURE.
Prawidłowe użycie (domyślne)
- Zanim użyjesz rozszerzenia XrRaycastInfoANDROID, musisz je włączyć.
XR_ANDROID_raycast typemusi byćXR_TYPE_RAYCAST_INFO_ANDROIDnextmusi byćNULLlub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktury.trackersmusi być wskaźnikiem do tablicytrackerCountprawidłowych uchwytów XrTrackableTrackerANDROID.spacemusi być prawidłowym identyfikatorem XrSpace- Parametr
trackerCountmusi być większy niż0. - Obie wartości
spacei elementytrackersmuszą zostać utworzone, przydzielone lub pobrane z tego samego obiektu XrSession.
Struktura XrRaycastHitResultsANDROID jest zdefiniowana w ten sposób:
typedef struct XrRaycastHitResultsANDROID {
XrStructureType type;
void* next;
uint32_t resultsCapacityInput;
uint32_t resultsCountOutput;
XrRaycastHitResultANDROID* results;
} XrRaycastHitResultsANDROID;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktury. Nie ma żadnych takich struktur zdefiniowanych w podstawowej wersji OpenXR ani w tym rozszerzeniu.resultsCapacityInputto pojemność tablicyresults, a 0 oznacza prośbę o pobranie wymaganej pojemności.resultsCountOutputto wskaźnik liczby zapisanych elementówresultslub wskaźnik wymaganej pojemności w przypadku, gdyresultsCapacityInputjest niewystarczająca.resultsto wskaźnik do tablicy struktur XrRaycastHitResultANDROID. Może ona wynosićNULL, jeśliresultsCapacityInput= 0.- Szczegółowy opis pobierania wymaganego rozmiaru
resultsznajdziesz w sekcji Parametry rozmiaru bufora.
Obiekt XrRaycastHitResultsANDROID zawiera tablicę uderzeń promienia.
W czasie wykonywania musi być ustawiona wartość resultsCountOutput nie większa niż XrRaycastInfoANDROID::maxResults.
Prawidłowe użycie (domyślne)
- Przed użyciem rozszerzenia XrRaycastHitResultsANDROID musi być włączone rozszerzenie
XR_ANDROID_raycast. typemusi byćXR_TYPE_RAYCAST_HIT_RESULTS_ANDROIDnextmusi byćNULLlub prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktury.resultsmusi być wskaźnikiem do tablicy strukturresultsCapacityInputXrRaycastHitResultANDROID- Parametr
resultsCapacityInputmusi być większy niż0.
Struktura XrRaycastHitResultANDROID jest zdefiniowana w ten sposób:
typedef struct XrRaycastHitResultANDROID {
XrTrackableTypeANDROID type;
XrTrackableANDROID trackable;
XrPosef pose;
} XrRaycastHitResultANDROID;
Opisy członków
typeto XrTrackableTypeANDROID obiektu śledzenia, który został trafiony przez wiązkę promieni.trackabletoXrTrackableANDROID, który został znaleziony przez wiązkę promieni, lubXR_NULL_TRACKABLE_ANDROID, jeślitypebył śledzony iXR_TRACKABLE_TYPE_DEPTH_ANDROID.poseto XrPosef, który został trafiony przez wiązkę promieniowania.
Obiekt XrRaycastHitResultANDROID zawiera szczegóły trafienia promienia.
Wartość XrRaycastHitResultANDROID::pose dla kolizji z płaszczyzną musi być taka, aby X i Z były równoległe do płaszczyzny, a oś Y była prostopadła do płaszczyzny.
Typ uchwytnego działania |
Opis |
|
Dotyka poziomych lub pionowych powierzchni, aby określić prawidłową głębokość i orientację punktu. |
|
Korzysta z informacji o głębi z całej sceny, aby określić prawidłową głębię i orientację punktu. |
Prawidłowe użycie (domyślne)
- Przed użyciem funkcji XrRaycastHitResultANDROID musi być włączone rozszerzenie
XR_ANDROID_raycast. typemusi być prawidłową wartością XrTrackableTypeANDROID
Przykładowy kod do rzutowania promieniowego
Przykładowy kod poniżej pokazuje, jak wykonywać rzuty promieniowe.
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]
}
Nowe stałe typu wyliczeniowego
Wyliczenie XrStructureType zostało rozszerzone o:
XR_TYPE_RAYCAST_INFO_ANDROIDXR_TYPE_RAYCAST_HIT_RESULTS_ANDROID
Nowe struktury
Nowe funkcje
Problemy
Historia wersji
- Wersja 1, 2024-10-02 (Kenny Vercaemer)
- Początkowy opis rozszerzenia
OpenXR™ i logo OpenXR są znakami towarowymi należącymi do The Khronos Group Inc. i zarejestrowanymi jako znak towarowy w Chinach, Unii Europejskiej, Japonii i Wielkiej Brytanii.