Добавил:
sergeevpavel0406@mail.ru СОВА Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика в техническом университете / Информатика в техническом университете. Компьютерная графика

.pdf
Скачиваний:
88
Добавлен:
06.03.2018
Размер:
6.96 Mб
Скачать
Наблюдатель
Рис. 4.72. Глобальная модель освещения:
7-5 — видимые точки объектов сцены;
Pi, Рг — лучи

4.2. Методы и алгоритмы трехмерной графики и геометрии

Моделирование глобального освещения с трассировкой лучей. Модель освещения с трассировкой лучей (рейтресингом) предназначена для рассчета интенсивности отраженного к наблюдателю света в каждой точке (пикселе) изображения. Она может быть локальной или глобальной. В первом случае учитывается только свет, падающий от источника света и ориентация поверхности, а во втором случае учитывается также свет, отраженный от других объектов сцены или пропущенный сквозь них. Глобальная модель освещения воспроизводит важные эффекты; некоторые из них показаны на рис. 4.72.

Сфера, треугольная призма и параллелепипед, изображенные на рис. 4.72, непрозрачны, их поверхность зеркальна. Наблюдатель смотрит из точки О на точку / на

сфере. При этом он видит не только сферу, но и точку 2 на призме. Призма, загороженная от наблюдателя параллелепипедом, становится видимой вследствие отражения света на сфере. Точка 5 на призме видима благодаря двум отражениям. Она отражается от обратной стороны параллелепипеда в точке 4 к точке 3 на сфере, а затем — к наблюдателю. Кроме того, наблюдатель видит точку 5 в точке /' после одного отражения от сферы, поэтому на сфере находятся два изображения призмы. Изображение, расположенное вокруг точки 1, перевернуто, так как получается после одного отражения; а вокруг точки 3 не перевернуто, так как получается после двух отражений. Интенсивность второго изображения меньше. Наконец, в сфере отражается обратная сторона параллелепипеда, т. е. наблюдатель видит ее, хотя прямой свет источника на нее не падает. Эта сторона освещается рассеянным светом и светом, отраженным от других объектов сцены.

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

Выше рассмотрен алгоритм построения видимых непрозрачных поверхностей методом трассировки лучей, в котором луч трассируется до первого пересечения с объектом. В глобальной модели освещения трассировка луча на этом не кончается. Здесь предполагается, что падающий луч отражается от поверхности и пропускается сквозь эту поверхность по законам геометрической оптики. Это значит, что в точке пересечения луча с объектом образуются еще два луча,

365

4. Методы, алгоритмы и форматы файлов компьютерной графики

для которых нужно найти все пересечения с объектами сцены. Этот процесс повторяется, пока не останется ни одного пересечения. Процесс трассировки заканчивается, когда луч покидает сцену. При пересечении луча с поверхностью направления отраженного и пропущенного лучей рассчитываются по законам геометрической оптики. В частности, отраженный луч и падающий луч лежат в одной плоскости, и угол падения равен углу отражения. Для того чтобы определить интенсивность в каждом пересечении луча с поверхностью, надо пройти трассу луча в обратном направлении. Интенсивность в узлах рассчитывается в соответствии с моделью освещения, причем для каждого следующего узла она ослабляется пропорционально расстоянию между точками пересечения. После прохода всей трассы луча определяется окончательная интенсивность пиксела.

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

Моделирование глобального освещения с радиосити. Радиосити (Radiosity), согласно определению в литературе по физике, является общей падающей энергией на единицу площади поверхности. В контексте визуализации «энергия» — это энергия света.

Процедура решения радиосити — сложный метод вычисления света, отраженного между рассеивающими свет поверхностями. Его можно использовать, когда надо показать эффекты отражения цвета (когда одна цветная поверхность содержит оттенок цвета другой близлежащей поверхности) и дисперсии света (отражение косвенного света на другие поверхности в сцене). Отметим, что рейтресинг распознает только зеркальное отражение лучей света в сцене.

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

