Имя Строка
XR_ANDROID_raycast
Тип расширения
Расширение экземпляра
Зарегистрированный добавочный номер
464
Пересмотр
1
Зависимости расширений и версий
Дата последнего изменения
2024-10-02
Статус ИС
Нет известных претензий на права интеллектуальной собственности.
Участники
Спенсер Куин, Google
Нихав Джайн, Google
Джон Перси, Google
Джаред Файндер, Google
Левана Чен, Google
Кенни Веркемер, Google
Обзор
Это расширение позволяет приложению выполнять raycasts против отслеживаемых объектов в среде. Raycasts может быть полезен для обнаружения объектов в среде, с которыми пересечется луч. Например:
- Определить, куда упадет плавающий объект при падении, используя вертикальный лучевой поток.
- Чтобы определить, куда смотрит пользователь, используйте направленный вперед луч.
Запрос поддерживаемых возможностей raycast
Функция xrEnumerateRaycastSupportedTrackableTypesANDROID определяется следующим образом:
XrResult xrEnumerateRaycastSupportedTrackableTypesANDROID(
XrInstance instance,
XrSystemId systemId,
uint32_t trackableTypeCapacityInput,
uint32_t* trackableTypeCountOutput,
XrTrackableTypeANDROID* trackableTypes);
Описание параметров
-
instance
— это XrInstance , из которого был полученsystemId
. -
systemId
— этоXrSystemId
, поддерживаемые отслеживаемые типы которого перечисляются для raycasting. -
trackableTypeCapacityInput
— это емкостьtrackableTypes
или 0 для получения требуемой емкости. -
trackableTypeCountOutput
— указатель на количество элементов массива или указатель на требуемую емкость в случае, еслиtrackableTypeCapacityInput
недостаточно.-
trackableTypes
— это указатель на массив XrTrackableTypeANDROID , но может бытьNULL
, еслиtrackableTypeCapacityInput
равен0
.
-
- Подробное описание получения требуемого размера
trackableTypes
см. в разделе «Параметры размера буфера».
xrEnumerateRaycastSupportedTrackableTypesANDROID перечисляет отслеживаемые типы, которые поддерживают raycasting в текущем сеансе.
Допустимое использование (подразумеваемое)
- Расширение
XR_ANDROID_raycast
должно быть включено перед вызовом xrEnumerateRaycastSupportedTrackableTypesANDROID -
instance
должен быть допустимым дескриптором XrInstance -
trackableTypeCountOutput
должен быть указателем на значениеuint32_t
- Если
trackableTypeCapacityInput
не равен0
,trackableTypes
должен быть указателем на массив значенийtrackableTypeCapacityInput
XrTrackableTypeANDROID.
Коды возврата
-
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
Функция xrRaycastANDROID определяется как:
XrResult xrRaycastANDROID(
XrSession session,
const XrRaycastInfoANDROID* rayInfo,
XrRaycastHitResultsANDROID* results);
Описание параметров
-
session
— это XrSession , который выполняет raycast. -
rayInfo
— это XrRaycastInfoANDROID , описывающий луч, который необходимо испустить. -
results
— указатель на XrRaycastHitResultsANDROID , который получает результаты raycast.
Приложение может выполнять лучевую трансляцию, вызывая xrRaycastANDROID .
- Если луч пересекает больше отслеживаемых объектов, чем XrRaycastHitResultsANDROID::maxResults , среда выполнения должна возвращать результаты попадания, которые находятся ближе всего к XrRaycastHitResultsANDROID::origin луча.
- Если луч пересекает отслеживаемый объект типа
XR_TRACKABLE_TYPE_ANDROID_PLANE
, который включен в другую плоскость, среда выполнения должна вернуть результат попадания только для включенной плоскости. - Среда выполнения должна возвращать результаты попаданий в порядке от ближайшего к самому дальнему от XrRaycastInfoANDROID::origin вдоль вектора XrRaycastInfoANDROID::trajectory .
- Среда выполнения должна возвращать
XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROID
, если отслеживаемый тип, соответствующий дескрипторам XrTrackableTrackerANDROID в XrRaycastInfoANDROID::trackers, не перечислен в xrEnumerateRaycastSupportedTrackableTypesANDROID .
Допустимое использование (подразумеваемое)
- Расширение
XR_ANDROID_raycast
должно быть включено перед вызовом xrRaycastANDROID -
session
должен быть действительным дескриптором XrSession -
rayInfo
должен быть указателем на допустимую структуру XrRaycastInfoANDROID -
results
должны быть указателем на структуру XrRaycastHitResultsANDROID
Коды возврата
-
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
Структура XrRaycastInfoANDROID определяется следующим образом:
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;
Описания участников
-
type
— XrStructureType этой структуры. -
next
—NULL
или указатель на следующую структуру в цепочке структур. Такие структуры не определены в ядре OpenXR или в этом расширении. -
maxResults
— это максимальное количество возвращаемых результатовuint32_t
. -
trackerCount
— это счетчикuint32_t
массиваtrackers
. -
trackers
— это массив XrTrackableTrackerANDROID , с которым должен быть протестирован отлитый луч. -
origin
— XrVector3f , из которого исходит луч. -
trajectory
— это XrVector3f , на который направлен луч. -
space
— это XrSpace , в котором распространяется луч. -
time
— этоXrTime
, в которое испускается луч.
Структура XrRaycastInfoANDROID описывает луч, который необходимо испустить.
- Массив XrRaycastInfoANDROID::trackers может содержать трекеры разных типов.
- Массив XrRaycastInfoANDROID::trackers не должен содержать несколько трекеров одного типа, в противном случае среда выполнения должна вернуть
XR_ERROR_VALIDATION_FAILURE
.
Допустимое использование (подразумеваемое)
- Перед использованием XrRaycastInfoANDROID необходимо включить расширение
XR_ANDROID_raycast
-
type
должен бытьXR_TYPE_RAYCAST_INFO_ANDROID
-
next
должен бытьNULL
или действительным указателем на следующую структуру в цепочке структур -
trackers
должен быть указателем на массивtrackerCount
допустимых дескрипторов XrTrackableTrackerANDROID -
space
должен быть допустимым дескриптором XrSpace - Параметр
trackerCount
должен быть больше0
- И
space
, и элементыtrackers
должны быть созданы, выделены или извлечены из одного и того же XrSession.
Структура XrRaycastHitResultsANDROID определяется следующим образом:
typedef struct XrRaycastHitResultsANDROID {
XrStructureType type;
void* next;
uint32_t resultsCapacityInput;
uint32_t resultsCountOutput;
XrRaycastHitResultANDROID* results;
} XrRaycastHitResultsANDROID;
Описания участников
-
type
— XrStructureType этой структуры. -
next
—NULL
или указатель на следующую структуру в цепочке структур. Такие структуры не определены в ядре OpenXR или в этом расширении. -
resultsCapacityInput
— емкость массиваresults
или 0 для указания запроса на извлечение требуемой емкости. -
resultsCountOutput
— указатель на количество записанныхresults
или указатель на требуемую емкость в случае, еслиresultsCapacityInput
недостаточно. -
results
— указатель на массив структур XrRaycastHitResultANDROID . Может бытьNULL
, еслиresultsCapacityInput
равен 0. - Подробное описание получения требуемого размера
results
см. в разделе «Параметры размера буфера».
XrRaycastHitResultsANDROID содержит массив попаданий raycast.
Среда выполнения должна установить resultsCountOutput
меньше или равным XrRaycastInfoANDROID::maxResults .
Допустимое использование (подразумеваемое)
- Расширение
XR_ANDROID_raycast
должно быть включено перед использованием XrRaycastHitResultsANDROID -
type
должен бытьXR_TYPE_RAYCAST_HIT_RESULTS_ANDROID
-
next
должен бытьNULL
или действительным указателем на следующую структуру в цепочке структур -
results
должен быть указателем на массив структур на основеresultsCapacityInput
XrRaycastHitResultANDROID - Параметр
resultsCapacityInput
должен быть больше0
Структура XrRaycastHitResultANDROID определяется следующим образом:
typedef struct XrRaycastHitResultANDROID {
XrTrackableTypeANDROID type;
XrTrackableANDROID trackable;
XrPosef pose;
} XrRaycastHitResultANDROID;
Описания участников
-
type
— это XrTrackableTypeANDROID отслеживаемого объекта, на который направлен луч. -
trackable
— этоXrTrackableANDROID
, на который попал луч, илиXR_NULL_TRACKABLE_ANDROID
если отслеживаемыйtype
—XR_TRACKABLE_TYPE_DEPTH_ANDROID
. -
pose
— это XrPosef , на который попал луч.
XrRaycastHitResultANDROID содержит сведения о попадании raycast.
XrRaycastHitResultANDROID::pose для удара о плоскость должна быть такой, чтобы X и Z были параллельны плоскости, а ось Y была перпендикулярна плоскости.
Тип отслеживаемого попадания | Описание |
| Ударяется о горизонтальные и/или вертикальные поверхности, чтобы определить правильную глубину и ориентацию точки. |
| Использует информацию о глубине всей сцены для определения правильной глубины и ориентации точки. |
Допустимое использование (подразумеваемое)
- Расширение
XR_ANDROID_raycast
должно быть включено перед использованием XrRaycastHitResultANDROID -
type
должен быть допустимым значением XrTrackableTypeANDROID
Пример кода для raycasting
Следующий пример кода демонстрирует, как выполнять лучевую трансляцию.
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]
}
Новые константы перечисления
Перечисление XrStructureType расширено:
-
XR_TYPE_RAYCAST_INFO_ANDROID
-
XR_TYPE_RAYCAST_HIT_RESULTS_ANDROID
Новые структуры
Новые функции
Проблемы
История версий
- Редакция 1, 2024-10-02 (Кенни Веркемер)
- Первоначальное описание расширения
OpenXR™ и логотип OpenXR являются товарными знаками компании Khronos Group Inc. и зарегистрированы в качестве товарного знака в Китае, Европейском Союзе, Японии и Великобритании.