Comments 14
В этой каше весьма много любопытного. Спасибо.
Видимо не зря я отложил свой VR experience до следующих продакшн ревизий.
Не знал, что нынешние VR устройства не умеют отслеживать позицию головы.
Видимо не зря я отложил свой VR experience до следующих продакшн ревизий.
Не знал, что нынешние VR устройства не умеют отслеживать позицию головы.
Отсутствие positional tracking — это недостаток всех текущих мобильных VR устройств.
Все не-мобильные устройства — Oculus Rift, HTC Vive, PSVR — имеют positional tracking.
Проблема в том что существующие технологии которые достаточно хороши чтобы их можно было положить в основу продукта требуют внешних камер (Oculus Rift / PSVR), внешних лазерных излучателей (HTC Vive) либо большого количества хитрых камер в самом устройстве (Hololens). Для маленькой дешевой коробочки в которую вставляется телефон это все не очень практично.
Наверняка Oculus работает в этом направлении, будет интересно — но я не ожидаю никаких новостей в мире mobile positional tracking в 2016.
Все не-мобильные устройства — Oculus Rift, HTC Vive, PSVR — имеют positional tracking.
Проблема в том что существующие технологии которые достаточно хороши чтобы их можно было положить в основу продукта требуют внешних камер (Oculus Rift / PSVR), внешних лазерных излучателей (HTC Vive) либо большого количества хитрых камер в самом устройстве (Hololens). Для маленькой дешевой коробочки в которую вставляется телефон это все не очень практично.
Наверняка Oculus работает в этом направлении, будет интересно — но я не ожидаю никаких новостей в мире mobile positional tracking в 2016.
В статье говорится конкретно про GearVR, oculus и htc vive насколько мне известно данной проблемы не имеют.
Кстати, отсутствие отслеживания смены позиции (т.е. только угол) могут позволить нехило соптимизировать рендер, поправьте меня, в чем я не прав.
Основная логика работы очков — генерировать необходимое изображение 'из трехугольников' (точнее собственно из мира, ну возможно какая то посчитанная ранее информация конечно используется), каждый раз заново…
Давайте для каждого глаза считать поверхность сферы (максимально простая 3D сцена), на которые проецируется наш игровой мир, в своем потоке, почти никак не зависящий от шлема. Это возможно именно благодаря отсутствию сдвига положения глаз (конечно же внутри игрового мира двигаться ничто не мешает, но это движение с другими требованиями к скорости).
На экраны шлема мы максимально быстро отображаем эти сферы, в которых уже должны быть исправлены хроматические аберации, а это значит не нужны лишние проходы,… и мы вполне укладываемся в 20мс.
ну а теперь, когда самое сложное решено, необходимо оптимизировать рендеринг на эти сферы… считаем изменения только на той части, куда направлен взгляд + запас… Если мы где то опоздаем, то пользователь получит привычный и не страшный лаг виртуального мира но не лаг зрительной системы.
p.s. кстати ведь вовсю используется предугадывание движения, можно считать следующий кадр заранее.
Основная логика работы очков — генерировать необходимое изображение 'из трехугольников' (точнее собственно из мира, ну возможно какая то посчитанная ранее информация конечно используется), каждый раз заново…
Давайте для каждого глаза считать поверхность сферы (максимально простая 3D сцена), на которые проецируется наш игровой мир, в своем потоке, почти никак не зависящий от шлема. Это возможно именно благодаря отсутствию сдвига положения глаз (конечно же внутри игрового мира двигаться ничто не мешает, но это движение с другими требованиями к скорости).
На экраны шлема мы максимально быстро отображаем эти сферы, в которых уже должны быть исправлены хроматические аберации, а это значит не нужны лишние проходы,… и мы вполне укладываемся в 20мс.
ну а теперь, когда самое сложное решено, необходимо оптимизировать рендеринг на эти сферы… считаем изменения только на той части, куда направлен взгляд + запас… Если мы где то опоздаем, то пользователь получит привычный и не страшный лаг виртуального мира но не лаг зрительной системы.
p.s. кстати ведь вовсю используется предугадывание движения, можно считать следующий кадр заранее.
Я не очень понял про сферы, но ощущение что описано нечто эквивалентное timewarp… :)
Про предугадывание. Безусловно, все используют prediction. Главная проблема в том что движение головы предсказуемо фактически только на линейных участках. И гарантированно непредсказуемо в самом начале движения (резкие повороты головы). Поэтому prediction несколько улучшает tracking, и те самые последние 10-15 ms им можно «убирать», но если latency условно 40 ms, то prediction не может их скрыть так чтобы было не заметно.
Про предугадывание. Безусловно, все используют prediction. Главная проблема в том что движение головы предсказуемо фактически только на линейных участках. И гарантированно непредсказуемо в самом начале движения (резкие повороты головы). Поэтому prediction несколько улучшает tracking, и те самые последние 10-15 ms им можно «убирать», но если latency условно 40 ms, то prediction не может их скрыть так чтобы было не заметно.
А я не понял про timewarp
чтобы объяснить на пальцах о чем я говорю… представьте вы сидите перед сферическим экраном, на который проецируется виртуальный мир (на хабре кстати были статьи про такие), они дают неплохой эффект погружения, и беда только с отсутствием стереоэефекта, фиксированным фокусным расстоянием тем более находящимся близко к глазам,… увеличиваем сферу до бесконечности (не обязательно) и получим то о чем я говорю, только стреофект тут есть, так как каждый глаз видит свою сферу.
Самое главное, уменьшить latency при поворотах головы! т.е. уменьшить объем расчетов за счет упрощения сцены до сферы из нескольких сотен трехугольников. Само собой, считать мир всеравно придется, но уже с меньшими требованиями!
p.s. а еще именно так на шлем выводится 360 видео (я думаю)… так какая разница то
чтобы объяснить на пальцах о чем я говорю… представьте вы сидите перед сферическим экраном, на который проецируется виртуальный мир (на хабре кстати были статьи про такие), они дают неплохой эффект погружения, и беда только с отсутствием стереоэефекта, фиксированным фокусным расстоянием тем более находящимся близко к глазам,… увеличиваем сферу до бесконечности (не обязательно) и получим то о чем я говорю, только стреофект тут есть, так как каждый глаз видит свою сферу.
Самое главное, уменьшить latency при поворотах головы! т.е. уменьшить объем расчетов за счет упрощения сцены до сферы из нескольких сотен трехугольников. Само собой, считать мир всеравно придется, но уже с меньшими требованиями!
p.s. а еще именно так на шлем выводится 360 видео (я думаю)… так какая разница то
Ага, математика time warp — такая же. На «сферу» проецируется изображение полученное рендером из одного положения головы, грубо говоря. Вместо сферы рисуется тот самый distortion mesh, и математика — в шейдере, но иначе все так.
Собственно действительно есть в GearVR режим когда вместо того чтобы рисовать 3д сцену и отдавать 2д картинку в time warp, можно в time warp сразу отдать cubemap — 6 2д картинок составляющих куб. Примерно так работает видео.
Собственно действительно есть в GearVR режим когда вместо того чтобы рисовать 3д сцену и отдавать 2д картинку в time warp, можно в time warp сразу отдать cubemap — 6 2д картинок составляющих куб. Примерно так работает видео.
Отличная статья. Спасибо.
Любопытно было узнать детали, о которых либо не задумывался, либо только догадывался.
Любопытно было узнать детали, о которых либо не задумывался, либо только догадывался.
Каждый сканлайн зажигается как раньше нужными цветами, а дальше почти сразу — я точно не знаю через сколько, но скажем 3-4 ms — тухнет (становится черным).
А я бы попробовал научить электронику дисплея делать синхронный сдвиг всех пикселей в любом направлении. А мерцание 60 Hz мне лично в эпоху crt здорово портило жизнь.
С 60 Hz люди бьются на три группы:
— Недостаточно чувствительные — не видят мерцания вообще
— Достаточно чувствительные чтобы видеть мерцание смотря на телефон (в GearVR есть такой режим при котором low persistence mode включается прямо в операционной системе без всякого VR), но недостаточно чтобы видеть его в VR
— Достаточно чувствительные чтобы видеть мерцание везде
Насколько я знаю, пояснение второго пункта условно в отсутствие reference point — в VR мерцает ВСЕ :)
Говорят, порог чувствительности примерно 85 Hz — т.е. людей которые видят мерцание на 90 Hz исчезающе мало. Так что проблема в целом решается более высоким refresh rate (который все равно надо бы делать чтобы уменьшать latency до time warp и иметь меньше проблем с его артефактами — например, для устройств с positional tracking time warp компенсирует целиком повороты, но ничего не делает для движений головы — поэтому надо базовую latency вытягивать в районе 20 ms без time warp. У Oculus Rift и HTC Vive это в целом получается)
— Недостаточно чувствительные — не видят мерцания вообще
— Достаточно чувствительные чтобы видеть мерцание смотря на телефон (в GearVR есть такой режим при котором low persistence mode включается прямо в операционной системе без всякого VR), но недостаточно чтобы видеть его в VR
— Достаточно чувствительные чтобы видеть мерцание везде
Насколько я знаю, пояснение второго пункта условно в отсутствие reference point — в VR мерцает ВСЕ :)
Говорят, порог чувствительности примерно 85 Hz — т.е. людей которые видят мерцание на 90 Hz исчезающе мало. Так что проблема в целом решается более высоким refresh rate (который все равно надо бы делать чтобы уменьшать latency до time warp и иметь меньше проблем с его артефактами — например, для устройств с positional tracking time warp компенсирует целиком повороты, но ничего не делает для движений головы — поэтому надо базовую latency вытягивать в районе 20 ms без time warp. У Oculus Rift и HTC Vive это в целом получается)
Извините, за критиканство, но практически все термины, которые вы оставили на английском, имеют простой и общепринятый перевод: гироскоп, акселерометр, инерциальный датчик и т. д. Да и «good enough» с «experiences» как-то странно смотрятся. Стиль стилем, но будто «Заводной апельсин» читаешь. А в целом статья интересная, спасибо!
Sign up to leave a comment.
Чем GearVR отличается от картонной коробки, или погоня за latency