LeCodesdocs

Mesh

Рисуемый 3D-узел, построенный из сырой геометрии — примитивные формы (Mesh.box(), Mesh.sphere(), …) и Mesh.from() для кастомной Geometry. Расширяет Node, поэтому применима вся поверхность трансформа, иерархии, событий и аспектов. GLB-импорт — это другой вид узла — см. Model.load.

Обзор

TypeScript
const scene = new Scene()

const ground = Mesh.plane({
  material: Material.lit({ color: '#556655' }),
  normal: [0, 1, 0],                    // лицом вверх
  scale: 20,
  receiveShadows: true,
})
const crate = Mesh.box({
  material: Material.lit({ color: '#b5854b' }),
  size: [1, 1, 1],
  position: [0, 0.5, 0],
  castShadows: true,
})
scene.add(ground, crate)
scene.open()

Фабрики примитивов

Все фабрики делят одни базовые опции и возвращают готовый Mesh:

TypeScript
type MeshOptions = {
  material?: Material          // по умолчанию Material.unlit()
  position?: Vec3Like
  eulerAngles?: Vec3Like       // градусы
  scale?: Vec3Like | number    // число = равномерно
  name?: string
  castShadows?: boolean
  receiveShadows?: boolean
}

Mesh.box(options?: MeshOptions & {
  size?: Vec3Like | number     // полные длины рёбер в мировых единицах; по умолчанию 1 (единичный куб)
})
Mesh.sphere(options?: MeshOptions & {
  radius?: number              // по умолчанию 0.5 (единичный диаметр)
  widthSegments?: number       // по умолчанию 32
  heightSegments?: number      // по умолчанию 32
})
Mesh.cylinder(options?: MeshOptions & {
  radius?: number              // по умолчанию 0.5; высота фиксирована на 1 (Y: -0.5..0.5)
  radiusTop?: number           // по умолчанию = radius (конус: поставь 0)
  radiusBottom?: number        // по умолчанию = radius
  edges?: number               // по умолчанию 32
  smooth?: boolean             // по умолчанию true — гладкие боковые нормали; false = гранёные
})
Mesh.plane(options?: MeshOptions & {
  normal?: Vec3Like            // куда смотрит квад 1×1; по умолчанию [0, 0, 1] (к камере)
})
  • Дефолты единичного размера: box 1×1×1, sphere диаметр 1, cylinder высота 1 / диаметр 1, plane 1×1. Задавай размер через size (box) или scale.
  • box.size запекается в буферы геометрии; scale — трансформ узла. Оба рисуются одинаково, но запечённый size — то, что измеряет авто-бокс Shape — подходит любой, так как авто-бокс тоже умножает на мировой масштаб.
Note

плоскости-земле нужен normal: [0, 1, 0] — дефолтный квад стоит вертикально лицом к +Z.

Кастомная геометрия

TypeScript
new Mesh(geometry?: Geometry, material?: Material)
Mesh.from(geometry: Geometry, options?: MeshOptions): Mesh

Geometry хранит сырые буферы (vertices, normals, indices, uv). Построй её из билдеров примитивов (Geometry.box(), .sphere(opts), .cylinder(opts), .plane(opts) — те же опции, что у фабрик выше) и измени её, или собери из своих Float32Array:

TypeScript
const geo = Geometry.cylinder({ radiusTop: 0, edges: 6 })   // шестиугольный конус
  .scale(1, 3, 1)                                           // меняет буфер вершин
  .translate(0, 1.5, 0)                                     // сдвинуть пивот к основанию
const spike = Mesh.from(geo, { material, position: [2, 0, 0] })

geometry.kind = 'triangles' | 'edges' | 'vertices' переключает режим отрисовки (каркас / облако точек). Задай его до конструирования Mesh.

TypeScript
mesh.geometry   // Geometry | undefined — буферы, из которых построен этот меш

Геттер geometry — то, что авто-бокс Shape измеряет для формы коллизии (см. физику).

Материалы

TypeScript
mesh.material                                  // слот 0 — get/set
mesh.setMaterial(material, index = 0): this    // чейнится, любой слот
mesh.getMaterial(index = 0): Material | null   // null, если слот пуст

У примитивов один материал-слот. Не передав материал фабрике, получишь дефолтный Material.unlit() (плоский, без освещения, без отклика на свет). См. Material.

Флаги рендера

TypeScript
mesh.castShadows = true      // только запись
mesh.receiveShadows = true   // только запись
mesh.culling = false         // только запись; отключить отсечение по фрустуму (рисовать всегда)
Note

это только сеттеры — чтения нет. Задавай при создании (опции фабрики) или храни свой флаг.

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

TypeScript
// ✗ ждать, что плоскость ляжет плашмя по умолчанию
Mesh.plane({ scale: 10 })                      // стоит вертикально, лицом к +Z
// ✓ направь нормаль вверх для пола
Mesh.plane({ scale: 10, normal: [0, 1, 0] })

// ✗ изменение копии трансформа (семантика значений — см. соглашения)
crate.position.y = 2
// ✓
crate.y = 2

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

  • Node — трансформ, иерархия, события (унаследованы).
  • Material — материалы lit/unlit/video.
  • Model — GLB-импорты (другой рисуемый вид узла).
  • Физика и формы — авто-боксы Shape из mesh.geometry.
  • Соглашения — единицы, градусы, семантика значений.