LiDAR Scan

A lidar scanner for Minecraft 26.2 (Forge). Client side. Author: Zenoyui.

Лидарный сканер для Minecraft 26.2 (Forge). Клиентский. Автор: Zenoyui.

Before you start. The mod does not flash on its own, but the world toggle switches the whole screen between lit and black as fast as you press it, and the point grid is a regular high contrast pattern. Both are recorded triggers for people with photosensitive epilepsy. A sparse cloud on black also asks a lot of contrast vision, and long sessions in the dark tire the eyes.
Прежде чем начать. Сам мод не мигает, но переключение показа мира меняет яркость всего экрана с той частотой, с какой вы нажимаете клавишу, а сетка точек - правильный узор с сильным перепадом светлого и тёмного. И то и другое известно как раздражитель при светочувствительной эпилепсии. Редкие точки на чёрном вдобавок требуют хорошей контрастной чувствительности, а долгая игра в темноте утомляет глаза.

Hold the scan key and the sensor fires a budget of pulses each tick. Every return becomes a point in a cloud that stays where it was measured. The world itself is not drawn, so what you see is the scan and nothing else.

Пока удерживается клавиша сканирования, прибор выпускает за тик отведённое число импульсов. Каждый возврат становится точкой облака и остаётся там, где был измерен. Сам мир не рисуется, поэтому вы видите скан и ничего кроме него.

ControlsУправление

KeyКлавишаWhat it doesЧто делает
Vhold to scanудерживать для сканирования
Zcycle scan mode: line, cone narrow, cone normal, cone wide, spinсмена режима: строка, узкий конус, обычный конус, широкий конус, вращение
Harea map scan of the space around youобзорный скан помещения вокруг вас
Jopen the settingsоткрыть настройки
Kexport the cloud of this dimensionвыгрузить облако этого измерения
Nclear the cloudочистить облако
Bshow or hide the worldпоказать или скрыть мир

What the scanner modelsЧто моделируется

Range, reflectance and noise follow the lidar equation rather than a colour ramp on a raycast. The sensor is specified the way real units are: by the range at which a ten percent reflective target still returns.

Дальность, отражение и шум следуют уравнению лидара, а не раскраске луча по шкале. Прибор задан так же, как задают настоящие: дальностью, на которой цель с отражением десять процентов ещё даёт возврат.

The cloudОблако

The cloud holds ten million points by default and up to thirty two million. Thinning is what makes that capacity last: a return landing in an already scanned cell is dropped, and the cell grid coarsens with distance the way a real scan thins out. Points expire when the world changes, because a scanner has no memory better than its last measurement. The cloud is saved per world and read back on rejoining.

Облако держит десять миллионов точек по умолчанию и до тридцати двух миллионов. Ёмкости хватает надолго благодаря прореживанию: возврат, попавший в уже отсканированную ячейку, отбрасывается, а сетка ячеек укрупняется с расстоянием - так же редеет и настоящий скан. Точки исчезают при изменении мира, потому что у сканера нет памяти надёжнее последнего измерения. Облако сохраняется для каждого мира и читается обратно при возвращении.

Three depth cues make it readable: eye-dome lighting darkens a point whose screen neighbours are nearer, point size falls as one over distance, and brightness falls with distance the way aerial perspective works outdoors. Only lightness changes, so colour stays free for the material.

Читаемость дают три признака глубины: затенение по глубине темнит точку, чьи соседи по экрану ближе; размер точки падает как обратное расстояние; яркость убывает с расстоянием так же, как работает воздушная перспектива. Меняется только светлота, поэтому цвет остаётся за материалом.

ExportВыгрузка

The export key writes the cloud of the current dimension to <game dir>/lidar/export/. The format is chosen by exportFormat.

Клавиша выгрузки пишет облако текущего измерения в <каталог игры>/lidar/export/. Формат задаётся настройкой exportFormat.

Every point carries colour, return strength as intensity, an ASPRS class code and a scan angle, so the file opens in CloudCompare, QGIS or any survey tool with the fields such a tool expects. Axes are swapped on the way out: world height goes to Z, as those tools expect. No coordinate reference system is declared, because the world has none.

Каждая точка несёт цвет, силу возврата как интенсивность, код класса ASPRS и угол сканирования, поэтому файл открывается в CloudCompare, QGIS или любой геодезической программе с теми полями, которых она ждёт. Оси меняются местами при выгрузке: высота мира уходит в Z, как эти программы и ожидают. Система координат не объявляется, поскольку у мира её нет.

