Uniti3d  уроки - Основные 3D понятия.

Координаты.

Если вы раньше работали в 3D редакторах, понятие оси Z вам известно - дополнительная ось к горизонтальной (X) и вертикальной(Y) осям. В 3D приложениях информация представлена в X, Y, Z-формате - декартовые координаты – это и габаритные размеры, поворот, позиция в пространстве и т.д. и т.п. В этой книге, как и в любой другой документации по 3D, вы увидите такую информацию, написанную в скобках: (10, 15, 10) Это не только признак аккуратности, но и потому, что в программировании эти значения так и должны быть записаны. Независимо от их представления можно предположить, что любой набор из трех значений, разделенных запятыми, будут в X, Y, Z порядке.

Локальное пространство vs Мировое пространство.

Важно понимать разницу между локальным (Local space) и мировым пространством (World space). В любом 3D пакете, технически, вы работаете в бесконечном пространстве, и может быть затруднительно, следить за размещением объектов внутри него. В каждом 3D мире есть начальная точка (начало координат), часто называемая - ноль, так как ее координаты (0,0,0). Положение в мире (world positions) всех объектов в 3D мире определяется относительно начала координат или мирового нуля (world zero). Однако наряду с мировым мы используем и локальное (объектное) пространство (Local space или Object space), для определения позиции объектов относительно друг друга. Локальное пространство предполагает, что каждый объект имеет собственную точку отсчета (нулевую точку - zero point), из которой выходят оси объекта. Это обычно (геометрический) центр объекта, и создавая отношения между объектами, мы можем сравнить их положения относительно друг друга. Такие отношения, известны как родительско-дочерние отношения (parent-child relationships), означают, что, используя локальное пространство, мы можем вычислить расстояние относительно родительского объекта до других объектов, в этом случае родительский объект становится новым началом координат для любого из его дочерних объектов. Более подробная информация об родительско-дочерних отношениях будет далее.

Векторы.

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

Камеры.

Камеры имеют большое значение для 3D мира, т.к. они выступают в роли viewport-а (окна просмотра) для экрана. Регулируемая область видимости (поле зрение - Field of Vision (FOV)) камер имеет пирамидальную форму. Камеры могут быть помещены в любую точку мира, быть анимированы, а так же прикреплены к персонажу или объекту, быть частью сценария игры. 3D камера это ваше окно (viewport) в 3D мир. Вы увидите, что в игровом движке, различные эффекты, такие как lighting (освещение), motion blurs (эффект размытости изображения при воспроизведении сцен движения) и другие, применяются к камере, что бы сымитировать реальное окружения, т.к. его воспринимает человеческий глаз, можно также добавить и кинематографические эффекты (эффекты которые не испытывает человеческий глаз) такие как блики (lens flares) от солнца. Большинство современных 3D игр используют несколько камер, чтобы показать часть игрового мира, которую камера персонажа в данный момент не видит. Для Unity это не сложно, он (игровой движок) позволяет размещать несколько камер в одной сцене, которые могут быть настроены так, что бы была возможность использовать любую из них, как основную (главную) камеру (main camera), во время игры. Нескольких камер могут быть использованы в игре, что бы управлять визуализацией (rendering) отдельных 2D и 3D элементов, как метод оптимизации. Например, объекты могут быть сгруппированы по слоям (layers), а камеры могут быть назначены на визуализацию (render) объектов в отдельных слоях. Это дает нам больше контроля над индивидуальной визуализацией(individual renders) определенных элементов в игре.

Полигоны, грани, вершины и меши.

При построении 3D фигур, все объекты, в конечном счете, состоят из связанных 2D фигур – называемых полигонами (polygons). При импорте из 3D приложений, Unity преобразует все полигоны объектов в треугольные полигоны (polygon triangles). Треугольные полигоны (polygon triangles) (так же называемые faces), в свою очередь, состоят из трех граней (edges). Места, в которых эти грани (edges) встречаются, называются точками или вершинами (points или vertices). Зная эти места, игровой движок способен произвести расчеты точек удара, известных как collisions (столкновения), используя сложное обнаружение столкновений (complex collision detection) с Mesh Colliders, в шутерах, возможно определить точное место, в котором пуля поразила другой объект. Благодаря сочетанию связанных полигонов 3D редакторы позволяют создавать сложные фигуры, называемые мешами (meshes). Данные, хранящиеся в мешах (meshes), могут использоваться для ряда иных задач, отличных от построения 3D фигур. В игровых проектах, очень важно для разработчика понять важность количество полигонов (polygon count). Количество полигонов это общее число полигонов, часто по отношению к модели, но и со ссылкой на весь уровень игры. Чем больше количество полигонов, тем больше работы компьютеру необходимо сделать, чтобы визуализировать(render) объект на экране. Разработчику игр необходимо найти баланс между количеством полигонов (детализация моделей, количество объектов на уровне и т.д.) и производительностью визуализации (render).

