Делаем 3D-модель в блокноте

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

Хороший 3D-художник сделает отличную модель даже самыми примитивными инструментами. А плохой испортит работу даже в самом дорогом и «профессиональном».

Поэтому давай поговорим, что такое 3D-модель, из чего она состоит и как работает.

Из чего состоит 3D-модель

В базовом виде любая 3D-модель состоит из четырёх основных элементов:

  • Вершины (vertices) — точки в пространстве;
  • Рёбра (edges) — линии, соединяющие вершины;
  • Полигоны (faces) — поверхности, которые образуются из рёбер;
  • Нормали (normals) — направления этих поверхностей.

Если упростить ещё сильнее, вся 3D-модель — набор точек, соединённых между собой по определённым правилам. Компьютер не видит ни куб, ни персонажа, ни машину — он видит только координаты и связи между ними.

Система координат в 3D

Здесь вернёмся к школьной алгебре с осями ординат и абсцисс, но с одним дополнением: поскольку мы работаем в трёхмерном пространстве, нам придётся добавить третью ось.

В 2D у нас есть:

  • ось X — абсцисса
  • ось Y — ордината

А в 3D добавляется третья:

  • ось Z, которая отвечает за глубину.

Теперь любая точка в пространстве описывается не двумя числами, а тремя: (X, Y, Z)

Примеры:

  • (0, 0, 0) — это центр сцены;
  • (1, 0, 0) — точка смещена по X;
  • (0, 1, 0) — по Y;
  • (0, 0, 1) — по Z.

Из таких точек строится всё.

система координат X, Y, Z с примерами точек (0,0,0), (1,0,0), (0,1,0), (0,0,1).png

Система координат X, Y, Z с примерами точек (0,0,0), (1,0,0), (0,1,0), (0,0,1)

Теперь давай представим базовую фигуру в любой 3D-программе. Да, я говорю про куб.

Куб — идеальный пример, потому что в нём максимально наглядно видно, из чего вообще состоит любая 3D-модель.

У куба есть:

  • 8 вершин — точки в пространстве;
  • 12 рёбер — линии, соединяющие вершины;
  • 6 полигонов — его грани.

image (5).png

Создаём куб вручную в Блокноте

Мы создадим этот куб с нуля, используя стандартный текстовый редактор Блокнот Windows. Но перед этим немного поговорим о форматах 3D-файлов, а именно про OBJ.

Формат OBJ — обычный текстовый файл. Ты можешь открыть его в блокноте и увидеть всё содержимое модели в виде строк. Это идеально подходит для понимания того, как устроено 3D изнутри.

Внутри OBJ-файла есть несколько основных типов записей:

  • строки, начинающиеся с v — это вершины (vertices);
  • f — это полигоны (faces);
  • иногда встречаются vn — нормали;
  • vt — координаты текстур (UV).

Каждая вершина записывается как три числа — те самые координаты:

v X Y Z

Например:

v 0 0 0
v 1 0 0
v 1 1 0

А полигоны описываются через индексы этих вершин:

f 1 2 3

Это значит: соединить вершины 1, 2 и 3 в одну поверхность.

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

Пошаговое создание куба

Открой Блокнот.

Скопируй в него следующий текст:

# Простой куб в формате OBJ
# Создано вручную в Блокноте
# Вершины (v = vertex)
v  -1 -1 -1
v   1 -1 -1
v   1  1 -1
v  -1  1 -1
v  -1 -1  1
v   1 -1  1
v   1  1  1
v  -1  1  1
# Грани (f = face). Каждая грань — 4 вершины (квадрат)
f 1 2 3 4
f 5 8 7 6
f 1 5 6 2
f 2 6 7 3
f 3 7 8 4
f 4 8 5 1

Строки, начинающиеся с #, — комментарии.

Сохрани файл как cube.obj.

Важно: в окне «Сохранить как» выбери тип файла «Все файлы» и обязательно укажи расширение .obj, а не .txt.

Готово! Получилась простая 3D-модель куба.

image (6).png

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

Весь этот файл можно разделить на две части:

1. Мы задали точки (вершины). Вот эти строки:

