Как убрать эффект «Рыбий глаз» на камере SceneKit?

Я использую SceneKit. Я создал и назначил сцене свою собственную камеру, и я настроил ее xFov и yFov. Когда я устанавливаю значение выше 50, начинаются некоторые искажения. Все по краям экрана растянуто - почти как камера внезапно превращается в «Рыбий глаз».

Мне нужно, чтобы xFov и yFov были выше 50 (мне действительно нужно, чтобы они были 100), но у меня не может быть такого искажения. Что мне делать?


person Christian Kreiter    schedule 10.05.2016    source источник
comment
Как сделать так, чтобы широкое поле зрения поместилось в узкое окно просмотра без искажений?   -  person rickster    schedule 10.05.2016
comment
@rickster Вы хотите сказать, что это теоретически невозможно?   -  person Christian Kreiter    schedule 10.05.2016
comment
Очевидно, что использование ортогональной проекции устранит это искажение, но я не уверен, что вы действительно этого хотите.   -  person lock    schedule 10.05.2016


Ответы (1)


То, о чем вы спрашиваете, не является теоретически невозможным само по себе, но, по крайней мере, теоретически интересно.

Что происходит с физической камерой, когда вы увеличиваете поле зрения? Чем шире он становится, тем более "рыбий глаз" выглядит. Матрица проекции и перспективное деление конвейера трехмерной графики, такого как SceneKit, работают аналогичным образом. Это выглядит немного иначе, потому что это прямолинейное преобразование, а не эффект сферической линзы, но это та же самая общая идея - он отображает объем (называемый усеченной вершиной) трехмерного пространства, «видимого» камерой, на плоскость просмотра. Это общий аспект 3D-графики, а не что-то конкретное для SceneKit, поэтому вы можете найти множество хорошие учебные пособия, которые довольно хорошо охватывают базовую математику.

Эта усеченная проекция фиксирует определенную взаимосвязь между величиной угла обзора, который что-то занимает, и его шириной в плоскости просмотра. Вы не можете действительно изменить это соотношение и при этом иметь линейное (ну, рациональное, но в основном линейное) преобразование, которое 3D-оборудование может применять с одним умножением матрицы (и делением перспективы).

Теоретически вы можете определить другое соотношение - скажем, такое, при котором большой угловой размер соответствует гораздо большей части плоскости обзора около центра обзора, но гораздо меньшей части дальше от центра. Но вы не можете сделать это в преобразовании камеры ... Такие вычисления придется выполнять попиксельно в какой-то шейдер постобработки. (Фактически, это обычно то, как рендеринг для линз VR-гарнитуры работает.)

person rickster    schedule 10.05.2016