Поскольку решение радиосити является видонезависимым, то его можно многократно использовать для представления дополнительных растровых изображений объекта из различных видов. В процессе решения радиосити за достаточно короткий промежуток времени вычислений получаются полезные промежуточные результаты. Затем результаты автоматически улучшаются до

366

4.2. Методы и алгоритмы трехмерной графики и геометрии

конечного решения. Решение радиосити позволяет отображать промежуточные результаты так, чтобы наблюдатель мог определить, когда решение будет удовлетворительным, и остановить вычисления. Кроме того, можно использовать в качестве критерия остановки вычислений или некоторое фиксированное число «передач энергии отраженного света», или некоторую долю общего глобального освещения.

4.2.4. Алгоритмы анимации трехмерных моделей

Методы КГ широко используются для анимации в различных сферах, включая индустрию развлечений (кино и мультфильмы), рекламу, научные и инженерные исследования, обучение и образование. Термин «компьютерная анимация» означает любую последовательность видимых изменений изображения. Помимо изменения положения объекта путем переноса или вращения компьютерная анимация может отображать изменение во времени размера объекта, его цвета, степени прозрачности и текстуры поверхности. В рекламе часто используется преобразование одного объекта в другой. Компьютерную анимацию можно получать также, меняя положение, ориентацию или фокусное расстояние камеры. Кроме того, для получения компьютерной анимации можно менять эффекты освещения или другие параметры, связанные с освещением и визуализацией.

Двумя базовыми методами построения последовательности изображений движения является анимация реального времени и покадровая анимация.

В компьютерной анимации реального времени сцены последовательности изображаются по мере генерации. Таким образом, анимацию нужно генерировать со скоростью, совместимой с ограничениями, наложенными частотой обновления. При покадровой анимации каждый кадр сцены движения генерируется и записывается отдельно. Позже кадры можно записать в фильм или же последовательно отобразить на мониторе в режиме воспроизведения в реальном времени. Простые анимационные сцены обычно генерируются в реальном времени. Сложная анимация требует медленного покадрового построения. В то же время некоторым приложениям необходима анимация в реальном времени независимо от ее сложности. Например, анимация симулятора полетов выполняется в реальном времени, поскольку изображение на мониторе нужно сгенерировать немедленно после изменения настроек управляющих сигналов. В подобных случаях часто разрабатываются специальные аппаратные и программные системы, позволяющие быстро выводить на экран сложные последовательности.

В большинстве случаев простые анимационные последовательности можно создавать, используя методы реального времени. Однако в общем случае анимационная последовательность в системе с растровой разверткой создается по одному кадру за раз, так что каждый законченный кадр можно сохранить в файле для будущего просмотра. После этого для просмотра анимации последовательно

367

4. Методы, алгоритмы и форматы файлов компьютерной графики

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

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

Разработка и проектирование анимационных сюжетов. Производство традиционной анимации заслуживает некоторого обсуждения. Полезно иметь представление о том, как фрагмент анимации разбивается на части и как аниматоры подходят к производству законченного проекта. Большинство методов из традиционной анимации применимо и к компьютерной анимации.

Фрагмент анимации обычно рассматривается с использованием четырехуровневой иерархии. Вся анимация называется продукцией. Как правило, продукции разбиваются на главные части, называемые последовательностями. Последовательность — главный эпизод — обычно определяется областью сцены. Продукция может содержать до десятка последовательностей. Последовательность разбивается на один или несколько дублей. Дубль — непрерывный фрагмент, отснятый камерой. Дубль разбивается на отдельные кадры фильма. Кадр — одно записанное изображение. В результате имеем иерархию, показанную на рис. 4.73.

Чтобы успешно спланировать и осуществить производство части анимации, требуется несколько шагов. Анимация является процессом проб и ошибок, кото-

 

 

