Mesh
Рисуемый 3D-узел, построенный из сырой геометрии — примитивные формы (Mesh.box(), Mesh.sphere(),
…) и Mesh.from() для кастомной Geometry. Расширяет Node, поэтому применима
вся поверхность трансформа, иерархии, событий и аспектов. GLB-импорт — это другой вид узла — см.
Model.load.
Обзор
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:
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— подходит любой, так как авто-бокс тоже умножает на мировой масштаб.
плоскости-земле нужен normal: [0, 1, 0] — дефолтный квад стоит вертикально лицом к +Z.
Кастомная геометрия
new Mesh(geometry?: Geometry, material?: Material)
Mesh.from(geometry: Geometry, options?: MeshOptions): MeshGeometry хранит сырые буферы (vertices, normals, indices, uv). Построй её из билдеров
примитивов (Geometry.box(), .sphere(opts), .cylinder(opts), .plane(opts) — те же опции, что у
фабрик выше) и измени её, или собери из своих Float32Array:
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.
mesh.geometry // Geometry | undefined — буферы, из которых построен этот мешГеттер geometry — то, что авто-бокс Shape измеряет для формы коллизии
(см. физику).
Материалы
mesh.material // слот 0 — get/set
mesh.setMaterial(material, index = 0): this // чейнится, любой слот
mesh.getMaterial(index = 0): Material | null // null, если слот пустУ примитивов один материал-слот. Не передав материал фабрике, получишь дефолтный Material.unlit()
(плоский, без освещения, без отклика на свет). См. Material.
Флаги рендера
mesh.castShadows = true // только запись
mesh.receiveShadows = true // только запись
mesh.culling = false // только запись; отключить отсечение по фрустуму (рисовать всегда)это только сеттеры — чтения нет. Задавай при создании (опции фабрики) или храни свой флаг.
Подводные камни
// ✗ ждать, что плоскость ляжет плашмя по умолчанию
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. - Соглашения — единицы, градусы, семантика значений.