diff --git a/docs/list.json b/docs/list.json index eadf2f26603bb0..61bcd3fa869a59 100644 --- a/docs/list.json +++ b/docs/list.json @@ -1951,14 +1951,14 @@ "Полезные ссылки": "manual/ru/introduction/Useful-links" }, - "Next Steps": { - "How to update things": "manual/en/introduction/How-to-update-things", - "How to dispose of objects": "manual/en/introduction/How-to-dispose-of-objects", - "How to create VR content": "manual/en/introduction/How-to-create-VR-content", - "How to use post-processing": "manual/en/introduction/How-to-use-post-processing", - "Matrix transformations": "manual/en/introduction/Matrix-transformations", - "Animation system": "manual/en/introduction/Animation-system", - "Color management": "manual/en/introduction/Color-management" + "Следующие шаги": { + "Как обновить предметы": "manual/ru/introduction/How-to-update-things", + "Как избавиться от объектов": "manual/ru/introduction/How-to-dispose-of-objects", + "Как создавать VR-контент": "manual/ru/introduction/How-to-create-VR-content", + "Как использовать постобработку": "manual/ru/introduction/How-to-use-post-processing", + "Матричные преобразования": "manual/ru/introduction/Matrix-transformations", + "Анимационная система": "manual/ru/introduction/Animation-system", + "Управление цветом": "manual/ru/introduction/Color-management" } }, diff --git a/docs/manual/ru/introduction/Animation-system.html b/docs/manual/ru/introduction/Animation-system.html new file mode 100644 index 00000000000000..6360abac480a58 --- /dev/null +++ b/docs/manual/ru/introduction/Animation-system.html @@ -0,0 +1,147 @@ + + + + + + + + + +

Анимационная система ([name])

+ +

Обзор

+ +

+ + В анимационной системе three.js вы можете анимировать различные свойства ваших моделей: + кости [page:SkinnedMesh skinned and rigged model], морфинговые цели, различные свойства материала (цвета, + непрозрачность, логические значения), видимость и преобразования. Анимированные свойства + могут быть плавными, исчез, затухал и деформировался. Весовые и временные масштабы + различных одновременных анимацию на одном и том же объекте, а также на разных объектах + можно менять независимо. Могут быть различные анимации на одном и на разных объектах + было синхронизировано.

+ + Чтобы добиться всего этого в одной однородной системе, используется система анимации + three.js [link:https://github.com/mrdoob/three.js/issues/6881 has completely changed in 2015] (остерегайтесь устаревшей информации!), и теперь + он имеет архитектуру, аналогичную Unity/Unreal Engine 4. На этой странице представлен + краткий обзор основных компонентов системы и то, как они работают вместе. + +

+ +

Анимационные клипы

+ +

+ + Если вы успешно импортировали анимированный 3D-объект (неважно, есть ли у него кости или + цели морфинга или и то, и другое) — например, экспортируя их из Blender с помощью + [link:https://github.com/KhronosGroup/glTF-Blender-IO glTF Blender exporter] и + загрузка его в сцену three.js с помощью [page:GLTFLoader] — одного из полей + вета должен быть массивом с именем "animations", содержащим [page:AnimationClip AnimationClips] + для этой модели (см. список возможных загрузчиков ниже).

+ + Каждый `AnimationClip` обычно содержит данные для определенной активности объекта. Если + сетка — это персонаж, например, для цикла ходьбы может быть один AnimationClip, второй для + прыжка, третий для уклонения и так далее. + +

+ +

Дорожки ключевых кадров

+ +

+ + Внутри такого `AnimationClip` данные для каждого анимированного свойства хранятся в + отдельный [page:KeyframeTrack]. Предполагая, что объект персонажа имеет [page:Skeleton skeleton], + одна дорожка ключевого кадра может хранить данные об изменениях положения кости предплечья. + C течением времени разные отслеживают данные об изменении ротации одной и той же кости, + третьи положение дорожки, вращение или масштабирование другой кости и так далее. Должно + быть ясно, что AnimationClip может состоять из множества таких дорожек.

+ + Предполагая, что модель имеет цели морфинга (например, один морф мишень показывает + дружелюбное лицо, а другая — сердитое лицо), каждая дорожка содержит информация о том, + как [page:Mesh.morphTargetInfluences influence] определенного морфа меняется цель во время исполнения клипа. + +

+ +

Анимационный микшер

+ +

+ + Сохраненные данные составляют только основу для анимации — фактическое + воспроизведение контролируется [page:AnimationMixer]. Вы можете представить это не + только как плеер для анимации, но и как как симуляция аппаратного обеспечения, такого как + настоящий микшерная консоль, который может управлять несколькими анимациями + одновременно, смешивая и объединяя их. + +

+ +

Анимационные действия

+ +

+ + `AnimationMixer` сам по себе имеет очень мало (общих) свойств и методов, потому что он + можно контролироваться с помощью [page:AnimationAction AnimationActions]. Настроив `AnimationAction` вы можете + пределить, когда определенное `AnimationClip` будет воспроизведено, поставлено на паузу + или остановлнено на одном из микшеров, и если часто клип придется повторять, будь то + должно выполняться с затуханием или масштабированием времени, а также некоторыми + дополнительными вещами, такими как кроссфейдинг или синхронизация. + +

+ +

Группы объектов анимации

+ +

+ + Если вы хотите, чтобы группа объектов получила общее состояние анимации, вы можете + использовать [page:AnimationObjectGroup]. + +

+ +

Поддерживаемые форматы и загрузчики

+ +

+ Обратите внимание, что не все форматы моделей включают анимацию (особенно OBJ), и что + только некоторые loaders three.js поддерживают последовательности [page:AnimationClip AnimationClip]. + Несколько Loaders, которые поддерживают этот тип анимации: +

+ + + +

+ Обратите внимание, что 3ds max и Maya в настоящее время не могут экспортировать несколько + анимаций (то есть анимации, которые не являются на той же временной шкале) + непосредственно в один файл. +

+ +

Пример

+ + + let mesh; + + // Создайте AnimationMixer и получите список экземпляров AnimationClip + const mixer = new THREE.AnimationMixer( mesh ); + const clips = mesh.animations; + + // Обновляйте mixer для каждого кадра + function update () { + mixer.update( deltaSeconds ); + } + + // Воспроизведение определенной анимации + const clip = THREE.AnimationClip.findByName( clips, 'dance' ); + const action = mixer.clipAction( clip ); + action.play(); + + // Воспроизведение всех анимаций + clips.forEach( function ( clip ) { + mixer.clipAction( clip ).play(); + } ); + + + + diff --git a/docs/manual/ru/introduction/Color-management.html b/docs/manual/ru/introduction/Color-management.html new file mode 100644 index 00000000000000..a1b70be1a3a36a --- /dev/null +++ b/docs/manual/ru/introduction/Color-management.html @@ -0,0 +1,356 @@ + + + + + + + + + + + + +

Управление цветом ([name])

+ +

Что такое цветовое пространство?

+ +

+ Каждое цветовое пространство представляет собой совокупность нескольких дизайнерских + решений, выбранных вместе для поддержки широкого диапазон цветов и + при этом удовлетворять технические ограничения, связанными с точностью и отображением + технологий. При создании 3D-ресурса или сборке 3D-ресурсов в сцену важно знать, что это за + свойства и как связаны свойства одного цветового пространства к другим цветовым + пространствам сцены. +

+ +
+ +
+ Цвета sRGB и точка белого (D65) показаны на эталонной диаграмме цветности CIE 1931. + Цветная область представляет собой 2D-проекцию гаммы sRGB, которая представляет собой 3D-объем. + Источник: Wikipedia +
+
+ + + + Эти три параметра — основные цвета, точка белого и передаточные функции — определяют + цветовое пространство, и каждый из них выбирается для конкретных целей. Определив параметры + полезно использовать несколько дополнительных терминов: + + + +

+ Рассмотрим два очень распространенных цветовых пространства: [page:SRGBColorSpace] ("sRGB") и + [page:LinearSRGBColorSpace] ("Линейный-sRGB"). Оба используют одни и те же основные цвета и + точки белого, и, следовательно, они имеют одинаковую цветовую гамму. В обоих используется цветовая модель + RGB. Они отличаются только передаточными функциями — Linear-sRGB линейны по отношению к + физической интенсивности света. sRGB использует нелинейные функции передачи sRGB и + больше напоминает способ восприятия света человеческим глазом и чувствительности + обычных устройств отображения. +

+ +

+ Эта разница важна. Расчеты освещения и другие операции рендеринга должны обычно + происходить в линейном цветовом пространстве. Однако линейные цвета менее эффективны + для хранения в буфере изображений или кадров и выглядят некорректно при просмотре + человеком-наблюдателем. В результате входные текстуры и окончательное визуализированное + изображение обычно будет использовать нелинейное цветовое пространство sRGB. +

+ +
+

+ ℹ️ ВНИМАНИЕ: Хотя некоторые современные дисплеи поддерживают более широкий цветовой охват, + например Display-P3, графические API веб-платформы во многом полагаются на sRGB. Приложения, + использующие three.js. Сегодня обычно используют только цветовые пространства sRGB и Linear- + sRGB. +

+
+ +

Роль цветовых пространств

+ +

+ Линейные рабочие процессы — необходимые для современных методов рендеринга — обычно + включают в себя более одного цветового пространства, каждое из которых назначено на + определенную роль. Линейные и нелинейные цветовые пространства подходят для разных + ролей, как описано ниже. +

+ +

Входное цветовое пространство

+ +

+ Цвета, поставляемые в three.js — из палитр цветов, текстур, 3D-моделей и других источников + — каждый из них имеет связанное цветовое пространство. Т.е., у кого еще нет рабочего цвета + Linear-sRGB. Пространство должно быть преобразовано, а текстурам присвоено правильное + назначение texture.colorSpace. Определенные преобразования (для шестнадцатеричных + цветов и цветов CSS в sRGB) могут выполняться автоматически, если API + THREE.ColorManagement включается перед инициализацией цветов: +

+ + +THREE.ColorManagement.enabled = true; + + +

+ THREE.ColorManagement включен по умолчанию. +

+ + + +
+

+ ⚠️ ВНИМАНИЕ: Многие форматы 3D-моделей работают неправильно или некорректно определяя + информацию о цветовом пространстве. Хотя three.js пытается справиться с большинством случаев, + возникают проблемы являющимися общими для старых форматов файлов. Для достижения наилучших + результатов используйте glTF 2.0 ( GLTFLoader ) и заранее протестируйте 3D-модели в онлайн-средствах + просмотра, чтобы убедиться в правильности самого ресурса. +

+
+ +

Рабочее цветовое пространство

+ +

+ Рендеринг, интерполяция и многие другие операции должны выполняться в линейном + рабочем цветовом пространстве, в котором компоненты RGB пропорциональны + физическому освещению. В three.js рабочее цветовое пространство является Linear-sRGB. +

+ +

Выходное цветовое пространство

+ +

+ Вывод на устройство отображения, изображения или видео может включать преобразование + из открытого домена рабочее цветовое пространство Linear-sRGB в другое цветовое + пространство. Преобразование определяется следующим образом ([page:WebGLRenderer.outputColorSpace]). + Когда используешь постобработку, требуется OutputPass. +

+ + + +
+

+ ⚠️ ВНИМАНИЕ: Цели рендеринга могут использовать либо sRGB, либо Linear-sRGB. sRGB делает лучшее + использование ограниченной точности. В закрытой области для sRGB часто достаточно 8 бит. Тогда как + для Linear-sRGB может потребоваться ≥12 бит (полуплавающее число).Если для ступеней водопровода требуется + линейный ввод данных в формате sRGB, дополнительные преобразования могут иметь небольшую стоимость + на производительность. +

+
+ +

+ Пользовательские материалы на основе [page:ShaderMaterial] и [page:RawShaderMaterial] должны + реализовывать собственное преобразование выходного цветового пространства. Для случаев + `ShaderMaterial`, добавив `colorspace_fragment` фрагмент шейдера во фрагментный шейдер + `main()` функции должно быть достаточно. +

+ +

Работа с экземплярами THREE.Color

+ +

+ Методы чтения или изменения экземпляров [page:Color] предполагают, что данные уже находятся в + рабочем цветовом пространстве three.js, Linear-sRGB. RGB и HSL компоненты являются + прямыми представления данных, хранящихся экземпляром Color, и никогда не преобразуются + неявно. Цветовые данные могут быть явно преобразованы с помощью .convertLinearToSRGB() + или .convertSRGBToLinear(). +

+ + + // RGB компоненты (без изменений). + color.r = color.g = color.b = 0.5; + console.log( color.r ); // → 0.5 + + // Ручное преобразование. + color.r = 0.5; + color.convertSRGBToLinear(); + console.log( color.r ); // → 0.214041140 + + +

+ Если ColorManagement.enabled = true установлено (рекомендуется), то некоторые преобразования + производятся автоматически. Поскольку шестнадцатеричные цвета и цвета CSS обычно имеют + формат sRGB, [page:Color] методы автоматически преобразуют эти входные данные из sRGB в Linear- + sRGB в установщиках или конвертируют из Linear-sRGB в sRGB при возврате + шестнадцатеричного или CSS-вывода из геттеров. +

+ + + // Шестнадцатеричное преобразование. + color.setHex( 0x808080 ); + console.log( color.r ); // → 0.214041140 + console.log( color.getHex() ); // → 0x808080 + + // CSS преобразование. + color.setStyle( 'rgb( 0.5, 0.5, 0.5 )' ); + console.log( color.r ); // → 0.214041140 + + // Переопределить преобразование с помощью аргумента 'colorSpace'. + color.setHex( 0x808080, LinearSRGBColorSpace ); + console.log( color.r ); // → 0.5 + console.log( color.getHex( LinearSRGBColorSpace ) ); // → 0x808080 + console.log( color.getHex( SRGBColorSpace ) ); // → 0xBCBCBC + + +

Распространенные ошибки

+ +

+ Если отдельный цвет или текстура настроены неправильно, они будут выглядеть темнее или + светлее, чем ожидалось. Если выходное цветовое пространство средства визуализации настроено + неправильно, вся сцена может отображаться темнее (например, отсутствует преобразование в + sRGB) или светлее (например, двойное преобразование в sRGB с постобработкой). В каждом + конкретном случае проблема может быть неоднородной, и простое увеличение/уменьшение освещенности + её не решит эту проблему. +

+ +

+ Более тонкая проблема возникает, когда оба цветовых пространства, входные и выходные цветовые + пространства выбраны неправильно — общий уровень яркости может быть в порядке, но цвета могут измениться + неожиданно при разном освещении или затенении может показаться более размытым и менее + мягким, чем предполагалось. Эти две ошибки не являются правильными, и важно, чтобы + работающие цветовое пространство должно быть линейным ("относится к сцене"), а выходное + цветовое пространство быть нелинейным ("относится к дисплею"). +

+ +

Дальнейшее чтение

+ + + + + + diff --git a/docs/manual/ru/introduction/How-to-create-VR-content.html b/docs/manual/ru/introduction/How-to-create-VR-content.html new file mode 100644 index 00000000000000..839524a80852c8 --- /dev/null +++ b/docs/manual/ru/introduction/How-to-create-VR-content.html @@ -0,0 +1,82 @@ + + + + + + + + + + + +

Как создавать VR-контент ([name])

+ +

+ В этом руководстве представлен краткий обзор основных компонентов веб-приложения на VR + сделанного с three.js. +

+ +

Рабочий процесс

+ +

+ Сначала вам нужно подключить [link:https://github.com/mrdoob/three.js/blob/master/examples/jsm/webxr/VRButton.js VRButton.js] + в ваш проект. +

+ + +import { VRButton } from 'three/addons/webxr/VRButton.js'; + + +

+ *VRButton.createButton()* делает две важные вещи: создает кнопку, которая указывает + на VR совместимость. Кроме того, он инициирует сеанс VR, если + пользователь активирует кнопку. Единственное, что тебе нужно добавить следующую + строку кода в ваше приложение. +

+ + +document.body.appendChild( VRButton.createButton( renderer ) ); + + +

+ Далее вы должны указать свой экземпляр `WebGLRenderer`, чтобы включить рендеринг XR. +

+ + +renderer.xr.enabled = true; + + +

+ Наконец, вам нужно настроить цикл анимации, поскольку мы не можем использовать наши + хорошо известную функцию *window.requestAnimationFrame()*. Для VR-проектов мы используем + [page:WebGLRenderer.setAnimationLoop setAnimationLoop]. Минимальный код выглядит следующим образом: +

+ + +renderer.setAnimationLoop( function () { + + renderer.render( scene, camera ); + +} ); + + +

Следующие шаги

+ +

+ Взгляните на один из официальных примеров WebVR, чтобы увидеть этот рабочий процесс в действии.

+ + [example:webxr_xr_ballshooter WebXR / XR / ballshooter]
+ [example:webxr_xr_cubes WebXR / XR / cubes]
+ [example:webxr_xr_dragging WebXR / XR / dragging]
+ [example:webxr_xr_paint WebXR / XR / paint]
+ [example:webxr_xr_sculpt WebXR / XR / sculpt]
+ [example:webxr_vr_panorama_depth WebXR / VR / panorama_depth]
+ [example:webxr_vr_panorama WebXR / VR / panorama]
+ [example:webxr_vr_rollercoaster WebXR / VR / rollercoaster]
+ [example:webxr_vr_sandbox WebXR / VR / sandbox]
+ [example:webxr_vr_video WebXR / VR / video] +

+ + + + diff --git a/docs/manual/ru/introduction/How-to-dispose-of-objects.html b/docs/manual/ru/introduction/How-to-dispose-of-objects.html new file mode 100644 index 00000000000000..bc91f19b107dbf --- /dev/null +++ b/docs/manual/ru/introduction/How-to-dispose-of-objects.html @@ -0,0 +1,156 @@ + + + + + + + + + + + +

Как избавиться от объектов ([name])

+ +

+ Одним из важных аспектов повышения производительности и предотвращения утечек памяти в + вашем приложении является удаление неиспользуемых объектов библиотеки. Всякий раз, + когда вы создаете экземпляр типа *three.js*, вы выделяете определенный объем памяти. + Однако *three.js* создает для конкретных объектов такие как геометрия или материалы, + связанные с WebGL объекты, такие как буферы или программы шейдеров, необходимые для + рендеринга. Важно подчеркнуть, что эти объекты не освобождаются автоматически. Вместо + этого приложению приходится использовать специальный API для освобождения таких + ресурсов. В этом руководстве представлен краткий обзор того, как используется этот API и + какие объекты актуальны в этом контексте. +

+ +

Геометрии

+ +

+ Геометрия обычно представляет информацию о вершинах, определенную как набор атрибутов. + *three.js* внутренне создает объект типа [link:https://developer.mozilla.org/en-US/docs/Web/API/WebGLBuffer WebGLBuffer] для каждого атрибута. Эти объекты + удаляются только в том случае, если вы вызываете [page:BufferGeometry.dispose](). Если геометрия в + вашем приложении устарела, выполните этот метод, чтобы освободить все связанные ресурсы. +

+ +

Материалы

+ +

+ Материал определяет, как визуализируются объекты. *three.js* использует информацию + определения материала для создания программы шейдера для рендеринга. Шейдерные + программы можно удалить только в том случае, если соответствующий материал удален. Из + соображений производительности *three.js* пытается повторно использовать существующие + шейдерные программы, если это возможно. Таким образом, шейдерная программа удаляется + только в том случае, если удалены все связанные с ней материалы. Утилизацию материала + можно указать с помощью выполнения [page:Material.dispose](). +

+ +

Текстуры

+ +

+ Удаление материала не влияет на текстуры. Они обрабатываются отдельно, поскольку одна + текстура может использоваться несколькими материалами одновременно. Всякий раз, когда + вы создаете экземпляр [page:Texture], Three.js внутренне создает экземпляр [link:https://developer.mozilla.org/en-US/docs/Web/API/WebGLTexture WebGLTexture]. Подобно + буферам, этот объект можно удалить только вызовом [page:Texture.dispose](). +

+ +

+ Если вы используете `ImageBitmap`, в качестве источника данных текстуры, вам необходимо + вызвать [link:https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap/close ImageBitmap.close]() на уровне приложения, чтобы избавиться от всех ресурсов + процессора. Автоматический вызов `ImageBitmap.close()` в [page:Texture.dispose]() невозможно, так + как растровое изображение становится непригодным для использования, и у движка нет + возможности узнать, используется ли растровое изображение где-либо ещё. +

+ +

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

+ +

+ Объекты типа [page:WebGLRenderTarget] не только выделяют экземпляр [link:https://developer.mozilla.org/en-US/docs/Web/API/WebGLTexture WebGLTexture], но и + [link:https://developer.mozilla.org/en-US/docs/Web/API/WebGLFramebuffer WebGLFramebuffer]s и [link:https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderbuffer WebGLRenderbuffer]s ​для реализации пользовательских направлений + рендеринга. Эти объекты освобождаются только путем выполнения [page:WebGLRenderTarget.dispose](). +

+ +

Разнообразный

+ +

+ В каталоге примеров есть и другие классы, такие как элементы управления или этапы + постобработки, которые предоставляют `dispose()` методы для удаления внутренних + прослушивателей событий или визуализировать цели. В общем, рекомендуется проверить API + или документацию класса и следить за `dispose()`. Если он есть, вам следует использовать его + при уборке. +

+ +

Часто задаваемые вопросы

+ +

Почему не может *three.js* автоматически удалять объекты?

+ +

+ Сообщество задавало этот вопрос много раз, поэтому важно прояснить этот вопрос. Дело в + том, что *three.js* не знает ни времени жизни, ни области действий созданных пользователем + объектов, таких как геометрия или материалы. Это ответственность приложения. Например, + даже если материал в настоящее время не используется для рендеринга, это может быть + необходимо для следующего кадра. Поэтому, если приложение решает, что определенный + объект может быть удален, оно должно уведомить об этом движок, вызвав соответствующий + `dispose()` метод. +

+ +

Удаление сетки из сцены также приводит к изменению ее геометрии и материала?

+ +

+ Нет, вам нужно явно удалить геометрию и материал с помощью *dispose()*. Имейте в виду, что + геометрия и материалы могут быть общими для 3D-объектов, таких как сетки. +

+ +

Предоставляет ли *three.js* информацию о количестве кешированных объектов?

+ +

+ Да. Можно оценить [page:WebGLRenderer.info], специальное свойство средства рендеринга, + содержащее ряд статистической информации о памяти видеокарты и процесса рендеринга. + Помимо прочего, он сообщает вам, сколько текстур, геометрии и шейдерных программ + хранится внутри. Если вы заметили проблемы с производительностью в вашем приложении + рекомендуется отладить это свойство, чтобы легко выявить утечку памяти. +

+ +

Что происходит, когда вы вызоваете `dispose()` на текстуре, но изображение еще не загружено?

+ +

+ Внутренние ресурсы для текстуры выделяются только в том случае, если изображение + полностью загружено. Если вы разместите текстуру до загрузки изображения, ничего не + произойдет. Ресурсы не были выделены, поэтому очистка также не требуется. +

+ +

Что происходит, когда я вызоваю `dispose()`, а затем использую соответствующий объект позже?

+ +

+ Это зависит. Для геометрии, материалов, текстур, целей рендеринга и проходов постобработки + удаленные внутренние ресурсы могут быть созданы движком заново. Таким образом, ошибок + во время выполнения не произойдет, но вы можете заметить негативное влияние на + производительность текущего кадра, особенно когда необходимо скомпилировать программы + шейдеров. Элементы управления и средства визуализации являются исключением. + Экземпляры этих классов нельзя использовать после `dispose()`, когда он был вызван. В этом + случае вам придется создать новые экземпляры. +

+ +

Как я должен управлять объектами *three.js* в моем приложении? Когда я + узнаю, как распорядиться предметами?

+ +

+ В общем, однозначных рекомендаций по этому поводу нет. Это сильно зависит от конкретного + варианта использования при вызове `dispose()` если это уместно. Важно это подчеркнуть не + всегда необходимо постоянно удалять объекты. Хорошим примером является игра, состоящая + из нескольких уровней. Хорошее место для утилизации объектов — это когда переключение + уровня приложения могло проходить через старую сцену и удалять все устаревшие материалы, + геометрии и текстуры. Как упоминалось в предыдущем разделе, это не выдать ошибку + времени выполнения, если вы удалите объект, который на самом деле все еще используется. + Самое худшее, что может случиться, — это падение производительности на один кадр. +

+ +

Примеры, демонстрирующие использование dispose()

+ +

+ [example:webgl_test_memory WebGL / test / memory]
+ [example:webgl_test_memory2 WebGL / test / memory2]
+

+ + + + diff --git a/docs/manual/ru/introduction/How-to-update-things.html b/docs/manual/ru/introduction/How-to-update-things.html new file mode 100644 index 00000000000000..56ccdab2d79ea1 --- /dev/null +++ b/docs/manual/ru/introduction/How-to-update-things.html @@ -0,0 +1,276 @@ + + + + + + + + + +

Как обновить предметы ([name])

+
+

Все объекты по умолчанию автоматически обновляют свои матрицы, если они были добавлены + в сцену с помощью +

+ +const object = new THREE.Object3D(); +scene.add( object ); + + или если они являются дочерними элементами другого объекта, добавленного в сцену: + +const object1 = new THREE.Object3D(); +const object2 = new THREE.Object3D(); + +object1.add( object2 ); +scene.add( object1 ); //object1 и object2 автоматически обновят свои матрицы + +
+ +

Однако если вы знаете, что объект будет статическим, вы можете отключить это и обновить + матрицу преобразования вручную только при необходимости. +

+ +object.matrixAutoUpdate = false; +object.updateMatrix(); + + +

BufferGeometry

+
+

+ BufferGeometries хранит информацию (такую ​​как позиции вершин, индексы граней, нормали, + цвета, UV и любые пользовательские атрибуты) в [page:BufferAttribute buffers] - то есть, + [link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays typed arrays]. + Это делает их в целом более быстрыми, чем стандартные геометрии, но более сложную + работу с ними. +

+

+ Что касается обновления BufferGeometries, самое важное, что нужно понять, это то, что + вы не можете изменить размер буферов (это очень затратно, по сути, эквивалентно созданию новой геометрии). + Однако вы можете обновить содержимое буферов. +

+

+ Это означает, что если вы знаете, что атрибут вашей BufferGeometry будет расти, скажем, количества вершин, + вы должны предварительно выделить буфер, достаточно большой для хранения любых новых вершин, которые могут быть созданы. + Конечно, это также означает, что для вашей буферной геометрии будет установлен максимальный размер - то есть + невозможно создать буферную геометрию, которая могла бы эффективно расширяться бесконечно. +

+

+ Мы будем использовать пример строки, которая расширяется во время рендеринга. Мы выделим пространство + в буфере для 500 вершин, но сначала нарисуйте только две, используя [page:BufferGeometry.drawRange]. +

+ +const MAX_POINTS = 500; + +// geometry +const geometry = new THREE.BufferGeometry(); + +// attributes +const positions = new Float32Array( MAX_POINTS * 3 ); // 3 числа (x, y и z) на точку +geometry.setAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) ); + +// draw range +const drawCount = 2; // нарисуйте только первые 2 точки +geometry.setDrawRange( 0, drawCount ); + +// material +const material = new THREE.LineBasicMaterial( { color: 0xff0000 } ); + +// line +const line = new THREE.Line( geometry, material ); +scene.add( line ); + +

+ Далее мы случайным образом добавим точки к линии, используя такой шаблон: +

+ +const positionAttribute = line.geometry.getAttribute( 'position' ); + +let x = 0, y = 0, z = 0; + +for ( let i = 0; i < positionAttribute.count; i ++ ) { + + positionAttribute.setXYZ( i, x, y, z ); + + x += ( Math.random() - 0.5 ) * 30; + y += ( Math.random() - 0.5 ) * 30; + z += ( Math.random() - 0.5 ) * 30; + +} + +

+ Если вы хотите изменить количество точек, отображаемых после первого рендеринга, сделайте следующее: +

+ +line.geometry.setDrawRange( 0, newValue ); + +

+ Если вы хотите изменить значения данных о положении после первого рендеринга, вам необходимо + установить needsUpdate флаг следующим образом: +

+ +positionAttribute.needsUpdate = true; // требуется после первого рендеринга + + +

+ Если вы измените значения данных о положении после первоначального рендеринга, вам может потребоваться пересчитать + ограничивающие объемы, чтобы другие функции движка, такие как отсечение усеченной пирамиды или помощники, работали правильно. +

+ +line.geometry.computeBoundingBox(); +line.geometry.computeBoundingSphere(); + + +

+ [link:https://jsfiddle.net/t4m85pLr/1/ Here is a fiddle] показывающий анимированную строку, которую вы можете адаптировать к своему + варианту использования. +

+ +

Примеры

+ +

+ [example:webgl_custom_attributes WebGL / custom / attributes]
+ [example:webgl_buffergeometry_custom_attributes_particles WebGL / buffergeometry / custom / attributes / particles] +

+ +
+ +

Материалы

+
+

Все значения униформы можно свободно менять (например, цвета, текстуры, непрозрачность и + т. д.), значения отправляются в шейдер каждый кадр. +

+

Также параметры, связанные с GLstate, могут меняться в любое время (DepthTest, blending, + PolygonOffset и т.д.). +

+

Следующие свойства нелегко изменить во время выполнения (после того, как материал + визуализируется хотя бы один раз): +

+ + +

Изменения в них требуют создания новой шейдерной программы. Вам нужно будет установить

+ material.needsUpdate = true + +

Имейте в виду, что это может быть довольно медленно и вызывать рывки в частоте кадров + (особенно в Windows, поскольку компиляция шейдеров в DirectX происходит медленнее, чем в + OpenGL). +

+

Для более плавного взаимодействия вы можете в некоторой степени имитировать изменения в + этих функциях, используя «фиктивные» значения, такие как освещение нулевой интенсивности, + белые текстуры или туман нулевой плотности. +

+

Вы можете свободно менять материал, используемый для фрагментов геометрии, однако вы не + можете изменить способ разделения объекта на фрагменты (в соответствии с материалами + грани). +

+

Если вам нужно иметь разные конфигурации материалов во время + выполнения: +

+

Если количество материалов/кусков небольшое, можно предварительно разделить объект + (например, волосы/лицо/тело/верхняя одежда/штаны для человека, перед/бока/верх/стекло/ + покрышка/салон для автомобиля). +

+

Если число велико (например, каждое лицо потенциально может быть разным), рассмотрите + другое решение, например, использование атрибутов/текстур для создания различного вида + лица. +

+

Примеры

+

+ [example:webgl_materials_car WebGL / materials / car]
+ [example:webgl_postprocessing_dof WebGL / webgl_postprocessing / dof] +

+
+ + +

Текстуры

+
+

Текстуры изображения, холста, видео и данных должны иметь следующий флаг, если они + изменяются:

+ + texture.needsUpdate = true; + +

Цели рендеринга обновляются автоматически.

+ +

Примеры

+

+ [example:webgl_materials_video WebGL / materials / video]
+ [example:webgl_rtt WebGL / rtt] +

+ +
+ +

Камеры

+
+

Положение камеры и цель обновляются автоматически. Если вам нужно изменить

+ +

+ тогда вам нужно будет пересчитать матрицу проекции: +

+ +camera.aspect = window.innerWidth / window.innerHeight; +camera.updateProjectionMatrix(); + +
+ +

InstancedMesh

+
+

+ `InstancedMesh` это класс для удобного доступа к рендерингу экземпляров в `three.js`. + Некоторые функции библиотеки, такие как отсечение усеченного представления или + Приведение лучей основано на современных ограничивающих объемах (ограничивающей + сфере и ограничивающей рамке). Из-за того, как `InstancedMesh` работает, класс имеет свои + собственные [page:InstancedMesh.boundingBox boundingBox] и [page:InstancedMesh.boundingSphere boundingSphere], которые заменяют ограничивающие + объемы на уровне геометрии. +

+

+ Подобно геометрии, вам придется пересчитывать ограничивающую рамку и сферу всякий раз, + когда вы меняете базовые данные. В контексте `InstancedMesh`, что происходит, когда вы + преобразуете экземпляры с помощью [page:InstancedMesh.setMatrixAt setMatrixAt](). Вы можете использовать тот же шаблон, + что и для геометрии. +

+ +instancedMesh.computeBoundingBox(); +instancedMesh.computeBoundingSphere(); + + +
+ +

SkinnedMesh

+
+

+ `SkinnedMesh` следует тем же принципам, что и `InstancedMesh` в контексте ограничивающих + объемов. Это означает, что класс имеет свою собственную версию [page:SkinnedMesh.boundingBox boundingBox] и + [page:SkinnedMesh.boundingSphere boundingSphere] для корректного размещения анимированных сеток. При вызове + `computeBoundingBox()` и `computeBoundingSphere()`, класс вычисляет соответствующие + ограничивающие объемы на основе текущего трансформации костей (или, другими словами, + текущее состояние анимации). +

+
+ + + diff --git a/docs/manual/ru/introduction/How-to-use-post-processing.html b/docs/manual/ru/introduction/How-to-use-post-processing.html new file mode 100644 index 00000000000000..097ae3e74b7632 --- /dev/null +++ b/docs/manual/ru/introduction/How-to-use-post-processing.html @@ -0,0 +1,129 @@ + + + + + + + + + +

Как использовать постобработку ([name])

+ +

+ Многие приложения three.js отображают свои 3D-объекты непосредственно на экране. Однако + иногда вам нужно применить один или несколько графических эффектов, такие как глубина + резкости, цветение, зернистость пленки или различные типы сглаживания. Постобработка — + это широко используемый подход к реализации таких эффектов. Сначала сцена + визуализируется в целевой объект рендеринга, который представляет собой буфер в памяти + видеокарты. На следующем этапе один или несколько проходов постобработки применяют + фильтры и эффекты к буферу изображения, прежде чем оно в конечном итоге будет обработано + на экран. +

+

+ three.js предоставляет комплексное решение для постобработки через [page:EffectComposer] для + реализации такого рабочего процесса. +

+ +

Рабочий процесс

+ +

+ Первым шагом в этом процессе является импорт всех необходимых файлов из каталога + примеров. Руководство предполагает, что вы используете официальную [link:https://www.npmjs.com/package/three npm package] three.js. + Для нашей базовой демонстрации в этом руководстве нам нужны следующие файлы. +

+ + + import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js'; + import { RenderPass } from 'three/addons/postprocessing/RenderPass.js'; + import { GlitchPass } from 'three/addons/postprocessing/GlitchPass.js'; + import { OutputPass } from 'three/addons/postprocessing/OutputPass.js'; + + +

+ После успешного импорта всех файлов мы можем создать наш composer, + передав экземпляр [page:WebGLRenderer]. +

+ + + const composer = new EffectComposer( renderer ); + + +

+ При использовании composer, необходимо изменить цикл анимации приложения. Вместо + вызова метода рендеринга [page:WebGLRenderer], мы теперь используем соответствующий аналог + [page:EffectComposer]. +

+ + + function animate() { + + requestAnimationFrame( animate ); + + composer.render(); + + } + + +

+ Наш composer теперь готов, поэтому можно настроить цепочку проходов постобработки. Эти + проходы отвечают за создание окончательного визуального результата приложения. Они + обрабатываются в порядке их добавления/вставки. В нашем примере сначала выполняется + экземпляр `RenderPass`, затем экземпляр `GlitchPass` и наконец `OutputPass`. Последний + включенный проход в цепочке автоматически отображается на экране. Настройка пропусков + выглядит так: +

+ + + const renderPass = new RenderPass( scene, camera ); + composer.addPass( renderPass ); + + const glitchPass = new GlitchPass(); + composer.addPass( glitchPass ); + + const outputPass = new OutputPass(); + composer.addPass( outputPass ); + + +

+ `RenderPass` обычно размещается в начале цепочки, чтобы предоставить визуализированную + сцену в качестве входных данных для следующего шага постобработки. В нашем случае + `GlitchPass` собирается использовать эти данные изображения для применения эффекта диких + сбоев. `OutputPass` обычно является последним этапом в цепочке, которая выполняет + преобразование цветового пространства sRGB и отображение тонов. Посмотрите этот + [link:https://threejs.org/examples/webgl_postprocessing_glitch live example] чтобы увидеть его в действии. +

+ +

Встроенные пропуска

+ +

+ Вы можете использовать широкий спектр предопределенных проходов постобработки, + предоставляемых движком. Они расположены в каталоге [link:https://github.com/mrdoob/three.js/tree/dev/examples/jsm/postprocessing postprocessing]. +

+ +

Пользовательские пропуска

+ +

+ Иногда вам нужно написать собственный шейдер постобработки и включить его в цепочку + проходов постобработки. Для этого сценария вы можете использовать `ShaderPass`. После + импорта файла и вашего пользовательского шейдера вы можете использовать следующий код + для настройки прохода. +

+ + + import { ShaderPass } from 'three/addons/postprocessing/ShaderPass.js'; + import { LuminosityShader } from 'three/addons/shaders/LuminosityShader.js'; + + // позже в вашей процедуре инициализации + + const luminosityPass = new ShaderPass( LuminosityShader ); + composer.addPass( luminosityPass ); + + +

+ В репозитории имеется файл [link:https://github.com/mrdoob/three.js/blob/master/examples/jsm/shaders/CopyShader.js CopyShader], который представляет собой хороший стартовый код + для вашего собственного шейдера. `CopyShader` просто копирует содержимое изображения из + [page:EffectComposer] буфера чтения в свой буфер записи без применения каких-либо эффектов. +

+ + + diff --git a/docs/manual/ru/introduction/Matrix-transformations.html b/docs/manual/ru/introduction/Matrix-transformations.html new file mode 100644 index 00000000000000..c89649bef80cb2 --- /dev/null +++ b/docs/manual/ru/introduction/Matrix-transformations.html @@ -0,0 +1,90 @@ + + + + + + + + + +

Матричные преобразования ([name])

+ +

+ Three.js использует `matrices` для кодирования 3D-преобразований — перемещения + (положения), вращения и масштабирования. Каждый экземпляр [page:Object3D] имеет [page:Object3D.matrix matrix], В + которой хранятся положение, вращение и масштаб объекта. На этой странице описано, как + обновить преобразование объекта. +

+ +

Удобные свойства и `matrixAutoUpdate`

+ +

+ Существует два способа обновить преобразование объекта: +

+
    +
  1. + Изменить объект `position`, `quaternion`, и `scale` свойства, и пусть three.js пересчитает + матрицу объекта из этих свойств: + +object.position.copy( start_position ); +object.quaternion.copy( quaternion ); + + По умолчанию `matrixAutoUpdate` свойство установлено true, и матрица будет автоматически + пересчитана. Если объект статический или вы хотите вручную контролировать время + пересчета, то лучшую производительность можно получить, установив свойство false: + +object.matrixAutoUpdate = false; + + И после изменения каких-либо свойств обновите матрицу вручную: + +object.updateMatrix(); + +
  2. +
  3. + Измените матрицу объекта напрямую. Класс [page:Matrix4] имеет различные методы для изменения + матрицы: + +object.matrix.setRotationFromQuaternion( quaternion ); +object.matrix.setPosition( start_position ); +object.matrixAutoUpdate = false; + + Обратите внимание, что `matrixAutoUpdate` должен быть установлен на `false` в этом случае, + и вам следует убедиться, что вы не вызываете `updateMatrix`. Вызывая `updateMatrix` заблокируется + внесенная вручную изменения в матрицу, пересчитывая матрицу из `position`, `scale`, и так + далее. +
  4. +
+ +

Матрицы объектов и миров

+

+ Объект [page:Object3D.matrix matrix] хранит преобразование объекта относительно объекта [page:Object3D.parent parent]; чтобы + получить преобразование объекта в мировые кооординаты, вы должны получить доступ к [page:Object3D.matrixWorld]. +

+

+ Когда изменяется преобразования родительского или дочернего объекта, вы можете запросить + обновление [page:Object3D.matrixWorld matrixWorld] дочернего объекта, вызвав [page:Object3D.updateMatrixWorld updateMatrixWorld](). +

+

+ Объект можно преобразовать с помощью [page:Object3D.applyMatrix4]. Примечание: На самом деле + этот метод основан на [page:Matrix4.decompose], и не все матрицы можно разложить таким образом. + Например, если объект имеет неравномерно масштабируемый родительский объект, то + мировая матрица объекта может быть неразложимой, и этот метод может оказаться + неприемлемым. +

+ +

Вращение и кватернион

+

+ Three.js предоставляет два способа представления трехмерного вращения: [page:Euler Euler angles] и + [page:Quaternion Quaternions], а также методы преобразования между ними. Euler angles подвержены + проблеме, называемой "замком кардана", когда определенные конфигурации могут терять степень свободы (предотвращая вращение объекта вокруг одной оси). По этой причине + вращения объекта всегда хранится в памяти объекта [page:Object3D.quaternion quaternion]. +

+

+ Предыдущие версии библиотеки включали свойство `useQuaternion` объекта, которое, если + установлено значение false, это приведет к тому, что [page:Object3D.matrix matrix] будет рассчитываться под Euler + angles. Эта практика устарела — вместо этого вам следует использовать метод + [page:Object3D.setRotationFromEuler setRotationFromEuler], который обновит кватернион. +

+ + +