Як поєднати дві камери під час подорожі по порталу в Unity3D


18

Перш ніж перейти до свого питання, я знаю, що найбільш очевидним рішенням буде використання нормованої прямої порту перегляду, однак мені потрібні складніші форми, ніж прямокутник, і я задумався використовувати пряму порт перегляду, і, здається, не будь моїм рішенням.

EDIT: Деякі люди були збентежені моїм запитанням, дозвольте трохи детальніше. введіть тут опис зображення Що відбувається, коли плеєр переходить на один портал, я створюю FPS-контролер-клон і переміщую його з іншого. Це дає мені дві камери, і вигляд, який ви бачите праворуч вгорі. Це просто показ однієї камери та обробка порталу. Я хочу щось подібне до цьогоде камери змішуються, щоб створити ілюзію плавного переходу. Що я хочу зробити, це видалити все з зеленого зображення шашки зліва на зображенні нижче, і замінити його іншою камерою. Таким чином ви отримуєте частину зору камери A, яка сягає верхівки порталу, поєднуючись із частиною подання камери B, яка виходить на інший портал, щоб отримати повне зображення. І під час переміщення по порталу розріз змінюється відповідним чином.

Я розробляв систему порталів, у мене все в тому числі, включаючи те, щоб плеєр плавно переміщався через портал. Моя головна проблема зараз - це отримання ефекту суміші камери, який робить Valve. Мені потрібні дві камери, щоб плавно поєднатися разом, як ніби ти просунув голову через портал. І він не може бути просто прямокутником, він повинен відповідати, проте гравець переглядає портал.

Моє найкраще керівництво щодо цього зараз - це, можливо, спроектувати шейдер глибинної маски за кожним порталом, а потім зробити камеру з порталу, на який ви подорожуєте, лише на глибину. Потім якось змішайте дві камери. Моя основна проблема полягає у з'ясуванні того, як саме я це роблю, як зробити другу камеру лише тією, що поза межами порталу, і решта за замовчуванням для камери 1, щоб отримати одну повноекранну проекцію.

Якщо ви можете дати мені ідеї або пояснити, як я можу це зробити за допомогою шейдера глибинної маски, який був би величезною допомогою. Я продовжуватиму працювати над цим і оновлюватиму, коли роблю прориви.


5
Чи можете ви пояснити, що таке "клапан ефекту суміші камери"? Я зрозумів, що в режимі рендеринга однієї камери досить. У іграх від першої особи він приєднується до гравця і автоматично перетворюється на нове місце при переході через портал разом із програвачем. Для візуалізації ефекту порталу надається трансформована копія сцени. Цього можна досягти і за допомогою другої камери, однак у цих сумішах не повинно бути ніякої потреби.
msell

1
У мене вже візуальні ефекти ідеально знижуються. Що я намагаюся зробити - це зрозуміти, як отримати ефект від прогулянки по порталу. У мене вже є вся графіка персонажів і така плавна рухається, мені просто потрібно, щоб вона виглядала гладко з точки зору від першої особи.
Тімоті Вільямс

1
Я впевнений, що багато людей хотіли б допомогти вам у вирішенні проблеми, якби вони зрозуміли, що це таке. Вам справді потрібно краще пояснити проблему, можливо, додати фотографії або навіть відео, що візуалізують, що не так.
msell

2
Чи можете ви додати посилання до прикладу відео ефекту?
Майк Бакстер

2
Що робити, якщо ви використовували лише одну камеру / FPS-контролер? Коли камера рухається через портал, ви можете перетворити її на нове місце та орієнтацію. Якщо візуалізація порталу є правильною, перехід повинен бути безперебійним і не потрібно змішувати.
msell

Відповіді:


6

Розуміння проблеми

Як я бачу, проблему, яку ви описуєте, є результат близької площини камери, що перетинає площину, визначену порталом. Поки відбувається це перехрестя, ви можете побачити за стіною портал.

Це схоже на проблему, що виникає в інших іграх, коли гравець просто переходить з води над водою. Якщо камера знаходиться над водою, ніякого ефекту після обробки не застосовується, щоб придушити погляд гравців (зробити темним, розмитим і синім). Отже, якщо дно найближчої площини знаходиться під водою, гравець може чітко бачити під водою.

Якщо я маю рацію, ви можете підтвердити це, змінивши положення цієї площини при визначенні матриці проекції. Зі збільшенням відстані від походження камери до ближньої площини виникає проблема.

Просте рішення

Якщо зробити ближню площину дуже близькою до камери, це мало би усунути цю проблему. Це рішення не є повним, але дасть досить хороший результат у переважній більшості випадків і є ефективним.

Повне рішення

Якщо просто встановлення ближньої площини ближче до камери не задовольняє, тоді ви можете створити "маску" для змішування зображень, створених в результаті відображення сцени з точки зору програвача та порталу.

Припускаючи, що ви дозволяєте застосовувати лише портали до плоских поверхонь, ви можете обчислити лінію перетину між близькою площиною камери та площиною, визначеною порталом (або стіною, на якій вона лежить). Ця лінія розділить екран на дві частини. Визначення, на якій стороні лінії розміщений піксель екрана, дозволить дізнатися, яке візуалізація використовувати, зображення порталу чи зображення камери програвача.

Майте на увазі, що якщо ця проблема виникає, фрустрація перегляду камери повинна повністю знаходитися в межах порталу, щоб лінія перетину завжди повністю перерізалася від одного краю екрана до іншого.