The class code is the mod knowing which block it hit, not the scanner deducing it from geometry the way a real one would have to. It is a convenience of the simulation, and saying so is part of being a simulator rather than a toy.
Код класса - это мод, знающий, в какой блок попал луч, а не прибор, выводящий класс из геометрии, как пришлось бы настоящему. Это послабление модели, и назвать его прямо - часть того, чтобы быть симулятором, а не игрушкой.

SettingsНастройки

Open them with J in game, or from the mods list. Every option shows its description, unit, range and default; a value outside its range cannot be applied. The config file is config/lidar-client.toml. Defaults move themselves when the mod updates: an untouched value is migrated to the new default, an edited one is left alone.

Открываются клавишей J в игре или из списка модов. У каждой настройки видны описание, единица измерения, границы и умолчание; значение вне границ принято не будет. Файл настроек - config/lidar-client.toml. Умолчания переносятся сами при обновлении мода: нетронутое значение переходит на новое умолчание, изменённое остаётся как есть.

SensorДатчик

OptionНастройкаDefaultУмолчаниеAcceptsПринимаетWhat it doesЧто делает
sensorPreset"custom"custom, os0, os1, os2Load the specifications of a real sensor: custom, os0, os1, os2. Applied once when the value changes, so a hand-edited option is never silently undone. Figures come from the vendor product pages; what each preset writes is listed in the log.Загрузить характеристики настоящего прибора: custom, os0, os1, os2. Применяется один раз при смене значения, поэтому правка отдельного параметра вручную не отменяется молча. Числа взяты со страниц изготовителя; что именно записывает каждый набор, перечислено в журнале. [1]
maxReturnsPerRay31 .. 8Max returns per ray. A ray continues through non-opaque blocks (glass, leaves, plants, fluids).Наибольшее число возвратов на один луч. Луч продолжается сквозь непрозрачные не полностью блоки: стекло, листву, растения, жидкости.
rangeAt10PercentBlocks968 .. 512 blocksSensor range spec: distance at which a 10 percent reflective target still returns. Darker targets drop out sooner, brighter ones reach further, and the limit grows with the square of distance.Паспортная дальность прибора: расстояние, на котором цель с отражением десять процентов ещё даёт возврат. Более тёмные цели пропадают раньше, более светлые достаются дальше, а предел растёт как квадрат расстояния. [2]
beamDivergenceDeg0.180.0 .. 5.0 degreesBeam divergence, full angle. Widens the footprint with distance.Расходимость пучка, полный угол. Расширяет пятно с расстоянием. [2]
rangeNoiseCm1.00.0 .. 100.0 centimetresRange noise, one sigma. Gives the cloud its thickness.Шум дальномера, одна сигма. Даёт облаку его толщину. [2]
sensorChannels641 .. 256 channelsVertical channels of the sensor, as in a multi-channel lidar (Ouster OS1: 32, 64 or 128).Число вертикальных каналов прибора, как у многоканального лидара (Ouster OS1: 32, 64 или 128). [2]
returnMode"all"all, first, last, strongest, dualReceiver return mode, as configured on a real sensor: all, first, last, strongest, dual. A pulse crossing leaves, glass or a fence comes back as several echoes; the sensor is told which to report. dual reports the strongest and the last, which is what Velodyne and Ouster call dual return. all reports every echo and gives the densest cloud, which is why it is the default here.Режим возврата приёмника, как его задают на настоящем приборе: all, first, last, strongest, dual. Импульс, прошедший сквозь листву, стекло или забор, возвращается несколькими откликами, и прибору указывают, какие докладывать. dual докладывает наибольший и последний - это то, что Velodyne и Ouster называют двойным возвратом. all докладывает каждый отклик и даёт самое плотное облако, поэтому он и выбран умолчанием.
returnSeparationBlocks1.00.0 .. 16.0 blocksRange resolution: two echoes closer together than this merge into one. A pulse has a length, so targets nearer than half of it cannot be told apart. 0 turns the check off and lets glass one centimetre from a wall give two echoes.Разрешение по дальности: два отклика, разделённые меньшим расстоянием, сливаются в один. Импульс имеет длину, поэтому цели ближе её половины неразличимы. 0 отключает проверку и позволяет стеклу в сантиметре от стены дать два отклика. [3]
minRangeBlocks0.00.0 .. 16.0 blocksBlind zone: returns closer than this are discarded. Sensors with separate transmit and receive optics have one, about a metre on a VLP-16.Мёртвая зона: возвраты ближе неё отбрасываются. Она есть у приборов с раздельной передающей и приёмной оптикой, около метра у VLP-16. [2]

