Geometry
Сырые данные меша — буферы вершин, нормалей, индексов и UV — плюс билдеры примитивов, стоящие за
Mesh.box() и компанией. Тянись к ней, чтобы подправить примитив перед оборачиванием (масштаб,
сдвинутый пивот, тайловые UV) или собрать полностью процедурные меши. Geometry рендерится через
Mesh.from(); сама она не узел.
Обзор
// бокс, чей пивот у НИЖНЕЙ грани (чтобы y = 0 ставил его на пол)
const geo = Geometry.box().scale(1, 2, 1).translate(0, 1, 0)
const pillar = Mesh.from(geo, { material: Material.lit({ color: '#ccc' }) })
scene.add(pillar)Примитивы
Geometry.box(): Geometry // единичный куб, центрирован на начале координат
Geometry.sphere(options?: {
radius?: number // по умолчанию 0.5
widthSegments?: number // по умолчанию 32
heightSegments?: number // по умолчанию 32
}): Geometry
Geometry.cylinder(options?: {
radius?: number // по умолчанию 0.5 (обе крышки)
radiusTop?: number // по умолчанию = radius (0 делает конус)
radiusBottom?: number // по умолчанию = radius
edges?: number // по умолчанию 32
smooth?: boolean // по умолчанию true — гладкие боковые нормали; false = гранёные
}): Geometry
Geometry.plane(options?: {
normal?: Vec3Like // направление лица; по умолчанию [0, 0, 1]
}): GeometryВсе примитивы единичного размера (1 мировая единица ≈ 1 м в поперечнике, высота 1 для цилиндра),
центрированы на начале координат, с заполненными нормалями и UV. Плоскость — квад 1×1,
перпендикулярный normal.
Буферы
geo.vertices // Float32Array — тройки x,y,z
geo.normals // Float32Array — тройки x,y,z (на вершину)
geo.indices // Uint16Array — индексы треугольников (или рёбер/точек)
geo.uv // Float32Array — пары u,v (на вершину)
new Geometry(vertices, normals, indices, uv)Строй процедурные меши, заполняя буферы сам и конструируя напрямую.
индексы — Uint16Array, поэтому одна геометрия ограничена 65 536 вершинами.
Преобразование данных
geo.translate(x, y, z): this // сдвинуть каждую вершину — двигает пивот
geo.scale(x, y, z): this // масштабировать каждую вершину
geo.scaleUV(x, y): this // тайлить/растянуть текстурные координатыОни меняют буферы на месте (чейнятся). Запекание трансформа в геометрию отличается от node.scale:
физические формы и трансформы детей видят запечённый размер, а нормали не пересчитываются —
неравномерный scale слегка скашивает освещение.
Режим отрисовки
geo.kind = 'triangles' | 'edges' | 'vertices' // по умолчанию 'triangles' (только запись)'edges' рендерит пары индексов как линии, 'vertices' — как точки — для каркасных/отладочных видов.
Подводные камни
// ✗ редактирование Geometry после того, как из неё построен Mesh
mesh.geometry.translate(0, 1, 0) // буферы уже загружены — меш не меняется
// ✓ сначала доделай геометрию, затем Mesh.from(geo)Смотрите также
- Mesh —
Mesh.from(geometry)и ярлыки фабрик примитивов. - Material — как выглядит поверхность.
- 3D-физика и формы — авто-формы читают геометрию узла.