В 3D-графике нормали играют ключевую роль для правильного освещения и
визуализации объектов. В библиотеке Three.js метод
computeVertexNormals используется для автоматического
вычисления нормалей вершин геометрии на основе топологии её
поверхностей. Это особенно важно при работе с моделями, созданными
вручную или импортированными из внешних источников, где нормали могут
отсутствовать или быть некорректными.
Метод вызывается на объекте геометрии:
geometry.computeVertexNormals();
geometry — объект типа
THREE.BufferGeometry или устаревший
THREE.Geometry.Пример использования:
const geometry = new THREE.BoxGeometry(1, 1, 1);
// Если были изменения вершин:
geometry.attributes.position.array[0] += 0.1;
// Пересчёт нормалей после изменения формы:
geometry.computeVertexNormals();
Метод полезен при динамических моделях, когда вершины изменяются в реальном времени. Без пересчёта нормалей освещение будет выглядеть некорректно, с артефактами и резкими переходами света.
Процесс вычисления нормалей для вершины состоит из следующих шагов:
Вычисление нормалей граней Для каждого треугольника геометрии нормаль определяется через векторное произведение двух рёбер:
[ = (_1 - _0) (_2 - _0)]
где (_0, _1, _2) — вершины треугольника.
Агрегация нормалей для вершин Каждая вершина получает сумму нормалей всех граней, к которым она принадлежит.
Нормализация После суммирования нормаль нормализуется до единичной длины:
[ *{vertex} = ]
Эта операция создаёт эффект гладкого перехода света между гранями.
computeVertexNormals.BufferGeometry с index нормали вычисляются
корректно для повторяющихся вершин, учитывая их объединение по
индексу.geometry.computeFaceNormals() с установкой
material.flatShading = true.computeVertexNormals каждый раз после модификации
геометрии.geometry.attributes.normal.needsUpdate = true после
частичных изменений.Сглаженная сфера:
const geometry = new THREE.SphereGeometry(1, 32, 32);
geometry.computeVertexNormals();
const material = new THREE.MeshStandardMaterial({ color: 0x0077ff });
const sphere = new THREE.Mesh(geometry, material);
scene.add(sphere);
Плоский куб с плоскими нормалями:
const geometry = new THREE.BoxGeometry(1, 1, 1);
geometry.computeVertexNormals(); // при flatShading это не обязательно
const material = new THREE.MeshStandardMaterial({ color: 0xff7700, flatShading: true });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
computeVertexNormals делает освещение
плавным и реалистичным, устраняя визуальные артефакты.В Three.js computeVertexNormals является основным
инструментом для подготовки геометрий к корректному освещению и
обеспечению реалистичного визуального восприятия объектов. Правильное
использование метода позволяет сочетать динамические изменения модели с
качественным отображением света и теней.