Heightfield — это специальный тип формы в Cannon.js, предназначенный для моделирования неровных поверхностей, таких как террасы, горы или волнистый рельеф. Основная идея состоит в том, чтобы использовать двумерный массив чисел, где каждое значение соответствует высоте точки на сетке.
const heights = [
[0, 1, 0],
[1, 2, 1],
[0, 1, 0]
];
const elementSize = 1; // расстояние между точками сетки
const heightfieldShape = new CANNON.Heightfield(heights, { elementSize });
const body = new CANNON.Body({ mass: 0 });
body.addShape(heightfieldShape);
world.addBody(body);
Здесь heights — это матрица высот, а
elementSize задает размер каждого квадрата сетки.
Heightfield нельзя использовать самостоятельно. Он всегда добавляется
к объекту Body.
const mass = 0; // масса 0 — объект статический
const terrainBody = new CANNON.Body({ mass });
terrainBody.addShape(heightfieldShape);
world.addBody(terrainBody);
Замечание: Статическая природа ландшафта предотвращает его смещение под воздействием сил, но объекты, взаимодействующие с ним, будут реагировать корректно.
Cannon.js автоматически делит Heightfield на треугольники при расчёте столкновений. Каждый квадрат сетки разбивается на два треугольника:
Это позволяет корректно обрабатывать столкновения с наклонными поверхностями.
Важно: Высоты в массиве должны быть числами, иначе физика может работать некорректно.
Heightfield поддерживает повороты и масштабирование через тело
(Body):
terrainBody.quaternion.setFromEuler(-Math.PI / 2, 0, 0);
terrainBody.position.set(0, 0, 0);
position.При использовании больших ландшафтов рекомендуется:
maxValue и
minValue, чтобы оптимизировать внутренние
BVH-структуры Cannon.js.const sphereShape = new CANNON.Sphere(0.5);
const sphereBody = new CANNON.Body({ mass: 1 });
sphereBody.addShape(sphereShape);
sphereBody.position.set(1, 5, 1);
world.addBody(sphereBody);
Сфера будет корректно катиться по неровностям Heightfield, а сила тяжести и столкновения с треугольниками сетки обеспечат реалистичное поведение.
Heightfield позволяет обновлять высоты на лету:
heightfieldShape.heights[1][1] = 3;
heightfieldShape.updateMinMax(); // важно обновить min/max после изменений
mass = 0) позволяют избегать лишних
расчётов силы.Trimesh.elementSize и массива высот
критична для реалистичного поведения объектов.Heightfield в Cannon.js обеспечивает эффективный способ создания реалистичных ландшафтов с простым управлением через массив высот, обеспечивая точное взаимодействие объектов с неровной поверхностью.