ScanСканирование

OptionНастройкаDefaultУмолчаниеAcceptsПринимаетWhat it doesЧто делает
maxRange484 .. 256 blocksMax scan ray distance.Наибольшая дальность луча сканирования.
raysPerTick5121 .. 8192 rays per tickRays cast per tick while the scan key is held. A real OS1 emits about 10.4 million points per second against 10240 rays per second here.Сколько лучей выпускается за тик, пока удерживается клавиша сканирования. Настоящий OS1 даёт около 10.4 миллиона точек в секунду против 10240 лучей в секунду здесь.
scanFovDeg602 .. 170 degreesBase opening angle of the scan pattern. Line mode uses it as fan width; the cone modes use it times 0.25, 1.0 and 2.0.Основной угол раскрытия рисунка сканирования. Строчный режим берёт его шириной веера, конусные - умноженным на 0.25, 1.0 и 2.0.
spinDegPerTick301 .. 360 degrees per tickAzimuth swept per tick in spin mode. 18 deg per tick is one revolution per second.Азимут, проходимый за тик во вращательном режиме. 18 градусов за тик дают один оборот в секунду.

CloudОблако

OptionНастройкаDefaultУмолчаниеAcceptsПринимаетWhat it doesЧто делает
maxStoredPoints100000000 .. 32000000 pointsPoint cloud capacity (ring buffer, oldest point evicted first). A point costs 26 bytes in the Java heap and 16 in video memory, and thinning adds about 13 more for its cell index. The heap arrays are allocated at full capacity as soon as the first point is stored, not as the cloud fills, and clearing the cloud does not give them back: only lowering this value does. The default reserves about 250 MB straight away and reaches about 390 MB once the cloud is full.Ёмкость облака точек (кольцевой буфер, первой вытесняется самая старая точка). Точка стоит 26 байт в куче Java и 16 в видеопамяти, а прореживание добавляет около 13 на её ячейку. Массивы выделяются сразу на полную ёмкость при первой сохранённой точке, а не по мере наполнения, и очистка облака их не возвращает: возвращает только уменьшение этого значения. Умолчание занимает около 250 МБ сразу и доходит до 390 МБ на полном облаке.
pointSpacing0.150.0 .. 2.0 blocksGrid step for thinning. A hit landing in an already occupied cell is dropped, so rescanning a surface does not consume the buffer. 0 disables thinning.Шаг сетки прореживания. Попадание в уже занятую ячейку отбрасывается, поэтому повторное сканирование поверхности не расходует буфер. 0 отключает прореживание.
spacingReferenceBlocks161 .. 256 blocksDistance at which the thinning grid step equals pointSpacing. Closer surfaces get a finer grid, further ones a coarser grid, which is how a real scan behaves: angular ray density is constant, so surface density falls with distance.Расстояние, на котором шаг сетки прореживания равен pointSpacing. Ближе сетка мельче, дальше крупнее - так ведёт себя и настоящий скан: угловая плотность лучей постоянна, поэтому плотность на поверхности падает с расстоянием.

RenderОтрисовка

OptionНастройкаDefaultУмолчаниеAcceptsПринимаетWhat it doesЧто делает
colorMode"distance"distance, intensity, materialPoint color: distance (rainbow ramp), intensity (return strength, grey), material (block map color). The colour is decided when a point is measured and kept with it, so this also decides what the export carries. Changing it does not recolour points already scanned: set material before scanning if you want block colours in the file.Цвет точки: distance (радужная шкала по расстоянию), intensity (сила возврата, оттенки серого), material (цвет блока на карте). Цвет выбирается в миг измерения и хранится вместе с точкой, поэтому им же задаётся и то, что попадёт в выгрузку. Смена настройки уже отсканированные точки не перекрашивает: если нужны цвета блоков в файле, поставьте material до сканирования.
pointLifetimeTicks20020 .. 6000 ticksParticle lifetime of one point on the fallback render path. Also the refresh period: the whole cloud is redrawn once per this interval.Время жизни частицы одной точки на запасном пути отрисовки. Оно же период обновления: всё облако перерисовывается раз за этот промежуток.
pointSize0.050.01 .. 0.5 blocksPoint quad size on the fallback particle path.Размер четырёхугольника точки на запасном, частичном пути отрисовки.
renderRange968 .. 512 blocksMax distance from the player at which stored points are redrawn. Independent of maxRange.Наибольшее расстояние от игрока, на котором сохранённые точки перерисовываются. От maxRange не зависит.
gpuPointRenderertruetrue, falseDraw the point cloud from GPU vertex buffers instead of spawning a particle per point. Off falls back to particles, which caps the cloud at a few tens of thousands of points.Рисовать облако из вершинных буферов видеокарты вместо создания частицы на каждую точку. Выключение возвращает частицы, а они ограничивают облако несколькими десятками тысяч точек.
pointPixelSize0.00.0 .. 16.0 pixelsFixed point size for the GPU renderer. 0 lets the size follow distance, which is what makes a near point look nearer than a far one.Постоянный размер точки для отрисовки видеокартой. 0 позволяет размеру следовать за расстоянием, отчего ближняя точка и выглядит ближе дальней.
roundPointstruetrue, falseDraw points as discs instead of squares. A real beam footprint is round, and a square reads as an artefact when points are large on screen.Рисовать точки кругами, а не квадратами. Пятно настоящего пучка круглое, а квадрат читается как искажение, когда точки на экране крупные.

