llmbench.ru

3D-сцена на three.js

Модели пишут на JavaScript модуль для three.js, который превращает JSON-описание в 3D-сцену: иерархию объектов с поворотами и масштабом, примитивы, выдавленные контуры, тысячи экземпляров, свет и камеру. Каждую сцену сравнивают с эталоном по мировым матрицам, габаритам, цветам и попаданиям лучей из камеры.

29 октября 2026. 7 прогонов, 5 моделей.

тест пройденпроваленкод не запустился
1Qwen3.8-Max164из 1642Kimi K3.1 Pro164из 1643Claude Opus 5.5 (агент)164из 1644Claude Opus 5.5 (агент, effort max)164из 1645GPT-6.1 Sol164из 1646DeepSeek Flash (V4.1)164из 1647Claude Opus 5.5 (effort max)158из 16438 ручных сцен120 случайных сцен6 описаний с ошибкой
Каждое деление означает один тест. Столбцы общие для всех прогонов и отсортированы так, что слева стоят тесты, которые прошли почти все, а справа те, что не дались никому.

Как модели построили контрольную сцену

Одна и та же сцена, отрендеренная WebGL в Chrome без окна одним и тем же рендерером. Отличаются только сами сцены, которые построил код модели. Переключатель «Отличия от эталона» подсвечивает красным пиксели, которые не совпали.

Покрутить сцену в 3D

Что выяснили

Пять моделей прошли всё.Opus 5.5 агентом, Qwen3.8-Max, Kimi K3.1 Pro, GPT-6.1 Sol и DeepSeek Flash прошли 164 сцены из 164: совпали матрицы, габариты, цвета в линейном пространстве, матрицы экземпляров и все 63 луча из камеры. Ловушки three.js вроде lookAt, который у объекта и у камеры смотрит в разные стороны, никого не поймали.

Фраза в задании выключила размышление у Opus через API.«Ответь ТОЛЬКО кодом» адаптивный Opus 5.5 понимает как «не размышляй», даже при effort: max, и пишет код с 5-й секунды. Проверка шлюза показала, что effort передаётся правильно. С формулировкой «сначала продумай» Opus думал 6 тысяч токенов и прошёл 161 сцену вместо 158. В следующих тестах формулировка заменена.

Скорость кода здесь не различает модели.Все решения строят 50 000 экземпляров и тысячи объектов с lookAt за сотые доли секунды. Места среди безошибочных определяются суммарным временем замеров, а эта разница на уровне погрешности.

Время ответа различается почти в 70 раз.Opus через API ответил за 30 секунд, Opus-агент за 2 минуты 40 секунд, DeepSeek Flash за 3,5 минуты, GPT за 5 минут, Kimi за 12 минут, Qwen за 34 минуты. Колонка «Токенов/с» в таблице показывает, кто медленно пишет, а кто много думает.

Все прогоны

МестоМодельТестыЛовушкиСлучайныеОшибкиСкоростьВремяРассуждениеВсего токеновТокенов/сСтрок кодаС правкой
🥇 1Qwen3.8-Max164 (100.0%)38/38120/1206/63/334 мин 12 с81.5K85.2K42446—
🥈 2Kimi K3.1 Pro164 (100.0%)38/38120/1206/63/311 мин 56 с17K19.2K27341—
🥉 3Claude Opus 5.5 (агент)164 (100.0%)38/38120/1206/63/32 мин 40 с8.5K*13K81*277—
4Claude Opus 5.5 (агент, effort max)164 (100.0%)38/38120/1206/63/312 мин 05 с80.8K*83.7K115*325—
5GPT-6.1 Sol164 (100.0%)38/38120/1206/63/35 мин 11 сскрыто13.4K43415—
6DeepSeek Flash (V4.1)164 (100.0%)38/38120/1206/63/33 мин 33 с38.8K41.4K194336—
7Claude Opus 5.5 (effort max)158 (96.3%)38/38117/1203/63/330 с04.2K140284—

В колонке «С правкой» указан результат того же кода после исправления одной-двух строк, он нужен только для понимания. Звёздочка означает оценку. «Токенов/с» показывает, как быстро модель пишет: все токены ответа, включая рассуждение, делённые на полное время ответа.

Время и токены

Время ответа

От отправки задания до последнего символа ответа. Зависит и от загрузки серверов провайдера.

0 мин10 мин20 мин30 мин40 минQwen3.8-Max34 мин 12 сKimi K3.1 Pro11 мин 56 сClaude Opus 5.5 (агент)2 мин 40 сClaude Opus 5.5 (агент, effort max)12 мин 05 сGPT-6.1 Sol5 мин 11 сDeepSeek Flash (V4.1)3 мин 33 сClaude Opus 5.5 (effort max)30 с

Сколько модель написала

рассуждениекод и ответпровайдер скрывает разбивку
0K20K40K60K80K100KQwen3.8-Max85.2KKimi K3.1 Pro19.2KClaude Opus 5.5 (агент)13KClaude Opus 5.5 (агент, effort max)83.7KGPT-6.1 Sol13.4K, разбивка скрытаDeepSeek Flash (V4.1)41.4KClaude Opus 5.5 (effort max)4.2K

Разбор по участникам

Qwen3.8-MaxAlibaba, qwen3.8-max
164 сцены из 164 и все три замера скорости, причём самые быстрые: 0,01, 0,02 и 0,01 секунды. Зато ответ занял больше всех, 34 минуты: около 81 тысячи токенов рассуждения при скорости около 40 токенов в секунду. Код 446 строк.
Kimi K3.1 ProMoonshot AI, kimi-k3.1-pro
164 сцены из 164 и все три замера скорости. Ответ занял 12 минут, из них около 17 тысяч токенов рассуждения. Код 340 строк. Третий тест подряд у Kimi без ошибок или почти без них.
Claude Opus 5.5 (агент)Anthropic, claude-opus-5-5
164 сцены из 164 и все три замера скорости. Решение заняло 2 минуты 40 секунд и 277 строк. Агент работал вслепую: одно чтение задания, одна запись решения, код не запускался (протокол проверен). Это третий тест подряд, где Opus-агент проходит всё. Свои допущения агент перечислил в отчёте сам, и все они совпали с эталоном.
Claude Opus 5.5 (агент, effort max)Anthropic, claude-opus-5-5
164 сцены из 164 и все три замера скорости. Ответ занял 12 минут, на рассуждение ушло около 81 тысячи токенов. Opus через API на том же effort: max не рассуждал вовсе и прошёл 158 сцен, так что разница в шесть сцен целиком объясняется размышлением. Протокол соблюдён: одно чтение задания и одна запись решения.
GPT-6.1 SolOpenAI, gpt-6.1-sol
164 сцены из 164 и все три замера скорости. Ответ пришёл за 5 минут 10 секунд, рассуждение провайдер не показывает. Код самый длинный среди безошибочных, 414 строк.
DeepSeek Flash (V4.1)DeepSeek, deepseek-flash
164 сцены из 164 и все три замера скорости, и снова самый быстрый ответ среди безошибочных: 3,5 минуты. На рассуждение ушло почти 39 тысяч токенов, код 335 строк.
Claude Opus 5.5 (effort max)Anthropic, claude-opus-5-5
158 сцен из 164 и все три замера скорости, ответ за 30 секунд без размышления. В трёх случайных сценах не совпали мировые матрицы: модель один раз обновляет матрицы и потом применяет все lookAt подряд, поэтому потомок поворачивается по устаревшему положению родителя, у которого тоже есть lookAt. Ещё три промаха на проверке ввода: не ловятся неверный цвет, цвет из четырёх цифр и неверный порядок поворота у узла без rotation. Отдельная проверка показала, что размышление отключает последняя фраза задания «Ответь ТОЛЬКО кодом»: с фразой «сначала продумай» тот же Opus думал 6 тысяч токенов и прошёл 161 сцену.

Как устроен тест

Задание

Нужно написать ES-модуль с функцией buildScene(THREE, spec), которая возвращает { scene, camera }. Описание задаёт дерево узлов с позицией, поворотом в градусах и порядком Эйлера, масштабом (в том числе отрицательным) и lookAt, примитивы box, sphere, cylinder, torus, plane, выдавленные контуры с отверстиями, InstancedMesh, три вида света и перспективную или ортографическую камеру. Цвета задаются в sRGB.

Напиши на JavaScript модуль для three.js r186, который строит 3D-сцену по описанию в JSON. Модуль экспортирует одну функцию и ничего не импортирует: объект `THREE` (то, что экспортирует пакет `three`) передаётся аргументом.

## Интерфейс

```js
export function buildScene(THREE, spec) {
  // ...
  return { scene, camera };
}
```

`scene` это `THREE.Scene`, `camera` это `THREE.PerspectiveCamera` или `THREE.OrthographicCamera`. Камеру в сцену добавлять не нужно. Перед возвратом у сцены и камеры должны быть актуальны мировые матрицы, а у камеры матрица проекции.

## Описание сцены

```js
{
  "background": "#101820",          // цвет фона: scene.background = new THREE.Color(...); по умолчанию "#000000"
  "camera": { ... },                // камера, см. ниже
  "nodes": [ { ... }, { ... } ]     // узлы верхнего уровня, у каждого могут быть "children"
}
```

## Узлы

Каждый узел становится объектом three.js с `name` из описания и добавляется к родителю (узлы верхнего уровня к сцене) в порядке описания. Общие поля всех узлов:

- `name`: уникальное имя, записывается в `object.name`.
- `type`: тип узла, см. ниже.
- `position`: `[x, y, z]`, по умолчанию `[0, 0, 0]`.
- `rotation`: углы `[x, y, z]` **в градусах**, по умолчанию нули. `rotationOrder`: порядок поворотов Эйлера, одна из строк `"XYZ"`, `"XZY"`, `"YXZ"`, `"YZX"`, `"ZXY"`, `"ZYX"`, по умолчанию `"XYZ"`.
- `scale`: число (одинаковый масштаб по всем осям) или `[x, y, z]`, по умолчанию 1. Значения могут быть отрицательными.
- `lookAt`: точка `[x, y, z]` в мировых координатах. Если она задана, узел поворачивается методом `Object3D.lookAt` к этой точке, а `rotation` не используется. Все `lookAt` применяются после того, как построено всё дерево, в порядке описания (родитель раньше потомков), и каждый учитывает текущие мировые преобразования родителей.
- `visible`: `false` делает объект невидимым, по умолчанию видимый.
- `children`: дочерние узлы.

Типы узлов:

- `group`: `THREE.Group`.
- Примитивы, каждый становится `THREE.Mesh` со своей геометрией three.js:
  - `box`: `size: [w, h, d]` → `BoxGeometry(w, h, d)`;
  - `sphere`: `radius`, `widthSegments` (по умолчанию 32), `heightSegments` (по умолчанию 16) → `SphereGeometry`;
  - `cylinder`: `radiusTop`, `radiusBottom`, `height`, `radialSegments` (по умолчанию 32) → `CylinderGeometry`;
  - `torus`: `radius`, `tube`, `radialSegments` (по умолчанию 16), `tubularSegments` (по умолчанию 48) → `TorusGeometry`;
  - `plane`: `size: [w, h]` → `PlaneGeometry(w, h)`;
  - `extrude`: `points` (контур `[[x, y], ...]` в плоскости XY, не меньше трёх точек), `holes` (необязательный список отверстий, каждое тоже список точек), `depth` → `ExtrudeGeometry` с `bevelEnabled: false` и `steps: 1`.
- `instances`: `THREE.InstancedMesh`. Поле `geometry` описывает геометрию одного экземпляра так же, как примитив (`{"type": "box", "size": [...]}`, допустимы типы `box`, `sphere`, `cylinder`, `torus`, `plane`), `items` это список экземпляров, у каждого необязательные `position`, `rotation` (градусы, порядок всегда `"XYZ"`) и `scale` (число или тройка). Число экземпляров равно длине `items`, может быть нулём. Матрица экземпляра собирается из его позиции, поворота и масштаба.
- Источники света:
  - `ambient`: `THREE.AmbientLight(color, intensity)`;
  - `directional`: `THREE.DirectionalLight(color, intensity)`, поле `target: [x, y, z]` (по умолчанию начало координат) задаёт позицию `light.target`, а сам `target` добавляется в сцену;
  - `point`: `THREE.PointLight(color, intensity, distance, decay)`, по умолчанию `distance` 0 и `decay` 2.

  У света `color` по умолчанию `"#ffffff"`, `intensity` по умолчанию 1.

## Материал

У примитивов и `instances` материал `THREE.MeshStandardMaterial`:

- `color`: цвет из описания, по умолчанию `"#ffffff"`;
- `opacity`: из поля `opacity`, по умолчанию 1; `transparent: true`, если `opacity < 1`;
- `side`: `THREE.DoubleSide`, если у узла `doubleSided: true`, иначе `THREE.FrontSide`.

## Цвета

Цвет задаётся строкой `#rgb` или `#rrggbb` в пространстве sRGB, как в CSS, и превращается в `THREE.Color` стандартным способом three.js. Любая другая строка считается ошибкой.

## Камера

- `"type": "perspective"` (по умолчанию): `fov` (по умолчанию 50), `aspect` (по умолчанию 1), `near` (0.1), `far` (1000).
- `"type": "orthographic"`: `left`, `right`, `top`, `bottom`, `near` (0.1), `far` (1000).
- Общие поля: `position` (по умолчанию `[0, 0, 10]`), `lookAt` (по умолчанию `[0, 0, 0]`), необязательный `up: [x, y, z]`, который задаётся до `lookAt`.

## Ошибки

Неизвестный тип узла или геометрии экземпляров, неверная строка цвета, `extrude` меньше чем из трёх точек и неизвестный `rotationOrder` должны выбрасывать исключение.

## Производительность

Сцена из 3000 объектов с `lookAt`, цепочка из 1500 вложенных групп с `lookAt` у каждого объекта и `instances` из 50 000 экземпляров должны строиться не дольше 2 секунд каждая.

## Формат ответа