v  -1 -1 -1
v   1 -1 -1
...

Каждая строка — это одна точка в пространстве. Три числа — это её положение по осям X, Y и Z. Всего таких точек 8 — это все углы куба.

2. Мы сказали, как эти точки соединить Вот эти строки:

f 1 2 3 4

Это уже не новые точки, а инструкция: «соедини вершины 1, 2, 3 и 4 в одну грань». Таких строк 6 — потому что у куба 6 граней.

Весь файл делает ровно две вещи:

  1. Говорит, где находятся точки;
  2. Говорит, какие точки нужно соединить.

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

Нормали и UV-развёртка

Сейчас у нашего куба есть две проблемы:

  • У него нет нормалей.
  • У него нет UV-развёртки.

Нормали — это направления, в которые «смотрят» грани. Они помогают программе правильно считать освещение.
В формате OBJ нормали записываются так:

vn X Y Z

Для куба всё просто — у каждой грани своё направление (пример):

# Нормали
vn  0  0 -1
vn  0  0  1
vn  0 -1  0
vn  0  1  0
vn -1  0  0
vn  1  0  0

_куб с векторами нормалей на каждой точке.png

UV-развёртка — это координаты на плоскости (от 0 до 1), куда будет накладываться текстура.

Простейший вариант:

# UV координаты
vt 0 0
vt 1 0
vt 1 1
vt 0 1

image (7).png

UV-развёртка куба и пример наложения текстуры

Теперь строки граней становятся сложнее:

f вершина/UV/нормаль

Например:

f 1/1/1 2/2/1 3/3/1 4/4/1

Всё в итоге — треугольники

Игровые движки в итоге работают только с треугольниками. Даже если в файле ты пишешь квадрат (f 1 2 3 4), движок автоматически разобьёт его на два треугольника.

1 2 3
1 3 4

От выбора диагонали разбиения иногда зависит освещение и поведение модели при деформации. Поэтому правильная топология важна.

image (8).png

Если оглянуться на всё, что мы разобрали, видна простая, но важная вещь:

  • 3D — не про программы, а про понимание структуры.
  • точки → формируют форму;
  • полигоны → создают поверхность;
  • нормали → влияют на свет;
  • UV → позволяют добавить детали;
  • триангуляция → определяет, как всё это будет отображаться на самом деле.

И чем лучше ты понимаешь это, тем менее весомым становится выбор между Blender, Maya, Houdini или 3ds Max.

Попробуй прямо сейчас создать куб в Блокноте и открыть его в любой программе. Это один из лучших способов почувствовать, как на самом деле работает 3D.

Вот пример полноценного куба для самопроверки:

# Простой куб в формате OBJ
# ======================
# ВЕРШИНЫ (vertices)
# ======================
v  -1 -1 -1
v   1 -1 -1
v   1  1 -1
v  -1  1 -1
v  -1 -1  1
v   1 -1  1
v   1  1  1
v  -1  1  1
# ======================
# UV-КООРДИНАТЫ (texture coordinates)
# ======================
vt  0 0
vt  0 1
vt  1 1
vt  1 0
# ======================
# НОРМАЛИ (normals)
# ======================
vn  0  0 -1    # 1 — передняя грань (-Z)
vn  0  0  1    # 2 — задняя грань (+Z)
vn  0 -1  0    # 3 — нижняя грань (-Y)
vn  0  1  0    # 4 — верхняя грань (+Y)
vn -1  0  0    # 5 — левая грань (-X)
vn  1  0  0    # 6 — правая грань (+X)
# ======================
# ГРАНИ (faces) — порядок вершин 
# ======================
f 1/1/1 4/2/1 3/3/1 2/4/1    # передняя грань
f 5/1/2 6/4/2 7/3/2 8/2/2    # задняя грань
f 1/1/3 2/2/3 6/3/3 5/4/3    # нижняя грань
f 4/1/4 8/2/4 7/3/4 3/4/4    # верхняя грань
f 1/1/5 5/2/5 8/3/5 4/4/5    # левая грань
f 2/1/6 3/2/6 7/3/6 6/4/6    # правая грань
649 0 850 3
0
RENDER.RU