DepthГлубина

OptionНастройкаDefaultУмолчаниеAcceptsПринимаетWhat it doesЧто делает
scalePointsWithDistancetruetrue, falseSize points by distance: a point stands for a patch of surface pointSpacing blocks across, so it shrinks as 1/distance. This is the relative size depth cue.Задавать размер точки расстоянием: точка означает участок поверхности шириной pointSpacing, поэтому уменьшается как 1/расстояние. Это признак глубины по относительному размеру. [4]
depthCueFalloffBlocks42.00.0 .. 512.0 blocksDistance over which point brightness falls to 1/e, following Koschmieder's law for aerial perspective. 42 puts the edge of a 96 block render range at about 10 percent brightness. 0 turns the cue off.Расстояние, на котором яркость точки падает в e раз, по закону Кошмидера для воздушной перспективы. При 42 край дальности отрисовки в 96 блоков имеет около десяти процентов яркости. 0 отключает признак. [5]
depthCueMinBrightness0.120.0 .. 1.0 fractionLower bound of the brightness cue. Keeps distant points visible instead of fading them to black.Нижний предел яркостного признака глубины. Оставляет дальние точки видимыми вместо угасания в чёрный.
edlEnabledtruetrue, falseEye-Dome Lighting: darken a point when its neighbours on screen are nearer to the camera. The standard shading technique for point clouds (CloudCompare, Potree, ArcGIS Pro).Затенение по глубине (Eye-Dome Lighting): точка темнеет, когда её соседи по экрану ближе к наблюдателю. Обычный приём затенения облаков точек (CloudCompare, Potree, ArcGIS Pro). [6]
edlStrength1.00.0 .. 10.0 fractionStrength of eye-dome lighting. At 1.0 an edge where distance changes by ten percent darkens to about a half.Сила затенения по глубине. При 1.0 перепад расстояния в десять процентов темнеет примерно вдвое.
edlRadiusPixels2.00.5 .. 16.0 pixelsNeighbour distance for eye-dome lighting. Larger outlines thicker and costs the same.Расстояние до соседа при затенении по глубине. Больше - толще обводка, при той же цене.

EntityСущества

OptionНастройкаDefaultУмолчаниеAcceptsПринимаетWhat it doesЧто делает
entityRefreshTicks31 .. 20 ticksTicks between redraws of entity-attached points. Lower follows a moving target more closely and costs a buffer rebuild more often.Через сколько тиков перерисовываются точки, привязанные к существам. Меньше - точнее следует за движущейся целью и чаще требует пересборки буфера.
maxEntityPoints300000 .. 200000 pointsCapacity for points attached to entities. They follow the entity and are not saved to disk. 0 disables entity scanning.Ёмкость для точек, привязанных к существам. Они следуют за существом. 0 отключает сканирование существ.
entityPointSpacing0.0250.0 .. 1.0 blocksGrid step for thinning points on entities, measured in the entity's own frame. Separate from pointSpacing because a body is small. 0 disables thinning on entities.Шаг сетки прореживания точек на существах, отсчитываемый в системе самого существа. Отдельный от pointSpacing, потому что тело мало. 0 отключает прореживание на существах.

MapОбзор

