Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Создание 3D-иллюстраций — прототип системы

Anna | 31.05.2014 | нет комментариев

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

Не так давным-давно, я с изумлением нашел, что даже мой ноутбук (вдалеке не самый новейший и сильный) поддерживает эталон WebGL. Стало ясно, что подходящий момент пришел. В итоге некоторых усилий получился прототип системы создания и публикации 3D-иллюстраций.

http://ewclid.headfire.ru/

Увлекательная вероятность, которую удалось реализовать — просмотр иллюстраций на 3D-телевизорах в стереорежиме без каких-либо драйверов и плагинов. Итог осуществляется прямо из браузера в формате Side-By-Side. В всеобщем-то ради этого все и затевалось.

Абсолютно допустимо, что увидеть систему в работе удастся вовсе немногим. Умоляю извинить за допустимые програ-результаты и торчащие уши – это лишь прототип. Кто хочет узнать о системе подробнее – умоляю под кат.

Вероятности прототипа

На данный момент протоип владеет следующими вероятностями:

  • Создание сцены ведется на языке PHP. Cоответственно доступны все вероятности языка (переменные, массивы, циклы, данные, вспомогательные функции). Дозволено создавать 3D-сцены, применяя примитивы (точка, отрезок, вектор, параллелепипед он-же плоскость, сфера, конус, цилиндр).
  • Объекты могут быть различных цветов (рекомендуется применять серый, алый, синий, зеленый, желтый). Помимо того может быть назначена произвольная прозрачность (от всецело непрозрачного до всецело прозрачного).
  • Дозволено размещать и вращать в пространстве как сами примитивы, так и рабочую систему координат (комфортно, когда все построение необходимо сделать под необходимым углом и в требуемой точке)
  • Дозволено добавить несложную анимацию. Пока доступно только отобразить объект, спрятать объект, вывести текстовый комментарий, сделать паузу, Дабы сцена какое-то время отображалась зрителю.
  • Все, что создается дозволено просматривать в нескольких режимах. (См.ниже)
  • Сценой дозволено руководить с поддержкой мыши. Сцену дозволено вращать, приближать-удалять, указывать новейший центр вращения. В стерео-режимах на мышь реагирует только сцена для левого глаза (в режиме Перекрестного взора она находится справа!).

Режимы просмотра 3d-сцен:

  • Моно-режим – одно окно.
  • Перекрестный взор – для левого глаза сцена справа, для правого – слева.
  • Режим Стерео ТВ – режим Side-By-Side. Правый глаз справа, левый глаз слева. Оба изображения сжаты по горизонтали в два раза.
  • Все режимы имеют вероятность разворачиваться на полный экран (в режиме Стерео-ТВ без этого ничего не получится)
  • Существует режим для резких парней – именуется Начальный код (Дабы строить чертеж в уме по PHP коду– без компьютера)

Про чертежную доску и нездоровый педантизм

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