Ответь ТОЛЬКО кодом модуля в одном блоке ```javascript.
Как проверяли
  • 38 ручных сцен с ловушками. Среди них градусы вместо радиан, порядки поворота YXZ и ZYX, глубокая иерархия с масштабом, отрицательный масштаб, lookAt, который у обычного объекта направляет к цели ось +Z, а у камеры ось −Z, lookAt внутри повёрнутого родителя и у родителя с потомком, цвет #ff8800, который three.js хранит в линейном пространстве, короткие записи цвета, контур с отверстием, пустой список экземпляров, цель направленного света, ортографическая камера и камера с осью up.
  • 120 случайных сцен из генератора с фиксированным seed: деревья до четырёх уровней из всех типов узлов, случайные повороты, порядки, масштабы, lookAt, прозрачность, невидимые объекты, свет и камеры.
  • 6 описаний, которые обязаны закончиться исключением: неизвестный тип, неверный цвет, цвет из четырёх цифр, контур из двух точек, неизвестный порядок поворота, неизвестная геометрия экземпляров.
  • 3 замера скорости: 3000 объектов с lookAt, цепочка из 1500 вложенных групп с lookAt и 50 000 экземпляров. На каждый даётся 2 секунды, эталон укладывается в 0,11 секунды.
  • Каждая сцена сравнивается с эталоном по всем именованным объектам: тип, родитель, видимость, мировая матрица, число вершин и габариты в мире, цвет, прозрачность и сторона материала, матрицы экземпляров, параметры света. У камеры сравниваются матрица проекции и положение. Затем из камеры пускаются 63 луча, и для каждого первый задетый объект должен совпасть с эталоном.
  • Сам стенд проверен эталоном: 164 сцены из 164 и все три замера.
Условия
  • Участвуют модели, которые дали рабочий код в предыдущих тестах. Каждая получила задание слово в слово, одним сообщением, без системного промпта и без инструментов, и не могла запустить свой код.
  • Параметры рассуждения такие же, как раньше: у Qwen включён enable_thinking, у GPT reasoning_effort: high, Opus через API получал thinking: adaptive и effort: max через нативный /messages партнёрского шлюза, Kimi и DeepSeek работали в режиме по умолчанию.
  • Opus 5.5 дополнительно решал задачу агентом Claude Code с чистым контекстом: одно чтение задания и одна запись решения, без запуска кода.
  • Grok 4.7 не участвует: в двух прошлых тестах партнёрский шлюз обрывал все его попытки.
  • В зачёт идёт код как есть. Вариант с правкой одной строки считается отдельно, только для понимания.
Нюансы
  • Задание заканчивалось фразой «Ответь ТОЛЬКО кодом модуля». Для моделей с адаптивным мышлением она оказалась невыгодной, это видно по Opus через API. Начиная со следующего теста задания заканчиваются фразой «Сначала продумай решение, затем ответь модулем».
  • Проверка шлюза: на задаче-головоломке Opus с effort: low думал 700 токенов, с max 19 тысяч. Значит, effort доходит до модели, и дело не в коннекторе.
  • Диагностические прогоны Opus с другой формулировкой в рейтинг не входят, в рейтинге прогон по общему заданию.
  • Все замеры скорости уложились с большим запасом, поэтому места среди решений без ошибок условны: разница во времени замеров на уровне погрешности.
  • Галерея рендерится одним и тем же кодом WebGL в Chrome без окна (SwiftShader). Отличия на картинках бывают только от разной сцены, которую построила модель.
  • Время и токены Opus-агента оценочные, по объёму кэша контекста. Протокол агента проверен: одно чтение задания и одна запись решения.
  • Opus-агент с effort: max добавлен 29.10.2026, после основного прогона, по тому же протоколу: одно чтение задания и одна запись решения, без запуска кода. Его запустили, чтобы сравнить с Opus через API на том же effort: max: через партнёрский шлюз модель рассуждает заметно меньше.
Участники и доступ
МодельРазработчикIDДоступЛимит ответа
Claude Opus 5.5 (агент)Anthropicclaude-opus-5-5субагент Claude Code, чистый контекст, без запуска кода—
Claude Opus 5.5 (агент, effort max)Anthropicclaude-opus-5-5субагент Claude Code, effort: max, чистый контекст, без запуска кода—
Kimi K3.1 ProMoonshot AIkimi-k3.1-proAPI api.moonshot.ai (через VPN роутера)128K
Qwen3.8-MaxAlibabaqwen3.8-maxAPI token-plan.maas.qwencloudapi.com131.1K
GPT-6.1 SolOpenAIgpt-6.1-solпартнёрский шлюз, reasoning_effort: high128K
DeepSeek Flash (V4.1)DeepSeekdeepseek-flashAPI api.deepseek.com384K
Claude Opus 5.5 (effort max)Anthropicclaude-opus-5-5партнёрский шлюз, нативный /messages, thinking: adaptive, effort: max128K