OptionНастройкаDefaultУмолчаниеAcceptsПринимаетWhat it doesЧто делает
mapScanRadius324 .. 64 blocksRadius of the area map scan (key H). The scan walks the connected air volume around the player and puts points on the block faces it touches.Радиус обзорного скана помещения (клавиша H). Скан обходит связный объём воздуха вокруг игрока и ставит точки на те грани блоков, которых касается.
mapScanBlocksPerTick4000200 .. 50000 cells per tickAir cells processed per tick by the area map scan. Higher finishes sooner and costs more per tick.Сколько ячеек воздуха обрабатывает обзорный скан за тик. Больше - раньше закончится и дороже обойдётся каждый тик.
mapScanFaceSamples31 .. 6 samples per edgePoints per block face edge for the area map scan: 2 means a 2x2 grid, four points per face.Точек на ребро грани блока при обзорном скане: 2 означает сетку 2 на 2, то есть четыре точки на грань.

ScannerРежим сканера

OptionНастройкаDefaultУмолчаниеAcceptsПринимаетWhat it doesЧто делает
scannerShowItemstruetrue, falseWhile the world is hidden (key B), keep dropped items visible.Пока мир скрыт (клавиша B), оставлять видимыми выброшенные предметы.
scannerShowNameTagstruetrue, falseWhile the world is hidden (key B), keep name tags visible: player nicknames, named mobs, and the invisible armour stands servers use for floating text.Пока мир скрыт (клавиша B), оставлять видимыми подписи: имена игроков, названных существ и невидимые стойки для брони, которыми на серверах делают парящий текст.
scannerShowDisplaystruetrue, falseWhile the world is hidden (key B), keep display entities visible: text, item and block displays.Пока мир скрыт (клавиша B), оставлять видимыми отображающие сущности: текстовые, предметные и блочные.
hideWorldtruetrue, falseHide the world (terrain, entities, sky, clouds, weather) and leave only the point cloud on black. Toggled in game with B.Скрыть мир (рельеф, существ, небо, облака, погоду) и оставить только облако точек на чёрном. Переключается в игре клавишей B.

SystemСлужебное

OptionНастройкаDefaultУмолчаниеAcceptsПринимаетWhat it doesЧто делает
exportFormat"las"las, ply, bothWhich files the export key (K) writes: las, ply, or both. LAS 1.4 point record format 7 is the ASPRS standard for lidar data and is what a survey tool expects. PLY carries the same fields and is read by mesh tools as well; coordinates in it are double precision. both writes two files from one press and costs the time and the disk space of both.Какие файлы пишет клавиша выгрузки (K): las, ply или both. LAS 1.4, запись формата 7 - отраслевой стандарт ASPRS для лидарных данных, и именно его ждёт геодезическая программа. PLY несёт те же поля и читается вдобавок средствами работы с сетками; координаты в нём двойной точности. both пишет два файла за одно нажатие и стоит времени и места обоих.
savePointCloudtruetrue, falseSave the point cloud on leaving a world and load it back on rejoining. File: <game dir>/lidar/<world>.lidarСохранять облако точек при выходе из мира и читать обратно при возвращении. Файл: <каталог игры>/lidar/<мир>.lidar
scanSoundtruetrue, falseScanner click while a scan key is held.Щелчок сканера, пока удерживается клавиша сканирования.
logPerformancefalsetrue, falseLog a timing line every 200 ticks: scan, store and buffer rebuild times, rays and points per tick.Записывать в журнал строку измерений каждые 200 тиков: время скана, укладки и пересборки буфера, число лучей и точек за тик.

Where the numbers come fromОткуда взяты числа

An option without a source is not a physical quantity: it is a load or display setting, chosen by order of magnitude.Настройка без источника не является физической величиной: это настройка нагрузки или отображения, выбранная по порядку величины.

  1. ouster.com product pages, retrieved 2026-08-17
  2. Ouster OS1 datasheet: range at 10 percent reflectivity 90 m, beam divergence 0.18 deg, precision 0.25 to 1.5 cm, minimum range 0.0 m.
  3. Velodyne VLP-16 user manual: two echoes are reported separately only when the targets are about a metre apart or more.
  4. Webvision NBK11512, monocular depth cues: relative size.
  5. Koschmieder's law of atmospheric contrast attenuation; Webvision NBK11512, aerial perspective.
  6. Boucheny, Eye-Dome Lighting: a non-photorealistic shading technique (Kitware).

Reporting a problemСообщить о неполадке

Open an issue at github.com/Zenoyui/lidar-scan. Please say which version of the mod you run, what you did and what happened. A log from the session helps more than a description of it.

Заведите запись на github.com/Zenoyui/lidar-scan. Укажите версию мода, что вы делали и что произошло. Журнал сеанса помогает больше, чем его пересказ.