Продукция

 

 

Последовательность 1

 

Последовательность 2

 

Дубль 1

Дубль 2

Дубль 1

Дубль 2

Дубль 3

Дубль 4

Кадр 1 Кадр 2

 

 

 

 

Кадр п

Рис. 4.73. Пример иерархии в традиционной анимации

368

4.2. Методы и алгоритмы трехмерной графики и геометрии

рый включает в себя обратную связь от одного шага к предыдущим шагам и обычно требует нескольких итераций путем повтора многих предыдущих шагов в различные моменты времени разработки анимации. Несмотря на это, производство анимации обычно следует стандартному шаблону. Сначала определяется предварительная история, включая сценарий. Пишется раскадровка, определяющая действие посредством набросков отдельных кадров. Кадры часто сопровождаются текстом, который обрисовывает происходящее действие. Это используется для представления, обзора и рецензирования действия, а также для просмотра развития персонажа. Разрабатывается модельный лист, состоящий из набора рисунков для каждого персонажа в различных положениях и использующийся для того, чтобы убедиться, что все появления персонажа согласованы между собой, по мере того как этот персонаж рисуют во время анимационного процесса. Демонстрационный лист содержит информацию о каждом кадре: звуковое сопровождение, движение камеры и составляющие элементы. В направляющем листе собирается статистика по каждой сцене. Когда раскадровка определена создается детализированный сценарий, который более подробно определяет действие. Ключевые кадры определяются и делаются ведущими аниматорами для помощи в определении и развитии персонажа и качества изображения. Аниматоры отвечают за производство остальных кадров между ключевыми кадрами. Пробные съемки, короткие последовательности, снятые в полном цвете, используются для проверки качества изображения. Для того чтобы полностью проверить движение, может быть снят карандашный тест, который является полной отрисовкой движения (здесь используются низкокачественные изображения, например наброски карандашом). Проблемы, обнаруженные в пробных съемках и карандашных тестах, могут потребовать переработки ключевых кадров, детализированного сценария или даже раскадровки. Рисование — перенос карандашных рисунков на пленки. Ретуширование — процесс переноса цвета на пленки.

Вследствие высокого уровня точного отслеживания времени по сравнению с живой съемкой в анимации очень важен звук. В анимации звук бывает трех видов: музыка, специальные эффекты и голос. Что будет создано первым — звук или анимация — зависит от типа анимации и роли, которую играет звук. Для анимации с синхронизированным движением губ сначала создается звуковой трек и на его основе создается анимация. В большинстве других случаев сначала создается анимация, а потом на ее основе создается звук. При этом приблизительное звуковое сопровождение строится в то же самое время, что и раскадровка.

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

369

4. Методы, алгоритмы и форматы файлов компьютерной графики

Вто время как компьютерная анимация использует определенные подходы

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

Два основных инструмента традиционной анимации — тестовые съемки и карандашные тесты — имеют аналоги в компьютерной анимации. Баланс между скоростью и качеством может быть изменен на каждом из трех этапов создания кадра в компьютерной анимации: построение модели, управление движением и визуализация.

Компьютерная анимация обычно использует следующий план:

создание раскадровки (storyboard) — разработка схемы действия. Она определяет последовательность движения как набор базовых событий, которые должны произойти. В зависимости от типа анимации раскадровка может состоять из набросков (эскизов) вместе с кратким описанием движения или быть просто списком основных идей, которые будут реализованы в действии. Изначально набор эскизов движения прикреплялся на большую доску, которая представляла общий вид анимационного проекта, откуда и пошло название (от англ. story — история, сюжет, board — доска);

для каждого участника действия дается определение объекта. Объекты могут определяться как многогранники или тела с гладкими (сплайновыми) поверхностями. Кроме того, часто дается описание движения, которое должен совершить каждый персонаж или объект сюжета;

