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

Конкурсная программа

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

Оказалось, что труднее всего определить, куда отнести такие практически всеохватывающие и притом довольно специфические для компьютеров области, как Web-дизайн и 3D-графика. Мы решили включить их сразу в несколько конкурсов и номинаций. Другие работы, например в области компьютерной цветомузыки, могут быть представлены как в рамках существующих конкурсов, так и внеконкурсно, а вот реклама, игры, тренажеры и т. п. не будут выделены в отдельные конкурсы вследствие своего прикладного характера. Применение «чистого» искусства и «чистых» технологий в различных сферах деятельности будет рассматриваться дополнительно, в частности в «объединяющей» номинации «Лучшее инновационное решение».

В эту и иные подобные номинации работы будет отбирать конкурсная комиссия после подведения итогов всех конкурсов.

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

Предполагается, что в конкурсах примут участие как любители, так и профессионалы. Все они смогут не только бороться за победу и призы, но и за возможность представить свою работу в официальных Web/CD-каталогах премии «Эвридика». Кстати, во время проведения Интернет-фестивалей по Сети будет проходить голосование с целью выявления «зрительских симпатий».

Конкурсы
  • [TEC] Техническое моделирование. Трехмерные модели реальных технических объектов, например авиационных и космических аппаратов, автомобилей, лайнеров, локомотивов и т. п. В этом конкурсе будут учитываться качество реализации трехмерных технических объектов (в том числе по готовым чертежам), а также создание абсолютно оригинальных моделей всевозможных средств и устройств.
  • [MOD] Трехмерные сцены. Сцены с использованием трехмерных объектов и разнообразных источников света. Ориентировочный состав номинаций: «Композиция сцен» и «Сцены с источниками света».
  • [ARC] Архитектурное проектирование. Архитектурные объекты, воспроизведенные на ПК, например в ArchiCAD. Ориентировочный состав номинаций: «Современная архитектура», «Исторические архитектурные комплексы» и «Дизайн интерьеров».
  • [SCU] Компьютерная скульптура. Трехмерные скульптурные модели, построенные на ПК. Примерами работ служат статуи, барельефы, медали и т. п.
  • [PHO] Компьютерное фотоискусство. Фотографии, полученные с помощью обычных или цифровых фотоаппаратов, но обработанные на ПК, где исходному материалу будут приданы необычные визуальные характеристики. Это направление мультимедиа под названием Digital Photographic Art лежит на стыке компьютерных технологий, фотографии и изобразительных искусств (живописи и графики). На конкурс будут отобраны те работы, которые подвергаются компьютерной обработке не для целей ретуши, реставрации изображения и т. п., а из области «живописной» фотографии.
  • [ILS] Компьютерная иллюстрация. Статические и динамические иллюстрации на ПК, в значительной степени приближенные к полиграфическим по дизайну и графике. Ориентировочный состав номинаций: «Традиционная иллюстрация» (живопись, графика, коллаж), «Web-иллюстрация» (титульная Web-страница), «Анимированная иллюстрация» (анимация природных явлений).
  • [MUS] Компьютерная музыка. Музыкальные композиции в формате MIDI как собственного сочинения, так и аранжировка существующих произведений. На конкурс принимаются композиции любых музыкальных жанров. Ориентировочный состав номинаций: «Оригинальные композиции», «Аранжировка».
  • [VIS] Визуальная архитектура. Пространственное построение визуальной информации, связь образа и слова, интуитивная навигация. Один из наиболее оригинальных конкурсов. Ориентировочный состав номинаций: «Промышленный дизайн» (пульты управления, меню, функциональные интерфейсы, в том числе Web-интерфейсы), «Web-архитектура» (экспосайты, Web-парки, Web-решения с визуализацией пространственной навигации).
  • [ANI] Компьютерная анимация. Анимационные работы, выполненные преимущественно для воспроизведения в Web-среде (GIF, Flash, Java и др.) и предназначенные просто для просмотра, а также подразумевающие возможность интерактивного взаимодействия. Ориентировочный состав номинаций: «Интерактивная анимация» и «Анимационные фильмы».
