В Cannon.js Trimesh представляет собой тип коллайдера, предназначенный для объектов сложной, произвольной геометрии. В отличие от простых форм — Box, Sphere или Cylinder — Trimesh позволяет описывать коллизию по фактической сетке вершин и треугольников, что важно для нестандартных или детализированных моделей.
Trimesh создается на основе массивов вершин и индексов треугольников:
const vertices = [
0, 0, 0,
1, 0, 0,
0, 1, 0,
0, 0, 1
];
const indices = [
0, 1, 2,
0, 1, 3,
0, 2, 3,
1, 2, 3
];
const mesh = new CANNON.Trimesh(vertices, indices);
[x0, y0, z0, x1, y1, z1, ...].Trimesh имеет ряд особенностей, которые необходимо учитывать при использовании в физических сценах:
Статические и динамические объекты Trimesh поддерживает как статические, так и динамические тела. Однако использование динамического Trimesh сильно ограничено: столкновения с ним обрабатываются менее точно, а производительность резко падает при большом количестве треугольников.
Сложность коллизий Каждое столкновение требует проверки всех треугольников. Это означает, что на сценах с множеством сложных Trimesh-объектов нагрузка на CPU возрастает экспоненциально.
Невозможность точного реагирования на быстрые движения Trimesh не поддерживает continuous collision detection (CCD) в полной мере. При высокой скорости движения объекты могут “проходить сквозь” Trimesh, особенно если треугольники мелкие.
Неуниверсальные формы Trimesh хорошо подходит для сложных статических объектов, например, рельефа или зданий, но для физически активных элементов предпочтительнее использовать простые коллайдеры: Box, Sphere, ConvexPolyhedron.
Если необходимо динамическое тело с нестандартной геометрией, Cannon.js рекомендует использовать ConvexPolyhedron вместо Trimesh. Trimesh можно применять динамически только при условии низкой частоты обновления и небольшой детализации.
Пример создания Trimesh для статического тела:
const shape = new CANNON.Trimesh(vertices, indices);
const body = new CANNON.Body({ mass: 0 });
body.addShape(shape);
world.addBody(body);
Здесь mass: 0 делает тело статическим, что повышает
стабильность и производительность.
Использование Trimesh требует внимательного планирования структуры сцены и компромисса между точностью коллизий и производительностью, особенно в реальном времени.