LeCodesdocs

Geometry

Сырые данные меша — буферы вершин, нормалей, индексов и UV — плюс билдеры примитивов, стоящие за Mesh.box() и компанией. Тянись к ней, чтобы подправить примитив перед оборачиванием (масштаб, сдвинутый пивот, тайловые UV) или собрать полностью процедурные меши. Geometry рендерится через Mesh.from(); сама она не узел.

Обзор

TypeScript
// бокс, чей пивот у НИЖНЕЙ грани (чтобы 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)

Примитивы

TypeScript
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.

Буферы

TypeScript
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)

Строй процедурные меши, заполняя буферы сам и конструируя напрямую.

Note

индексы — Uint16Array, поэтому одна геометрия ограничена 65 536 вершинами.

Преобразование данных

TypeScript
geo.translate(x, y, z): this     // сдвинуть каждую вершину — двигает пивот
geo.scale(x, y, z): this         // масштабировать каждую вершину
geo.scaleUV(x, y): this          // тайлить/растянуть текстурные координаты

Они меняют буферы на месте (чейнятся). Запекание трансформа в геометрию отличается от node.scale: физические формы и трансформы детей видят запечённый размер, а нормали не пересчитываются — неравномерный scale слегка скашивает освещение.

Режим отрисовки

TypeScript
geo.kind = 'triangles' | 'edges' | 'vertices'    // по умолчанию 'triangles' (только запись)

'edges' рендерит пары индексов как линии, 'vertices' — как точки — для каркасных/отладочных видов.

Подводные камни

TypeScript
// ✗ редактирование Geometry после того, как из неё построен Mesh
mesh.geometry.translate(0, 1, 0)     // буферы уже загружены — меш не меняется
// ✓ сначала доделай геометрию, затем Mesh.from(geo)

Смотрите также

  • MeshMesh.from(geometry) и ярлыки фабрик примитивов.
  • Material — как выглядит поверхность.
  • 3D-физика и формы — авто-формы читают геометрию узла.