Специальные номинации
  • [SCU-EUR] Выполнение фигурки «Эвридики» — в конкурсе «Компьютерная скульптура».
  • [VIS-EUR] Web-выставка конкурсных работ на премию «Эвридика» — в конкурсе «Визуальная архитектура».
«Объединяющие» номинации
  • [U-GRP] Гран-при (самая лучшая работа среди всех представленных на конкурсы).
  • [U-INV] «Лучшее инновационное решение» (степень применимости работ в реальных задачах).
  • [U-ART] «Эстетическое совершенство» (наилучшее эстетическое восприятие).
  • [U-ENG] «Технологическое совершенство» (наилучшая технологическая идея).
Регламент конкурсной программы на 2002 г.

Весенний тур:
  • прием заявок и работ — с 1 февраля по 15 марта;
  • отбор номинантов — до 12 апреля.
Осенний тур:
  • прием заявок и работ — с 14 июня по 16 августа;
  • отбор номинантов — до 6 сентября;
  • выбор финалистов — до 1 ноября.
Порядок представления и рассмотрения работ
  • В адрес конкурсной комиссии (evridika@pcworld.ru) направляется заявка на участие в определенном конкурсе (номинации). Идентификатором конкурсанта становится электронный адрес, указанный в заявке.
  • Если заявка принимается, то конкурсанту посылается подтверждение. Конкурсная комиссия отправляет также в адрес конкурсанта его учетный номер и пароль. При рассмотрении работы соблюдается анонимность участников конкурса.
  • В случае, если конкурсной комиссии или экспертному комитету требуется более детально ознакомиться с представленной работой, то конкурсанту, возможно, придется выслать дополнительные файлы.
  • По окончании отбора номинантов конкурсанту направляется уведомление.
  • Конкурсант (лицо, группа лиц), получивший уведомление, должен прислать в конкурсную комиссию полные данные по каждому из входящих в его состав участников (страна, город, организация/компания, фамилия, имя, отчество, год рождения). На этом этапе анонимность уже раскрывается.
Порядок оценивания работ
  • Присылаемые работы проходят два тура — весенний и осенний, причем участвующие в первом автоматически попадают и во второй. Кстати, допускается присылать работы и сразу на осенний тур.
  • Финалисты в каждой номинации выбираются экспертными комитетами из 20 номинантов (это число может варьироваться в зависимости от количества и качества поданных работ). А отбирают номинантов экспертные комитеты при участии конкурсной комиссии.
  • Лауреатов премии по каждой номинации выбирает Главное жюри из трех финалистов, определенных соответствующими экспертными комитетами.
  • Работы оцениваются в баллах (в каждом конкурсе и в любой номинации будут приняты свои критерии отбора, выбранные соответствующим экспертным комитетом).
  • Среди финалистов и номинантов выделяются квоты (в соотношении 2:1) для ординарных и привилегированных конкурсных работ. Ординарной считается конкурсная работа, оцениваемая в осеннем туре, а привилегированной — и в весеннем, и в осеннем (она получит и премиальные баллы). Среди трех финалистов одно место отводится привилегированной работе и два места — ординарным.
  • Во избежание заимствования идей другими участниками в ходе каждого тура работы могут быть опубликованы (на официальном Web-сайте, на CD-каталогах премии) только одновременно.
Правила участия
  • Участником конкурса может стать любое физическое лицо без ограничения возраста, выступающее в конкурсе либо самостоятельно, либо в составе авторского коллектива.
  • Конкурсантом является участник конкурса или авторский коллектив (куда входят несколько участников конкурса), получивший от конкурсной комиссии подтверждение на участие.
  • Конкурсант не может представлять в весеннем или осеннем туре более одной работы в номинацию.
  • Участник конкурса не может быть представителем его партнеров или спонсоров, а также членом судейской коллегии. Если он нарушит данное правило, то все без исключения его работы будут сняты с конкурсной программы. Если же участник-нарушитель входит в состав судейской коллегии, то представленные им данные об оцениваемых работах аннулируются.
  • Ответственность за правомерное использование в ходе подготовки и представления своей работы всех объектов авторского права (программного обеспечения, информационных материалов) полностью возлагается на конкурсанта.