Думаю, доска пригодна – она задает систему координат, дает чувство пространства и масштаба. Чертежи на ее фоне смотрятся отменнее. По умолчанию центр координат совпадает с центром листа. Размеры задаются в миллиметрах (размеры листа соответственно 841ds_lqvmk!br/> Еще хочется сказать, что примитивы, не имеющие толщины – такие, как точка, вектор, отрезок – все равно реализованы как объемные тела – мне кажется это больше зрелищно.

Демо-иллюстрации

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

Demo 1. Примитивы.

Demo 2. Комбинированные объекты.

Demo 3. Объект в формате x3d.

Demo 4. Анимация. Построение тетраэдра. (Анимация включается в левом верхнем углу сцены).

Привожу начальный код Demo3, Дабы было ясно, как приблизительно производятся построения.

function zzCustomLamp($place, $color) {
  zzSetCoord($place); 
  zzLamp('', array(0,0,0));
  for ($i=1; $i<=6; $i  ) {
      zzSetStyle($color, $i/7);
      zzCircle('', array(0,0,$i*40), 50 $i*10);
   }
}

zzDesk();
zzCustomLamp(array(-200,-200,0),'red');
zzCustomLamp(array(-200,200,0),'green');
zzCustomLamp(array(200,-200,0),'blue');
zzCustomLamp(array(200,200,0),'gray');

Испытания на 3D-телевизоре

Режим Стерео ТВ был испытан на телевизоре Phillips с пассивными очками. Компьютер подключался через HDMI. Стереоэффект присутствовал. При вращении сцены некоторые объекты кокетливо вылезали из экрана. Был подмечен один недочет — в стереорежиме неудобно руководить сайтом, следственно Зачастую доводилось переходить в режим 2D. Вообще пытался испытавать сайт на всех компьютерах, до которых сумел дотянуться. Тестировал в браузерах Firefox и Chrome. Как бы работает. Но безусловно лучшие итоги и плавность движений достигается на игровых комптьютерах с мощной видеокартой.

Инструкции для желающих почертить

Дальнейшая информация – для тех, кто хочет почертить независимо. Необходимо войти в систему под логиномeditor (пароль совпадает с логином). Дальше предпочесть – Сделать публикацию, 3D-сцена. В окошке создания материала дозволено набирать команды. Самое первое, что необходимо – отделить PHP код от основного оглавления строкой ###3D###. Дальше набрать zzDesk(); — если хотите вывести чертежную доску. А дальше – вводить команды.

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

// ###3D### - строка отделяющая PHP-код

$place=array( $x, $y, $z )
$size=array( $dx, $dy , $dz )
$rotation = array ( $axis_x, $axis_y, $axis_z, $angle) 

// $angle задается в ГРАДУСАХ, умоляю помилование у любителей математики.

$color = ‘gray’  ‘red’ ‘green’ ‘blue’ ‘yellow’
$transparent = 0..1 (прозрачность – 1 – всецело прозрачный).
$emissive = true – объект подсвечен изнутри

$id = ‘circle01’ - идентификатор объекта 
//                             задается при создании примитива,
//                             применяется при последующей анимации

$id_comment = ‘com01’ - идентификатор коментария 
//                     всякий тег в тексте публикации может быть помечен 
//                      признаком id, и после этого содержимое тега  
//                     дозволено вывести как комментарий в построении

// настройка параметров черчения
function zzSetHide(); // объекты будут создаваться заметными (для грядущей анимации)
function zzSetShow(); // объекты будут создаваться видимыми
function zzSetStyle($color, {$transparent},  {$emissive} ); // задание цвета и прозрачности
function zzSetCoord($center, {$rotation} ); // перемещение локальной системы координат

// черчение примитивов
function zzDesk();   // чертежная доска
function zzPoint($id, $place) ; // точка
function zzLine($id, $pBegin, $pEnd);  // отрезок
function zzVector($id, $pBegin, $pEnd); // вектор (со стрелкой на конце)
function zzCircle($id, $place, $radius,  {$rotation} ) ;  // окружность
function zzBox($id, $place, $size,  {$rotation} ) ; // параллелипипед (при желании плоскость)
function zzSphere($id, $place, $radius) ; // сфера
function zzCone($id, $place, $radius, $height, {$rotation} );   // конус
function zzCylinder($id, $place, $radius, $height, {$rotation} ) ; // цилиндр
function zzLamp($id, $place) ;  // лампа, формат x3d (играет роль teapot –  ну вы осознали)

// анимация
function zzStepHide($id);  //скрыть объект
function zzStepShow($id);  //показать объект
function zzStepComment($comment_id); // вывести комментарий
function zzStepCommentHide($comment_id); // спрятать панель комментариев (изредка благотворно)
function zzStepPause();  //показать сцену пользователю (теперь настроено 2 сек)

Если внезапно Вам выведется пустая сцена, либо вовсе пустое окно браузера – значит что-то не в порядке в коде. Умоляю меня простить, система обработки ошибок в зачаточном состоянии. Лечится либо кнопкой назад, либо комплектом edit в строке адреса позже идентификатора публикации.

Что не удалось реализовать в прототипе

Многие вероятности остались за рамками прототипа, правда намерения их реализовать были.

  • Хотелось бы огромнее примитивов (дюже не хватает кусков – дуг, секторов, многоугольных плоскостей).
  • Безусловно же, сплайн-поверхности и сплайн-кривые.
  • Дюже хотелось реализовать объемные подписи, Дабы прямо в объеме подписывать примитивы. К сожалению не хватило ума. В WebGL-библиотеке вероятность есть, но кое-что не заработало так как мне хотелось.
  • Хотелось бы несложную геометрическую арифметику, Дабы находить точки пересечения примитивов.
  • Больше широкие вероятности анимации. Плавные движения и трансформации. (Основное при этом не усложнить все настоль, что сложно будет этим пользоваться).

Заглянем под капот

Под капотом: в качестве CMS – рабочая лошадка Drupal 6, в качестве WebGL-библиотеки – x3dom (читается как xFreedom). И то и другое пришлось немножко допилить напильником. Что было определенно сделано:

  • Самое основное — доработана библиотека x3dom. Толк доработки – сделать синхронизацию 2-х видов для применения в стереорежиме. Пришлось лезть в сердце библиотеки и руками по локоть в крови руководить матрицами трансформации. Помимо того в режиме Стерео-ТВ необходимо было сжимать вид по горизонтали. Веры примерно не было… Но пациент уцелел. Что и обеспечило работоспособность прототипа.
  • Был сделан модуль к Drupal для реализации API. Был сделан фильтр Drupal для распознавания 3D-кода.Немножко допилена тема оформления Drupal для итога экранов.
  • Был сделан несложный JavaScript-код для управления анимацией. Еще некоторое число обвязки из PHP и JavaScript, Дабы все совместно заработало.

Что дальше?

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

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB