Перенос изображения на меш Unity

264
23 мая 2022, 03:10

Нужно, чтобы текстура спроецировалась на несколько фигур рядом с собой и так и осталось.

Лучший пример - лайтмапинг или запечение теней, т.е. тени проецируются на меш, и он хранит изображение об этом. Нужно так же, но не со светом, а с текстурой.

В юнити есть Projector, который делает почти то что надо.

Как видно, в случае использования Unity Projector он просто добавляет материал к объекту - и на каждом объекте, куда попадает этот Projector, показывается ВСЯ текстура.

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

Вот так надо

Я пробовал разделять текстуру на более мелкие текстуры и прикреплять, создавать из них SpriteRenderer и прикреплять это к объектам

    Rect rect = new Rect(0, 0, w_cell, h_cell);
                rect.center = new Vector2((w_cell * x + w_cell/2) + xAdd, (h_cell * y + h_cell/2) + yAdd);
                Vector3 position = Camera.main.ScreenToWorldPoint(rect.center);
                Texture2D tex = new Texture2D(w_cell, h_cell, TextureFormat.ARGB32, false);
                tex.ReadPixels(rect, 0, 0);
                tex.Apply(); // Мелкую текстуру создали, теперь просто сохраняем их и прикрепляем, не пишу лишнего кода, чтобы не расширять вопрос.

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

Собственно, вопрос. Как разбить текстуру с прозрачностью на несколько 3д объектов, чтобы она как бы наложилась на них, и сохранить это? Может это делается как то через шейдер, а может встроенными средствами юнити?

Answer 1

Подход 1 - Создать правильную развертку под шестиугольник в 3д редакторе, а в фотошопе сделать скрипт который разделяет изображение на шестиугольники и сохраняет их. Но так получится много материалов.

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

Подход 3 - математически расчитать масштаб текстуры и тайлинг. И соответственно создать много материалов у каждого из которых будет задан масштаб и оффсет. Само собою у шестигранников должна быть адекватная развертка.

READ ALSO
Как поймать момент скролла в контроле Combo Box Edit в WPF C#

Как поймать момент скролла в контроле Combo Box Edit в WPF C#

Как поймать момент скролла в контроле Combo Box Edit в WPF C# и сделать ленивую подгрузку из запроса, можно на примере? Данные приходят из API

274
System.Data.SqlTypes.SqlNullValueException: 'Data is Null. This method or property cannot be called on Null values.'

System.Data.SqlTypes.SqlNullValueException: 'Data is Null. This method or property cannot be called on Null values.'

Использую процедуру sp_whoisactive для сбора информации о сервере sqlИспользую DbQuery WhoIsActive { get; set; } в контексте

181
Стиль закругленного ProgressBar. WPF C#

Стиль закругленного ProgressBar. WPF C#

Суть проблемы вот в чем: Есть прогрессбар, которому нужно скруглить углы (BorderRadius 15)Впринципе я то решение нашел, но оно не подходит т

145
Фиксированное положение элемента на форме

Фиксированное положение элемента на форме

Есть форма, которая представляет собой карту мира, в левом нижнем углу есть groupbox с информацией о странахЕсть функция масштабирования, при...

191