создание ключевых кадров (key frame) — подробное изображение сцены в определенный момент анимационной последовательности. В каждом ключевом кадре все объекты (или символы) размещаются согласно времени этого кадра. Одни ключевые кадры выбираются в крайних положениях действия; другие размещаются так, чтобы интервал между ключевыми кадрами не был слишком большим. Для сложных движений задается больше ключевых кадров, чем для простых, медленно меняющихся. За разработку ключевых кадров обычно отвечают старшие аниматоры и часто каждый персонаж анимационного фильма курирует отдельный аниматор.

Промежуточными называются кадры, расположенные между ключевыми. Общее число кадров, а следовательно, общее число промежуточных кадров, необходимых для создания анимации, определяется средой, в которой планируется отображать анимацию. Фильм требует 24 кадра в секунду, а графические терминалы обновляются с частотой не менее 60 или более кадров в секунду. Обычно

370

4.2. Методы и алгоритмы трехмерной графики и геометрии

временные рамки движения задаются так, чтобы между каждой парой ключевых кадров располагалось 3-5 промежуточных кадров. В зависимости от скорости движения некоторые ключевые кадры могут дублироваться. В качестве примера укажем, что минутный фильм без дублирования требует 1440 кадров. Если между каждой парой вводится пять промежуточных кадров, потребуется разработать 288 ключевых кадров.

В зависимости от приложения может потребоваться решить еще несколько задач. К ним относятся проверка и редактирование движения, а также создание и синхронизация звуковой дорожки. Такие задачи, необходимые для создания полной анимации, также решаются на компьютере.

Базовые функции компьютерной анимации. Многие программные системы анимации разрабатывались либо для анимации в целом, либо для выполнения специализированных задач. Базовые функции анимации включают управление движением объекта, генерацию проекций объекта, создание движения камеры и генерацию промежуточных кадров. Одни программы анимации, например Wavefront, предлагают специальные функции как для проектирования анимации в целом, так и для обработки отдельных объектов. Другие являются специализированными программами, предназначенными для выполнения отдельных задач, например генерации промежуточных кадров или анимации рисунков.

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

Дополнительные функции имитируют движение камеры — наезд, панорамирование и наклон. Они также могут автоматически генерировать промежуточные кадры.

Системы ключевых кадров. Несколько заданных ключевых кадров с помощью системы ключевых кадров позволяют сгенерировать набор промежуточных кадров. Пути движения задаются априорно в виде кинематического описания (как набор сплайновых кривых) или их можно рассчитывать, основываясь на заданных силах, действующих на анимируемые объекты.

Для сложных сцен кадры разбиваются на отдельные компоненты или объекты, называемые келями (eel, celluloid transparency — диапозитив кинофильма). Данный термин заимствован из мультипликационных технологий, где фон и каждый персонаж на сцене размещают на различных диапозитивах. Диапозитивы выстраивают в порядке от фона до переднего плана, фотографируют и получают полный кадр. Затем, используя заданные пути анимации, получают следующий кель для каждого персонажа, положения которых интерполировались по информации с ключевых кадров.

371

1,2, Г-3' — вершины
Рис. 4.74. Ключевые кадры к (а)

4. Методы, алгоритмы и форматы файлов компьютерной графики

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

ик+1 (б): формы многоугольников, так что число углов может быть разным для соседних кадров. Эти преобразования включаются в разработку про-

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

Преобразование форм объектов называется трансформацией (morphing, сокращенно от metamorphosis — метаморфоза). Для моделирования трансформации в соседних ключевых кадрах изменяют формы многоугольников, а в промежуточных кадрах это выглядит как переход одной формы в другую.

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

Отрезок в ключевом кадре к преобразуется в два отрезка в ключевом кадре к + 1. Поскольку ключевой кадр к + 1 имеет лишнюю вершину, в ключевом кадре к вводится дополнительная вершина между вершинами 7 и 2, чтобы уравнять число вершин (и сторон) в двух ключевых кадрах. Используя линейную интерполяцию для генерации промежуточных кадров, дополнительную вершину в ключевом кадре к переводят в вершину 3' по прямолинейной траектории, изображенной на рис. 4.75.