Форма заявки

Заявка должна содержать:

  • электронный адрес конкурсанта;
  • название конкурса и номинации;
  • краткое изложение сути работы (не более 200 слов);
  • описание сферы применения работы (не более 200 слов);
  • список использованных инструментов (не более 100 слов);
  • визуальное представление работы (файлы .JPG размером от 1024 до 1280 точек по наибольшей стороне) для музыкальных конкурсов — MIDI-файлы.

Олимпиада

Если ни один из конкурсов на премию «Эвридика» не привлек вашего внимания, то попытайте счастья в нашей Олимпиаде. Ее участником может стать любое лицо, удовлетворяющее «Правилам участия», приведенным выше, за исключением пункта, ограничивающего число работ, поданных в ходе весеннего и осеннего туров. Здесь как раз наоборот: чем больше заданий вы выполните, тем выше будут ваши шансы получить как промежуточные призы, так и главный в общем зачете Олимпиады.

Условия задания

Присылаемые на Олимпиаду работы должны отвечать следующим требованиям.

  • Продукты должны быть представлены обязательно в виде исходного текста, написанного на любом языке программирования и снабженного рекомендациями по их компиляции или интерпретации с помощью свободно распространяемых средств в среде одной из ОС: DOS, Windows или Linux.
  • Программа должна выполнять загрузку модели из файла формата .obj , .lwo или 3ds, ее просмотр в графическом окне (с возможностью вращения), модификацию каркаса и визуализацию результата.
  • Должны быть предусмотрены определение и вывод времени работы блоков модификации, а также сглаживания каркаса (раздельно).
Итоги первого задания Олимпиады

Решения первого задания Олимпиады будут оцениваться экспертной группой по следующим критериям:

  • идея, реализованная в основном алгоритме;
  • компактность на уровне исходных текстов;
  • качество получаемой поверхности;
  • скорость выполнения.

Каждый из них получит оценку по десятибалльной шкале, которая затем будет суммироваться с весовыми коэффициентами 0,4, 0,3, 0,2 и 0,1 соответственно. Победителем станет тот, кто наберет наибольшее число баллов. Результаты, показанные в этом и последующих заданиях, будут учитываться при подведении промежуточных и общих итогов.

Чтобы принять участие в Олимпиаде, не требуется подавать специальную заявку. Просто присылайте нам свои работы по электронной почте в виде zip-архивов по адресу evridika@pcworld.ru и не забывайте дать в теле письма упомянутые выше рекомендации по запуску. Мы ждем ваших решений первого задания до 1 марта 2002 г. Если конкурсант войдет в число номинантов, то после нашего запроса ему нужно будет выслать полные данные о себе (страна, город, название организации/компании, фамилия, имя, отчество, год рождения). О призах будет рассказано дополнительно. Желаем удачи!

Оргкомитет

Задание первое: сделаем Mesh послушным

Что такое Mesh, наверняка знает любой, кто имеет хоть какое-нибудь отношение к САПР и 3D-графике. Под этим понимается состоящая из треугольников объемная фигура — каркас, аппроксимирующий трехмерные поверхности моделей. Именно с ним и работают практически все программы и графические ускорители. При этом насколько удобно использовать треугольники для вычислений и отображения техногенных сцен без сглаженных поверхностей, настолько неудобно работать с ними же художникам и разработчикам, применяющим сглаженные или «органические» поверхности. Размеры моделей чрезмерно увеличиваются, а манипулирование поверхностью, состоящей из тысяч треугольников, чрезвычайно осложняется.

Поэтому стали разрабатываться альтернативные технологии, среди которых наибольшую популярность получили метод NURBS-поверхностей (отображение с помощью нелинейных рациональных сплайнов — Non Linear Rational Beta Spline) и метод делящихся поверхностей (Subdivision Mesh). Сначала NURBS-поверхности активно внедрялись, и сейчас они поддерживаются подавляющим большинством 3D-редакторов и основными 3D-библиотеками. По альтернативному пути пошли очень немногие, в том числе пакет LightWave, начиная с версии 5.5. Но широкое распространение NURBS-поверхностей не решило основных проблем. Их можно было применять только в несложных моделях, да и то преимущественно немонолитных. Поэтому, спустя несколько лет, производители программ более внимательно присмотрелись к Subdivision-поверхностям. Этому способствовал и немалый успех программы 3D-моделирования LightWave, которая благодаря изначальной ориентированности на этот метод до сих пор считается одной из лучших.

Сейчас все популярные программы 3D-редактирования поддерживают эту технологию и даже позиционируют ее как основную для моделирования очень сложных органических поверхностей. Этот успех был достигнут благодаря удобству манипулирования очень сложными поверхностями. Мы уже рассказывали, как легко можно создавать сложные модели персонажей, используя метод делящихся поверхностей в «Мире ПК», №12/2000, с. 44.

Кроме того, такой метод очень удобен для передачи сообщений по Интернету. Ведь ни для кого не секрет, что 3D-модели занимают много памяти, и целесообразность пересылки по Сети трехмерных сцен хорошего качества бывает порой сомнительной. А теперь представьте, что по Сети можно переслать каркас модели с малым количеством вершин, а их сглаживание выполнить уже на машине клиента! В этом случае размер передаваемого файла уменьшится в несколько раз, а разрешение модели на мониторе клиента может достигать величин, обеспечивающих кинематографическое качество. Впрочем, подобная технология уже появилась и даже стала доступна большинству из нас в виде модуля просмотра 3D-сцен, встраиваемого в пакет ShockWave player.

Казалось бы, жизнь налаживается, но... пока только для пользователей. Найти достойную реализацию метода делящихся поверхностей в исходных текстах — непростое дело. А то, что эта технология перспективна, показывает пример популярного пакета 3D Studio Max. Уже в его третьей версии авторы добавили так называемые NURMS-поверхности, по сути являющиеся делящимися. Есть также много других интересных примеров реализации этого метода, хотя в каждой программе он называется по-своему, где — SDS, где — MetaNurbs... Но от столь широкого разнообразия разработчику не легче, так как множество интересных задач можно было бы решить, взяв за основу исходный текст программы модификации каркаса.

Именно поэтому мы и предлагаем вам внести свой вклад в развитие 3D-графики и разработать подобный актуальный алгоритм в качестве первого конкурсного задания. Чтобы дать вам импульс к творчеству, предлагаем исходный текст программы-заготовки, где уже применен метод делящихся поверхностей. Ее можно как угодно совершенствовать или реализовать на иных языках программирования. Полный исходный текст можно скопировать с сайта www.javastudio.h1.ru.

Заготовка

В качестве среды для разработки использованы язык Java и библиотека Java 3D API. Не мудрствуя лукаво, был выбран метод деления ребер треугольников, суть которого заключается в том, что сначала делятся пополам ребра всех треугольников, а потом находится точка пересечения медиан и в нее добавляется новая вершина. Мы выполнили одну итерацию деления треугольников, и теперь можно приступать к сглаживанию. Для сглаживания углов предлагается весьма простой алгоритм. Для некоей вершины определяются ближайшие, соединенные с ней ребром, затем суммируются их координаты и делятся на количество соседей. Таким образом, получится еще одна вершина, но несколько смещенная в глубину модели. Чтобы можно было регулировать степень перемещения и достичь более мягких переходов, отрезок между заданной и полученной вершинами умножается на определенный коэффициент. Эту процедуру можно повторить несколько раз, слегка изменив величину. Вряд ли алгоритм станет примером для подражания, но на нем очень просто и наглядно демонстрируется процесс сглаживания.

Существуют и другие методы модификации каркаса, информацию о которых можно найти в Интернете. А если вы решите придумать свой, ну что ж, желаем удачи!