Материалы, текстуры и шейдеры.

Материалы (Materials) общее понятие для всех 3D приложений, так как они обеспечивают средства для создания внешнего вида 3D моделей. От базовых цветов до отражающих поверхностей (reflective image-based), материалы способны на все. Начиная с простых цветов и возможность использовать один или несколько изображений – известных как текстуры (textures) – в одном материале, и заканчивая, работай с шейдерами (shader), чей код отвечает за стиль визуализации (rendering). Например, при использовании шейдеров отражения (reflective shader), материал будет отражать окружающие предметы, но при этом сохраняют свой цвет и внешний вид изображения, применяемого в качестве текстуры. В Unity, использовать материалы легко. Любые материалы созданные в 3D редакторах, будут импортированы и автоматически воссозданы игровым движком в качестве ресурса (assets), для дальнейшего применения. Вы так же можете создать свой собственный материал “с нуля”, назначив изображение из файла текстуры и выбрав нужный шейдер из обширной встроенной библиотеки. Вы так же можете написать собственный скрипт шейдера или использовать созданные членами сообщества (community) Unity. Важно отметить, что при создании текстуры для игры в графических пакетах, таких как Photoshop, вы должны быть осведомлены о данном соглашении. Текстуры должны быть квадратными и иметь размер равный степени двух, т.е. они должны иметь разрешение равное:
• 32 x 32
• 64 x 64
• 128 x 128
• 256 x 256
• 512 x 512
• 1024 x 1024

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

Физика жестких тел.

Для разработчиков, работающих с игровым движком, физический движок (physics engines) производит симуляцию физических законов реального мира в мире виртуальном с той или иной степенью достоверности. Unity, в качестве физического движка, использует Nvidia's PhysX engine. В игровом движке отсутствует предположение, что все объекты подвержены физическому воздействию, т.к., во-первых, это требует огромных вычислительных затрат, и во-вторых, в этом нет необходимости. Например, в автогонках, автомобиль находиться под влиянием физического движка, но не окружающие предметы, такие как деревья, стены и т.п., т.к. в этом нет необходимости. Поэтому, делая игры, компонент Rigid Body присвоен любому объекту, который, по вашему замыслу, должен находиться под контролем физического движка (physics engine). Физический движок используют систему динамики Rigid Body, для создания реалистического движения. Это означает, что вместо статичных объектов, находящихся в 3D мире, мы имеем объекты, у которых могут быть следующие свойства:
• Масса (Mass)
• Гравитация (Gravity)
• Скорость (Velocity)
• Трение (Friction)

Более подробно эти вопросы будут рассмотрены далее.

Обнаружение столкновений.

Большое значение в игровом движке имеет обнаружение столкновений (collision detection) – это способ, с помощью которого мы анализируем наш 3D мир на предмет столкновений между игровыми объектами. Присваивая объекту компонент Collider, мы фактически размещаем вокруг него невидимую сетку. Эта сетка, по возможности, имитирует форму объекта и информирует о столкновении с другим collider-ом, в дальнейшем, игровой движок реагирует на эти столкновения соответствующим образом. Например, в игре симуляторе боулинга, шары будут иметь простой сферический collider, в то время как у кеглей, collider будет иметь форму цилиндра/капсулы или, для большей реалистичности столкновений, collider будет использовать меш (mesh). Информация о столкновении collider-ов поступает в физический движок (physics engine), который сообщает столкнувшимся объектам их дальнейшую реакцию на это столкновение, основанную на направлении удара, скорости и других факторах. Использование collider-ов, повторяющих форму меша, не смотря на то, что дает более точное определение столкновений, но и приводит к увеличению затрат на их вычисление.