Поделиться через


Камера

Чтобы убедиться, что локально и удаленно отрисованное содержимое можно легко скомпоновать, необходимо синхронизировать различные свойства камеры между сервером и клиентом. В особенности это касается преобразования и проекции камеры. Например, локально отрисованное содержимое должно использовать то же преобразование и проекцию камеры, с которыми отрисован последний удаленный кадр.

Local and remote camera

На приведенном выше рисунке локальная камера смещена по сравнению с удаленным кадром, отправленным сервером. В результате локальное содержимое должно быть отрисовано с той же перспективы, что и удаленный кадр, и, наконец, полученное изображение перепроецируется в пространство локальной камеры, что подробно объясняется в разделе о перепроецировании на поздних этапах.

Задержка между удаленной и локальной отрисовкой означает, что любые изменения этих параметров применяются не сразу. Таким образом, любое новое значение не может использоваться сразу же и в одном кадре.

В параметрах камеры можно задать ближний и дальний планы. В HoloLens 2 оставшиеся данные преобразования и проекции определяются оборудованием. При использовании симуляции рабочего стола они задаются с помощью входных данных функции Update.

Измененные значения можно использовать локально сразу после поступления первого удаленного кадра, который был отрисован с их помощью. В HoloLens 2 данные, используемые для отрисовки, предоставляются HolographicFrame, как и в любом другом голографическом приложении. При симуляции рабочего стола они извлекаются с помощью выходных данных функции Update.

Параметры камеры

В параметрах камеры можно изменить следующие свойства.

Ближний и дальний план.

Чтобы предотвратить установку недопустимых диапазонов, свойства NearPlane и FarPlane доступны только для чтения, а для изменения диапазона существует отдельная функция, SetNearAndFarPlane. Эти данные будут отправлены на сервер в конце кадра. При задании этих значений NearPlane должен быть меньше, чем FarPlane. В противном случае возникает ошибка.

Важно!

В Unity это происходит автоматически при изменении ближнего и дальнего плана основной камеры.

EnableDepth.

Иногда бывает полезно отключить запись буфера глубины удаленного изображения для целей отладки. Отключение глубины также запрещает серверу отправлять данные глубины, уменьшая таким образом пропускную способность.

Совет

В Unity предоставляется компонент отладки EnableDepthComponent, который может использоваться для переключения этой функции в пользовательском интерфейсе редактора.

InverseDepth.

Примечание.

Этот параметр важен только в том случае, если для параметра EnableDepth задано значение true. В противном случае он не оказывает никакого влияния.

Буферы глубины обычно записывают значения z в диапазоне с плавающей запятой [0;1], где 0 отражает глубину ближнего плана, а 1 — дальнего. Кроме того, можно инвертировать этот диапазон и записать значения глубины в диапазоне [1;0], то есть глубина ближнего плана становится 1, а дальнего — 0. Как правило, это улучшает распределение точности с плавающей запятой по нелинейному z-диапазону.

Предупреждение

Распространенный подход заключается в инвертировании значений ближнего и дальнего планов для объектов камеры. При попытке выполнить подобное с CameraSettings в Удаленной отрисовке Azure произойдет ошибка.

API Удаленной отрисовки Azure должен знать о соглашении о буфере глубины локального отрисовщика, чтобы корректно скомпоновать удаленную глубину в локальный буфер глубины. Если диапазон буфера глубины равен [0;1], оставьте для этого флага значение false. Если используется инвертированный буфер глубины с диапазоном [1;0], установите для флага InverseDepth значение true.

Примечание.

Для Unity правильный параметр уже применен RenderingConnection, поэтому нет необходимости менять значения вручную.

Изменить параметры камеры можно следующим образом.

void ChangeCameraSetting(RenderingSession session)
{
    CameraSettings settings = session.Connection.CameraSettings;

    settings.SetNearAndFarPlane(0.1f, 20.0f);
    settings.EnableDepth = false;
    settings.InverseDepth = false;
}
void ChangeCameraSetting(ApiHandle<RenderingSession> session)
{
    ApiHandle<CameraSettings> settings = session->Connection()->GetCameraSettings();

    settings->SetNearAndFarPlane(0.1f, 20.0f);
    settings->SetEnableDepth(false);
    settings->SetInverseDepth(false);
}

Документация по API

Следующие шаги