Особенности Работы С Mesh В Unity

Компьютерная графика, как известно, является основой игровой индустрии.

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

К этим трудностям добавляются риски простой человеческой невнимательности.

Учитывая масштабы разработки игр, такие проблемы возникают либо часто, либо в большом количестве.

Борьба с такими трудностями заставила нас задуматься об автоматизации и написании статей на эту тему.

Большая часть материала будет посвящена работе с Юнити 3D , так как это основной инструмент разработки в Plarium Krasnodar. В дальнейшем 3D-модели и текстуры будут считаться графическим контентом.

В этой статье мы поговорим об особенностях доступа к представлению данных 3D-объектов в Единство .

Материал будет полезен в первую очередь новичкам, а также тем разработчикам, которые редко взаимодействуют с внутренним представлением подобных моделей.



Особенности работы с Mesh в Unity



О 3D-моделях в Unity — для самых маленьких



Особенности работы с Mesh в Unity

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

MeshFilter относится к сетка — актив, представляющий модель.

Для большинства шейдеров информация о геометрии является обязательным минимальным компонентом для рендеринга модели на экране.

Данные о наложении текстур и костях анимации могут отсутствовать, если они не используются.

Как этот класс реализован внутри и как там всё хранится — секрет за определённую сумму денег.

Внешне сетка как объект обеспечивает доступ к следующим наборам данных:

  • вертикали — набор положений вершин геометрии в трехмерном пространстве со своим началом;
  • нормали, касательные — наборы векторов нормалей и касательных к вершинам, которые обычно используются для расчета освещения;
  • ув, ув2, ув3, ув4, ув5, ув6, ув7, ув8 — наборы координат для сканирования текстур;
  • цвета, цвета32 — наборы значений цвета вершин, хрестоматийный пример использования которых — смешивание текстур с помощью маски;
  • связывает — наборы матриц для расположения вершин относительно костей;
  • костьГири — коэффициенты влияния костей на вершины;
  • треугольники — набор индексов вершин, обрабатываемых по 3 за раз; каждая такая тройка представляет собой многоугольник (в данном случае треугольник) модели.

Доступ к информации о вершинах и полигонах реализован через соответствующие свойства ( характеристики ), каждый из которых возвращает массив структур.

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

Об этом нюансе речь пойдет в небольшом блок документации .

Об этом также предупреждают комментарии к свойствам класса.

сетка , о которых говорилось выше.

Причина такого поведения — архитектурная особенность.

Единство в контексте времени выполнения Мононуклеоз .

Схематически это можно представить так:

Особенности работы с Mesh в Unity

Ядро движка (UnityEngine (native)) изолировано от скриптов разработчика, а доступ к его функционалу реализован через библиотеку UnityEngine (C#).

По сути, это адаптер, поскольку большинство методов служат прослойкой для получения данных от ядра.

При этом ядро и остальная часть, включая ваши скрипты, запускаются под разными процессами и скриптовая часть знает только список команд. Таким образом, прямого доступа к памяти, используемой ядром, из скрипта нет.

О доступе к внутренним данным, или Насколько это может быть плохо

Чтобы продемонстрировать, насколько все может быть плохо, давайте проанализируем объем памяти, очищаемый сборщиком мусора, на примере из документации.

Для удобства профилирования обернем аналогичный код в метод Update.

   

public class MemoryTest : MonoBehaviour { public Mesh Mesh; private void Update() { for (int i = 0; i < Mesh.vertexCount; i++) { float x = Mesh.vertices[i].

x; float y = Mesh.vertices[i].

y; float z = Mesh.vertices[i].

z; DoSomething(x, y, z); } } private void DoSomething(float x, float y, float z) {

Теги: #Разработка игр #программирование #разработка #C++ #unity #3d графика #Mesh #unity3d #начинающие
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.