Здесь приведена только часть текста программы, имеющая непосредственное отношение к алгоритму сглаживания. Чтобы получить недостающие фрагменты, не придется даже обращаться к упомянутому выше сайту, — просто возьмите их из программы KofeStudio, описанной в статье «Linux, Java, 3D-графика!» в этом же номере журнала.

Итак, заготовка состоит из нескольких файлов. Стандартная реализация метода main(), находящаяся в файле MainKofeStudio.java, аналогична упомянутой выше программе KofeStudio (как и файл ExampleFileFilter.java). Кроме того, несколько классов созданы из одноименных путем исключения ненужных конструкций, и значит, классы Bar, MainFrame, ModeCanvas, Prim и SimpleCanvas можно позаимствовать также из программы KofeStudio. Существенное отличие имеют только класс Bar, куда теперь добавлен фрагмент для реализации кнопок Subdivision и Smooth, и, конечно, сами методы, вызываемые нажатием на них. Далее мы будем рассматривать только классы Bar и Triangle, причем в последнем инкапсулированы различные методы обработки каркаса. Первый дополнительный метод класса Bar выполняет деление каркаса описанным выше способом.

/* метод получает в качестве параметра
 массив вершин каркаса, расположенных 
последовательными тройками, по три вершины
 для каждого треугольника */
public GeometryArray subdivisionGeometry
(Point3f[] pf){
/* создадим два рабочих массива, один 
- для копирования полученного, другой 
- для размещения в нем поделенного каркаса */
Point3f[] par = new Point3f[pf.length];
Point3f[] newpar = new Point3f[par.length*6];
for(int i = 0; i < par.length; i++){
par[i] = new Point3f(0,0,0);
}
par = pf;
/* теперь реализуем цикл просмотра всех
 треугольников в заданном массиве. 
При каждой итерации будем создавать 
объект типа Triangle с инициализацией 
его координатами текущего треугольника */
int k = 0;
Triangl trig = new Triangl();
for(int j = 0; j < par.length;
 j = j+3){
for(int i = 0; i < 3; i++){
trig.setData(i, par[i+j]); }
/* вычисляем середину треугольника */
Point3f center = new Point3f
(trig.getCenterPoint());
/* середины отрезков */
Point3f[] subps = new Point3f[3];
subps = trig.getSubPoints();
Point3f[] pttrig = new Point3f[3];
for(int i = 0; i < 3; i++){
pttrig[i] = trig.getVertex(i);
}
/* затем при помощи трех вершин 
и середины треугольника, а также 
середин его отрезков создадим 
шесть новых треугольников */
newpar[k+17] = new Point3f(pttrig[2]);
newpar[k+15] = new Point3f(subps[2]);
newpar[k+16] = new Point3f(center);
newpar[k+9] = new Point3f(subps[1]);
newpar[k+11] = new Point3f(pttrig[2]);
newpar[k+10] = new Point3f(center);
newpar[k+6] = new Point3f(pttrig[0]);
newpar[k+8] = new Point3f(subps[1]);
newpar[k+7] = new Point3f(center);
newpar[k+14] = new Point3f(subps[2]);
newpar[k+13] = new Point3f(center);
newpar[k+12] = new Point3f(pttrig[1]);
newpar[k+2] = new Point3f(subps[0]);
newpar[ k ] = new Point3f(pttrig[1]);
newpar[k+1] = new Point3f(center);
newpar[k+3] = new Point3f(subps[0]);
newpar[k+4] = new Point3f(center);
newpar[k+5] = new Point3f(pttrig[1]);
k = k + 18;
}
/* далее выполняется создание объекта
 типа TriangleArray, а также множество 
итераций сглаживания */
TriangleArray subtar = new TriangleArray
(newpar.length, TriangleArray.COORDINATES);
Point3f[] smoothpar = new
 Point3f[newpar.length];
smoothpar = newpar;
for(int i = 0; i < 30; i++)
{ smoothpar = Smooth(smoothpar);}
subtar.setCoordinates(0, smoothpar);
return subtar;
}

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

