Как убрать эффект "Рыбий глаз" на камеру SceneKit?
Я использую SceneKit. Я создал и назначил свою собственную камеру для сцены, и я настроил ее xFov и yFov. Когда я устанавливаю значение выше 50, появляются некоторые искажения. Все около краев экрана растянуто - почти как камера внезапно становится "Рыбий глаз".
Мне нужно, чтобы xFov и yFov были выше 50 (мне действительно нужно, чтобы это было 100), но у меня не может быть такого искажения. Что я делаю?
1 ответ
То, что вы спрашиваете, теоретически само по себе невозможно, но, по крайней мере, теоретически интересно.
Что происходит с физической камерой, когда вы увеличиваете поле зрения? Чем шире он становится, тем больше "рыбий глаз" выглядит. Матрица проекции и перспектива разделения трехмерного графического конвейера, такого как SceneKit, работает аналогичным образом. Это выглядит немного иначе, потому что это прямолинейное преобразование, а не эффект сферической линзы, но это та же самая общая идея - он отображает объем (называемый усечкой) трехмерного пространства, "видимого" камерой, на плоскость просмотра. Это общий аспект трехмерной графики, а не специфический для SceneKit, поэтому вы можете найти множество хороших учебных пособий, которые довольно хорошо освещают основную математику.
Эта проекция усеченного конуса фиксирует определенную связь между величиной угла обзора, который занимает объект, и его шириной в плоскости просмотра. Вы не можете реально изменить это отношение и все еще иметь линейное (хорошо, рациональное, но в основном линейное) преобразование, которое трехмерное оборудование может применить с одиночным матричным умножением (и перспективным делением).
Теоретически, вы можете определить другое отношение, скажем, такое, где большой угловой размер соответствует значительно большей части плоскости обзора вблизи центра обзора, но гораздо меньшей части, находящейся дальше от центра. Но вы не можете сделать это в преобразовании камеры... Вы должны были бы делать такие вычисления попиксельно в каком-то шейдере постобработки. (Фактически, именно так обычно работает рендеринг для линз гарнитуры VR.)