Це посилання повинно допомогти математикам знайти лінію. Код нижче повинен бути приблизно правильним.

Лінія перетину визначається за допомогою точки на лінії та напрямку лінії. Нижче напрямок перетину обчислюється за допомогою поперечного добутку порталу нормального та напрямку перегляду камери (біля площини нормальної). Точка на лінії дається, кидаючи промінь від точки на найближчій площині безпосередньо до площини порталу (вздовж порталу нормально) і знаходячи точку перетину.

Vector3 intersectionDir = Vector3.cross(portalNorm, viewDir);
Ray ray = new Ray(camPos + viewDir * camNearPlaneDist, portalNorm);
Vector3 intersectionPos = ray.intersects(new Plane(portalVert1, portalVert2, portalVert3);

Переконайтесь, що viewDir є одиничним вектором. portalVert1, 2 і 3 - це лише 3 з 4 вершин, які використовуються для відхилення порталу або поверхні, на якій він знаходиться. Є й інші способи визначення площини, на якій лежить портал, але я припускаю, що це найбільш доступна інформація.

Коли у вас є ці два вектори для визначення лінії перетину, помножте кожен на подання, а потім на матриці проекції, щоб отримати їх у екрані.

Потім ви можете використовувати шейдер після обробки процесу для змішування цих зображень. Ви вибираєте, яке зображення використовувати для кожного пікселя, визначаючи, на якій стороні лінії поділу лежить поточний піксель. Це робиться, зайнявши положення пікселя (це також положення, яке ви використовуєте для пошуку цільового текселя візуалізації) і виконайте це;

float d = (pixelX - intersectionPos.X) * intersectionDir.Y - (pixelY - intersectionPos.Y) * intersectionDir.X;

Сторона надається тим, чи d більше або менше 0. Якщо це рівно 0, то ви на лінії.

Для ознайомлення з математикою вище див. Це .

Цей метод також може бути використаний при створенні глибини маски / буфера трафарету для використання перед візуалізацією з точки зору порталу. Ви можете створити повноекранний квадроцикл і використовувати рядок, щоб нарізати його.


Близький літак кліпу була гарною ідеєю, але не саме те, що я шукаю. Ця друга частина є цікавим підходом. В даний час я використовую шейдер глибинної маски для всього, що знаходиться за площиною порталу, що виходить, а потім встановлюю чіткі прапорці камери, що виходить, лише на глибину. Це робить його так, що будь-яка частина виїзної камери, що виходить з порталу, малює на екрані, а камера, що входить, малює глибинну маску, тому вона створює одне зображення, змішуючи частини кожної камери, що виходить з неї. відповідний портал. Єдиною проблемою є те, що я отримую деякі незначні проблеми із відсіканням, і як
Тімоті Вільямс,

легкий ривок, коли гравець подорожує. Ця ідея, яку ви виховували, звучить досить перспективно. Отже, по суті, що мені потрібно зробити - це обчислити лінію вздовж екрану, на якій перетинаються камера біля площини та площини порталу, напрямок дає мені, в якому напрямку йде лінія, а точка - це різні точки лінії. Як я можу тоді в шейдері / сценарії визначити, на якій стороні лінії поділу лежить піксель?
Тімоті Вільямс

Я трохи оновив відповідь, щоб дати основний код. Переконайтеся, що спробуйте змінити вигляд поблизу відрізання площини, щоб підтвердити проблему. Зробити це якомога меншим, також може бути достатньо. Пам’ятайте, налаштуйте його на роботу, налагодьте його працездатність, а потім швидко працюйте.
OriginalDaemon


Я тестував зміни близької відстані відсікання площини, це зробило проблему трохи краще, але, як зазначено у статті Мелла, вона не виправляє проблему під час прошивки. Я все ще відчуваю, що лінія перетину може працювати, хоча я спробую це випробувати. Я також трохи детальніше перегляну цю статтю, яку розмістив Мелл. Врешті-решт, це зводиться до того, чи швидше глибина маска чи швидше ця лінія перетину
Тімоті Вільямс

3

Запропоновані відповіді були дуже хорошими, але я врешті-решт пішов на іншу техніку за допомогою глибинної маски.

Що ви робите, це взяти ЦЕЙ скрипт і шейдер, ви поставите скрипт на кожен об’єкт із візуалізатором у вашій сцені і встановите чергу візуалізації на 3020 (я опублікую сценарій, щоб це зробити пізніше).

Потім ви створюєте коробку літаків (всі звернені всередину; на малюнку ви не бачите сторону коробки, яка є найближчою до вас, але коли ви знаходитесь у коробці, все, що ви повинні побачити, сіре) позаду БОТУ своїх порталів як так: введіть тут опис зображення І встановіть їх на спеціальний власний шар (я вибрав "DepthMask" для мого), потім ви додасте до них матеріал із шейдером. введіть тут опис зображення

Потім ви берете основну камеру і зніміть прапорці для спеціального шару з маски відсікання (я не перевірив шар DepthMask) і встановите його глибину на 0. введіть тут опис зображення

Потім, коли ви здійснюєте телепортування через і клонуєте камеру, встановіть чіткі прапорці іншої камери на "Тільки глибина", і її глибина дорівнює 1. введіть тут опис зображення

Потім ви отримуєте безшовний екран, змішаний між двома видами камери.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.