public Point3f[] Smooth(Point3f[] pfdiv){
Triangl trig = new Triangl();
ArrayList points = new ArrayList();
Point3f[] pfsmooth = new Point3f[pfdiv.length];
for(int i = 0; i < pfsmooth.length; i=i+3){
for(int j = 0; j < 3; j++)
{ trig.setData(j, pfsmooth[j]); }
for(int k = 0; k < 3; k++){
pfsmooth[i+k] = trig.smootingVertex
(pfdiv, i+k);
}
}
return pfsmooth;
}

Теперь рассмотрим ключевой класс Triangl, исходный код которого приведен полностью, за исключением операторов импорта.

class Triangl{
public Point3f[] tr = new Point3f[3];
// конструктор пустого треугольника
Triangl(){
for(int i = 0; i < 3; i++){
tr[i] = new Point3f(0,0,0);
}
}
public void setData(int i, Point3f vertex){
tr[i] = vertex;
}
public Point3f getVertex(int i){
return tr[i];
}
// вычисление середины треугольника
public Point3f getCenterPoint(){
Point3f cp = new Point3f(this.
getSubPoint(0,1));
Point3f fp = new Point3f(tr[2]);
fp.sub(cp);
fp.scale(.333f);
cp.add(fp);
return cp;
}
// вычисление середины ребра
public Point3f getSubPoint(int x, int y){
Point3f sp = new Point3f(tr[x]);
Point3f tp = new Point3f(tr[y]);
sp.sub(tp);
sp.scale(.5f);
tp.add(sp);
return tp;
}
/* метод возвращает массив координат 
середин ребер треугольников */
public Point3f[] getSubPoints(){
Point3f[] sp = new Point3f[3];
sp[0] = new Point3f(this.getSubPoint(0,1));
sp[1] = new Point3f(this.getSubPoint(0,2));
sp[2] = new Point3f(this.getSubPoint(1,2));
return sp;
}
/* метод определения соседних вершин 
в качестве параметра получает индекс 
главной вершины и массив, в котором 
нужно найти ее соседей */
public ArrayList getConnectedPoints
(Point3f[] tpar, int v){
ArrayList tcf = new ArrayList();
Point3f Center = tpar[v];
ArrayList points = new ArrayList();
/* поиск треугольников, в которых встречаются 
координаты заданной вершины */
for(int i = 0; i < tpar.length; i++){
if(Center.equals(tpar[i])){ tcf.add(new
 Integer(i)); }
}
/* создание отдельного массива соседей */
for(int i = 0; i < tcf.sie(); i++){
if(((Integer)tcf.get(i)).intValue() % 3 == 0){
points.add(new Integer(((Integer)tcf.get(i)).
intValue()+1));
points.add(new Integer(((Integer)tcf.get(i)).
intValue()+2));
}
else if(((Integer)tcf.get(i)).intValue
() % 3 == 1){
points.add(new Integer(((Integer)tcf.get(i)).
intValue()-1));
points.add(new Integer(((Integer)tcf.get(i)).
intValue()+1));
}
else if(((Integer)tcf.get(i))
.intValue() % 3 == 2){
points.add(new Integer(((Integer)tcf.get(i)).
intValue()-1));
points.add(new Integer(((Integer)tcf.get(i)).
intValue()-2));
}
}
return points;
}
/* главный метод, в котором определяются 
соседние вершины, вычисляется координата 
их суммарной точки и определяется коэффициент 
смещения результирующей вершины */
public Point3f smootingVertex(Point3f[]
 pf, int iVertex){
Point3f vertex = new Point3f();
Point3f point = new Point3f(pf[iVertex]);
ArrayList points = getConnectedPoints
(pf, iVertex);
for(int i = 0; i < points.size(); i++){
vertex.add(new Point3f(pf[((Integer)points.
get(i)).intValue()]));
}
vertex.scale(1/(float)points.size());
vertex.sub(point);
vertex.scale(0.1f);
point.add(vertex);
//System.out.println("point "+ point);
return point;
}
}

Эта программа, конечно, далека от идеала, и потому ее усовершенствование может принести существенные плоды.

Первое задание Олимпиады подготовил Виталий Галактионов, e-mail: vit3d@mail.ru.

552