На рис. 4.76 приведен пример треугольника, линейно расширяющегося до четырехугольника.

Языки компьютерной анимации. При необходимости можно разработать процедуры создания и управления анимационными последовательностями на

Г

Добавленная

 

 

точка

 

'2'

 

 

 

Половинный

Ключевой

Ключевой

кадр к + 1

кадр

кадр к

 

 

Рис. 4.75. Половинный кадр: /, 2, Г-3'— вершины

372

4.2. Методы и алгоритмы трехмерной графики и геометрии

Добавленная

точка

Половинный

Ключевой

к а д Р

кадр/t+l

Рис. 4.76. Трансформация треугольника в четырехугольник

универсальном (С, C++, Lisp или Fortran) или специализированном языке программирования. Эти языки обычно включают графический редактор, генераторы ключевых и промежуточных кадров, стандартные графические процедуры. Графический редактор позволяет аниматору разрабатывать и модифицировать формы объектов, используя сплайновые поверхности, методы конструктивной твердотельной геометрии или другие схемы представления.

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

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

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

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

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

373

4. Методы, алгоритмы и форматы файлов компьютерной графики

анимации. Язык бывает сценарным (script based) — инструкции записаны для последующего выполнения, или графическим — диаграммы типа блок-схем несут в себе отношения и процедуры.

Первые анимационные системы для получения последовательностей движений использовали языки программирования общего назначения. Однако при получении анимации возникали большие накладные расходы в задании графических примитивов, структур данных объектов, преобразований и при визуализации. Анимационный язык — любое текстовое описание получаемой анимации. Он может быть написан на специальном сценарном языке или алгоритмическом языке общего назначения упрощенно. Типичными возможностями являются встроенные операции ввода-вывода графических объектов, данных для представления и поддержки иерархической композиции объектов, параметров времени, функций интерполяции, функций для анимирования иерархий объектов, аффинных преобразований, параметров визуализации, параметров для задания атрибутов камер и пирамиды видимости и возможности для управления производством, просмотром и хранением одного или более кадров анимации. Программа, написанная на анимационном языке, часто называется сценарием (script).

Преимущества использования анимационного языка двояки. Во-первых, задание анимации, записанной в виде программы на данном языке, является жестко запрограммировано записью анимации, которая может быть использована для получения анимации в любой момент времени. Кроме того, использование языка позволяет итерационно улучшить анимацию, поскольку сценарий можно изменять и заново строить анимацию. Во-вторых, наличие программных конструкций позволяет применять алгоритмический подход к управлению движением. Анимационный язык, если он достаточно мощный, может интерполировать значения функций и вычислять сложные выражения, реализовывать правила поведения и т. п. Недостаток использования анимационного языка — он фактически является языком программирования, и, следовательно, пользователю (аниматору) нужно быть программистом. Аниматор должен быть обучен не только искусству, но и программированию. Разработаны языки с упрощенными программными конструкциями, но их возможности ограничены. По мере ознакомления пользователя с языком у него появляется желание поместить в анимационный язык все больше алгоритмических возможностей, присущих языкам общего назначения. В настоящее время разработаны анимационные системы, которые фактически являются пользовательским интерфейсом поверх сценарного языка. Пользователи могут применять систему через интерфейс, предоставленный системой, и писать свои собственные сценарии на внутреннем языке. Примером такой системы является язык MEL компании Alias/Wavefront. Язык MEL предоставляет переменные управляющие операторы, процедуры, выражения, доступ к атрибутам объектов и возможность настраивать пользовательский интерфейс. Стандартный пользовательский интерфейс помогает пользователям, не умеющим программировать или не знающим используемый язык, предостав-

374