Vue file renderer 3ds max что это

Обновлено: 06.07.2024

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

Давайте разберём простой пример, в котором использование render -функции будет целесообразным. Предположим, вы хотите сгенерировать заголовки с «якорями»:

Для генерации представленного выше HTML вы решаете использовать такой интерфейс компонента:

При использовании шаблонов для реализации интерфейса, который генерирует только заголовок, основанный на свойстве level , вы быстро столкнётесь со следующей ситуацией:

Выглядит не очень. Шаблон получился не только очень большим — приходится ещё и <slot></slot> повторять для каждого возможного уровня заголовка.

Шаблоны хорошо подходят для большинства компонентов, но рассматриваемый сейчас — явно не один из них. Давайте попробуем переписать компонент, используя render -функцию:

Так-то лучше, наверное? Код короче, но требует более подробного знакомства со свойствами экземпляра Vue. В данном случае необходимо знать, что когда дочерние элементы передаются без указания директивы v-slot , как например Привет, мир! внутри anchored-heading , они сохраняются в экземпляре компонента как $slots.default . Если вы этого ещё не сделали, советуем вам пробежать глазами API-справочник свойств экземпляра, перед тем как углубляться в рассмотрение render-функций.

Узлы, деревья, и виртуальный DOM

Прежде чем погрузиться в render -функции, необходимо узнать, как работают браузеры. Возьмём, например, этот HTML-код:

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

Дерево узлов DOM для HTML из примера выше выглядит следующим образом:

Визуализация дерева DOM

Каждый элемент является узлом. Каждый фрагмент текста является узлом. Даже комментарии это узлы! Узел — это всего лишь часть страницы. И так же, как и в генеалогическом дереве, каждый узел может иметь своих потомков (т.е. каждая часть может содержать в себе другие части).

Обновление всех этих узлов может быть затруднительно, но, к счастью, вам не придётся делать это вручную. Вы просто вставляете в шаблон определённый HTML-код, который вы хотите отобразить на странице:

Или то же, но с использованием render-функции:

В обоих случаях Vue автоматически будет обновлять страницу при изменениях blogTitle .

Виртуальный DOM

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

Что в действительности возвращает createElement ? Это не в точности реальный DOM-элемент. Можно было бы назвать createNodeDescription , если быть точным, так как результат содержит информацию, описывающую Vue, какой именно узел должен быть отображён на странице, включая описания любых дочерних узлов. Мы называем это описание узла «виртуальным узлом», обычно сокращая до аббревиатуры VNode. «Виртуальный DOM» — это то, что мы называем всем деревом VNodes, созданным из дерева компонентов Vue.

Аргументы createElement

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

Подробно об объекте данных

Обратите внимание: особым образом рассматриваемые в шаблонах атрибуты v-bind:class и v-bind:style , и в объектах данных виртуальных узлов имеют собственные поля на верхнем уровне объектов данных. Этот объект также позволяет вам связывать обычные атрибуты HTML, а также свойства DOM, такие как innerHTML (это заменит директиву v-html ):

Полный пример

Узнав всё это, мы теперь можем завершить начатый ранее компонент:

Ограничения

Виртуальные узлы должны быть уникальными

Все виртуальные узлы в компоненте должны быть уникальными. Это значит, что render -функция ниже некорректна:

Если вы действительно хотите многократно использовать один и тот же элемент/компонент, примените функцию-фабрику. Например, следующая render -функция полностью корректный способ для отображения 20 одинаковых абзацев:

Реализация возможностей шаблона с помощью JavaScript

v-if и v-for

Функциональность, легко реализуемая в JavaScript, не требует от Vue какой-либо проприетарной альтернативы. Например, используемые в шаблонах v-if и v-for :

При использовании render -функции это можно легко переписать с помощью if / else и map :

v-model

В render -функции нет прямого аналога v-model — вы должны реализовать эту логику самостоятельно:

Это цена использования низкоуровневой реализации, которая в то же время предоставляет вам больше контроля над взаимодействием, чем v-model .

События и модификаторы клавиш

Для модификаторов событий .passive , .capture и .once , Vue предоставляет префиксы, которые могут быть использованы вместе с on :

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

Модификаторы Эквивалент в обработчике
.stop event.stopPropagation()
.prevent event.preventDefault()
.self if (event.target !== event.currentTarget) return
Клавиши:
.enter , .13
if (event.keyCode !== 13) return (измените 13 на любой другой код клавиши для модификаторов других клавиш)
Модификаторы клавиш:
.ctrl , .alt , .shift , .meta
if (!event.ctrlKey) return (измените ctrlKey на altKey , shiftKey или metaKey соответственно)

Пример использования всех этих модификаторов вместе:

Слоты

Вы можете получить доступ к статическому содержимому слотов в виде массивов VNode, используя this.$slots :

И получить доступ к слотам со своей областью видимости как к функциям, возвращающим VNode, используя this.$scopedSlots :

Чтобы передать слоты со своей областью видимости в дочерний компонент при помощи render -функции, добавьте свойство scopedSlots в данные VNode:

Если приходится писать много render -функций, то такой код может утомлять:

Особенно в сравнении с кодом аналогичного шаблона:

Поэтому есть плагин для Babel, позволяющий использовать JSX во Vue, и применять синтаксис, похожий на шаблоны:

Сокращение createElement до h — распространённое соглашение в экосистеме Vue и обязательное для использования JSX. Начиная с версии 3.4.0 плагина Babel для Vue, мы автоматически внедряем const h = this.$createElement в любой метод и геттер (не функциях или стрелочных функциях), объявленных в синтаксисе ES2015 с JSX, поэтому можно удалить параметр (h) . В предыдущих версиях плагина, ваше приложение будет выкидывать ошибку, если h недоступен в области видимости.

Подробную информацию о преобразовании JSX в JavaScript можно найти в документации плагина.

Функциональные компоненты

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

В подобных случаях мы можем пометить компоненты как функциональные (опция functional ), что означает отсутствие у них состояния (нет реактивных данных) и экземпляра (нет переменной контекста this ). Функциональный компонент выглядит так:

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

Ссылка будет указывать на HTMLElement при использовании с функциональными компонентами, потому что у них нет состояния и экземпляра.

С версии 2.5.0+, если вы используете однофайловые компоненты, вы можете объявить функциональные компоненты, основанные на шаблоне таким образом:

Всё необходимое компоненту передаётся через context — объект, содержащий следующие поля:

Поскольку функциональные компоненты — это просто функции, их отрисовка значительно быстрее.

Кроме того, они очень удобны в качестве обёрток. Например, если вам нужно:

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

Вот пример компонента smart-list , делегирующего отрисовку к более специализированным компонентам, в зависимости от переданных в него данных:

Передача атрибутов и событий дочерним элементам/компонентам

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

Однако функциональные компоненты требуют явного определения этого поведения:

Передавая context.data вторым аргументом в createElement , мы передаём любые атрибуты или слушатели событий, используемые в my-functional-button . На самом деле это настолько очевидно, что для событий не требуется модификатор .native .

Если вы используете функциональные компоненты на основе шаблонов, вам также придётся вручную добавлять атрибуты и слушатели. Поскольку у нас есть доступ к индивидуальному содержимому контекста, мы можем использовать data.attrs для передачи любых атрибутов HTML и listeners (псевдоним для data.on ) для передачи любых слушателей событий.

slots() vs children

Вы можете задаться вопросом зачем нужны slots() и children одновременно. Разве не будет slots().default возвращать тот же результат, что и children ? В некоторых случаях — да, но что если у нашего функционального компонента будут следующие дочерние элементы?

Для этого компонента, children даст вам оба абзаца, slots().default — только второй, а slots().foo — только первый. Таким образом, наличие и children , и slots() позволяет выбрать, знает ли компонент о системе слотов или просто делегировать это другому компоненту, путём передачи children .

ну что ж ,потыкала я этот вуе,вот все,что пока удалалось наваять..

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

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

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

В отдельном приложении Vue можно кисточкой нарисовать траву, деревья, камни, также можно автоматически Populate(сгенерировать) их за счет готовых текстур, можно сдлеать маску и много чего ещё. Но пока никто не знает что именно ты хочешь сделать, врядли тебе кто-нибдуь точно объяснит как.

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

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

насчет травы кисточкой,меня интересует-2 вещи:
-как ее нарисовать тупо на квадратной плоскости?дальше я разберусь..
-и будет ли это трава быстро просчитываться. или вообще все это не имеет смысла..

Ну имееет смысла или нет решать только тебе, если у тебя совсем старый компьютер то может и

10часов считаться. Но никто не заставляет делать preview как final.

Рисовать можно с помощью этого иструмента, дервья с камнями, растения с деревьями, вобщем выбираешь сама:

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

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

насчет травы кисточкой,меня интересует-2 вещи:
-как ее нарисовать тупо на квадратной плоскости?дальше я разберусь..
-и будет ли это трава быстро просчитываться. или вообще все это не имеет смысла..

Всех приветствую! В данной статье, хочу познакомить вас с такой замечательной программой как E-on Vue.
Данная программа применяется практически везде, где необходимо создать природное окружение: кино, реклама, архитектурная визуализация.
Послужной список программы в киноиндустрии весьма внушительный: Аватар, Индиана Джонс 4, Пираты Карибского моря, Терминатор 4 и т.д.

Работая с природным окружением в 3ds Max, я столкнулся с рядом сложностей, которые меня как художника ограничивали и отнимали много времени на решение тех или иных технических задач.

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

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

Третья проблема - добавление в сцену массивов растительности. Думаю многие знают, что рендер большого количество растительности для 3ds max проблематичен без использования сторонних плагинов. Я уже не говорю про анимацию ветра и роста растений.

И это далеко не все моменты, с которыми можно столкнуться в работе при создании природного окружения. Безусловно, сторонние модули от разработчиков помогают решить часть задач, но каждый модуль - это новый инструмент, который нужно тестировать на совместимость и удобство в работе. В итоге мы теряем много времени на подбор нужного инструмента, не догадываясь, что все эти решения уже собраны в такой замечательной программе как E-on Vue, что самое интересное c возможностью интеграции в Autodesk 3ds Max и Maya, да еще с поддержкой рендеров VRay и Mental Ray.

И так давайте поближе познакомимся с E-on Vue.

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

E-on Vue позволяет 2d художникам с легкостью создавать красивые пейзажи, не имея опыта работы в других 3d пакетах. Безусловно, знание, к примеру, Autodesk 3ds Max в работе с Vue, это большой плюс, так как в Vue нельзя создавать сложные 3d модели (здания, персонажей, технику и т.д.) Но в начале своего творческого пути можно смело использовать библиотечный материал. Выбор библиотечных моделей очень большой и представлен на сайте разработчика.
Что особенно меня порадовало и удивило при первом знакомстве с Vue, так это -
наличие быстрого привью рендера, что значительно ускоряет процесс создания сцены, позволяя практически моментально увидеть результат и при необходимости внести корректировки. Некоторые работы в Vue можно создать просто "на одном дыхании" не вникая в сложные технические моменты как в других 3d программах.

Ниже коротко я расскажу про основные инструменты E-on Vue.

1. Terrain Editor.
Удобный редактор, при помощи которого можно создать практически любой рельеф местности с использованием инструментов 2d и 3d скульптинга. В данном редакторе можно добавлять эффекты эрозии почвы, лунные кратеры, трещины и т.д. Все эти эффекты могут иметь свой собственный материал.
При необходимости в редактор можно импортировать карту высот реальной местности из других программ. Можно комбинировать в редакторе уже имеющийся рельеф и импортированный. Имеются преднастроенные кисти для скульптинга. Большой набор настроек позволяет создавать свои собственные кисти. Безусловно, это не ZBrush, но для создания рельефа инструменты скульптинга очень удобные.

2. Material Editor.
Редактор материалов, наверно, один из самых интересных инструментов Vue.
В Vue можно создавать очень сложные материалы: для скал и камней с настройками рельефа, материалы для облаков, стекла и объектов с подповерхностным рассеиванием и т.д. В редакторе материалов можно настраивать типы маппинга для объектов, быстро и удобно настраивать масштаб материалов. Многие настройки можно тонко отредактировать в редакторе функций.

3. Function Editor.
Данный инструмент, работая в связке с редактором материалов и другими инструментами Vue, позволяет решать самые сложные задачи. Редактор функций имеет нодовую систему, которая наглядна и очень удобна при работе с материалами. Весьма внушительный набор функций делает этот инструмент практически незаменимым в работе с Vue.
Редактировать можно практически любые параметры, задавая нужные ограничения. Так же есть возможность "публикации" параметров в редактор материалов. Очень удобное решение для создания собственных материалов, позволяет быстро получать доступ к основным настройкам материала.

4. EcoSystem.
Данный модуль создан специально для добавления в сцену большого количества объектов, а именно растительности и камней. Однако, в экосистему можно импортировать любой объект созданный в вашем любимом 3d редакторе.
Работая в связке с редактором материалов, экосистема позволяет рассаживать растительность с особой реалистичностью с учетом высот вашего ландшафта и с заданием параметров плотности. Объекты могут появляться на определенной вами высоте, при необходимости с ограничениями относительно склонов рельефа. Так как экосистема обычно создается для выбранного материала, можно пользоваться всеми преимуществами редактора материалов, добавляя один слой за другим, добиваясь еще большей реалистичности. Тут стоит отметить возможность реагирования между собой слоев экосистемы, возможность "притягивания" и "отталкивания" объектов экосистемы. Примером может служить опавшая листва деревьев, которая скапливается на земле под деревьями.
В зависимости от задачи, дополнительно можно воспользоваться EcoSystem Painter и вручную добавлять или удалять объекты экосистемы там, где это необходимо.

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

6. Animation Wizard.
Позволяет создать анимацию любых объектов окружения. Помощник анимации позволит выбрать нужную траекторию движения объекта, время движения объекта и при необходимости выбрать дополнительные параметры (дрожание объекта, разворот и т.д.).
Для ручной анимации можно воспользоваться созданием ключей на временной шкале.
Даже начинающий специалист в Vue с легкостью сможет создать простую анимацию - облет камеры над созданной сценой. В Vue практически все параметры материалов и объектов могут анимироваться, что позволяет добиваться особой реалистичности в анимационных сценах. Просчитать красивую анимацию с движением облаков не представляет особых сложностей, для этого нужно задать направление движения облаков, скорость движения и скорость изменения параметров.

Отдельно стоит отметить настройки рендера в Vue. Просчитать картинку в весьма хорошем качестве, можно не вникая в технические моменты. Для этого есть специальные преднастройки: визуализация в тестовом режиме, среднем качестве, для анимации и с ультра настройками, для высокой детализации. Это особенно полезно для новичков, высвобождает время для творчества. Как бы попытка создать кнопку "сделать красиво".
При необходимости можно использовать режим для точного редактирования всех параметров рендера.

Возможно, тут возникнет вопрос - Почему попытка создать кнопку "сделать красиво"? Попытка потому, что если на каждую сцену ставить ультра качество, то мы теряем в скорости рендера, возможно данная сцена и не требует таких высоких параметров.
Опытные 3d художники знают, что каждая сцена индивидуальна и требует тонких настроек, особенно это касается анимации.
Рендер в Vue не отличается большой скоростью, но в умелых руках можно добиться желаемой скорости. Думаю, большим плюсом являются возможности xStream версии. Визуализация сцены Vue, к примеру с использованием рендера VRay, позволяет добиться весьма хороших результатов скорости рендера. Особенно будет полезно при создании архитектурных сцен с природным окружением.

В прошлом году E-onsoftware разработали интересный инструмент Plant Factory, это отдельная программа, при помощи которой можно создавать растительность для Vue с возможностью анимации созданных моделей. С данной программой художники получили еще больше возможностей для творчества, ведь теперь можно создать свою собственную библиотеку растений. Процесс создание растительности стал интересным и увлекательным, однако требует определенной сноровки.

О программе E-on Vue можно говорить много, в данном материале я представил лишь краткий обзор некоторых функций.
Более подробно с этой замечательной программой можно познакомиться на моем курсе: "E-on Vue. Базовый". На курсе мы будем подробно рассматривать большинство функций программы. Вы получите базовые знания, которые станут отличным инструментом для создания новых шедевров.
Для тех, кто решил познакомиться с Vue, разработчики создали специальные бесплатные версии для персонального использования и обучения. Вы свободно можете скачать с официального сайта пробную версию с ограничением использования в 30 дней или использовать PLE (студенческую) версию Vue, которая имеет весь набор инструментов. Ее можно использовать для обучения на курсе, версия без временных ограничений.

В оформлении статьи использован графический материал из курса "E-on Vue. Базовый".

В материале, перевод которого мы сегодня публикуем, речь пойдёт о том, как создать типографскую сетку для дизайн-системы с использованием render-функций Vue. Вот демонстрационная версия проекта, который мы будем здесь рассматривать. Здесь можно найти его код. Автор этого материала говорит, что использовал render-функции из-за того, что они позволяют гораздо точнее контролировать процесс создания HTML-кода, чем обычные шаблоны Vue. Однако, к своему удивлению, он не смог найти практических примеров их применения. Ему попадались лишь учебные руководства. Он надеется на то, что этот материал изменит ситуацию в лучшую сторону благодаря тому, что здесь приводится практический пример использования render-функций Vue.


Render-функции Vue

Render-функции всегда казались мне чем-то таким, что немного несвойственно Vue. Всё в этом фреймворке подчёркивает стремление к простоте и к разделению обязанностей различных сущностей. А вот render-функции представляют собой странную смесь из HTML и JavaScript, которую часто сложно бывает читать.

Например, вот HTML-разметка:


Для её формирования нужна следующая функция:


Подозреваю, что такие конструкции заставят многих сразу же отвернуться от render-функций. Ведь простота использования — это именно то, что привлекает разработчиков в Vue. Жаль, если за неприглядной внешностью render-функций многие не увидят их истинных достоинств. Всё дело в том, что render-функции и функциональные компоненты — это интересные и мощные инструменты. Я, для того, чтобы продемонстрировать их возможности и их истинную ценность, расскажу о том, как они помогли мне решить реальную задачу.

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

Определение критериев для дизайн-системы

У нас имеется дизайн-система, основанная на VuePress. Нам понадобилось включить в неё новую страницу, демонстрирующую различные типографские возможности оформления текстов. Вот как выглядел макет, который дал мне дизайнер.


Макет страницы

А вот пример соответствующего этой странице CSS-кода:


Заголовки форматируются на основе имён тегов. Для форматирования других элементов используются имена классов. Кроме того, тут предусмотрены отдельные классы для насыщенности и размеров шрифтов.

Я, прежде чем приступать к написанию кода, сформулировал некоторые правила:

  • Так как основная цель этой страницы — визуализация данных — данные должны храниться в отдельном файле.
  • Для форматирования заголовков должны использоваться семантические теги заголовков (то есть — <h1> , <h2> и так далее), их форматирование не должно быть основано на классе.
  • В теле страницы должны использоваться теги абзацев ( <p> ) с именами классов (например — <p > ).
  • Материалы, состоящие из различных элементов, должны быть сгруппированы путём оборачивая их в корневой тег <p> , или в другой подходящий корневой элемент, которому не назначен класс стилизации. Дочерние элементы должны быть обёрнуты в тег <span> , в котором задаётся имя класса. Вот как может выглядеть применение этого правила:

Варианты решения задачи

Я, прежде чем приступить к работе, рассмотрел несколько вариантов решения поставленной передо мной задачи. Вот их обзор.

▍Ручное написание HTML-кода

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

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

▍Использование традиционных шаблонов Vue

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


Пример использования шаблонов Vue

В первой колонке тут имеется следующее:

  • Тег <h1> , который представлен в том виде, в каком его выводит браузер.
  • Тег <p> , группирующий несколько дочерних элементов <span> с текстом. Каждому из этих элементов назначен класс (но самому тегу <p> особого класса не назначено).
  • Тег <p> , не имеющий вложенных элементов <span> , которому назначен класс.

▍Render-функции

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

Модель данных

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

Каждый JSON-объект в файле представляет собой описание отдельной строки:


Вот HTML-код, который получается после обработки этого объекта:


Теперь рассмотрим более сложный пример. Массивы представляют группы дочерних элементов. Свойства объектов classes , которые сами являются объектами, могут хранить описания классов. Свойство base объекта classes содержит описание классов, общих для всех узлов в ячейке. Каждый класс, присутствующий в свойстве variants , применяется к отдельному элементу в группе.


Этот объект превращается в следующий HTML-код:

Базовая структура проекта

У нас имеется родительский компонент TypographyTable.vue , который содержит разметку для формирования таблицы. Также у нас есть дочерний компонент, TypographyRow.vue , который ответственен за создание строки таблицы и содержит нашу render-функцию.

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


Тут хотелось бы отметить одну приятную мелочь: типографские данные в экземпляре Vue могут быть представлены в виде свойства. Обращаться к ним можно с помощью конструкции $options.typographyData так как они не меняются и не должны быть реактивными (благодарю Антона Косых).

Создание функционального компонента

Компонент TypographyRow , который обрабатывает данные, представляет собой функциональный компонент. Функциональные компоненты — это сущности, не имеющие состояний и экземпляров. Это означает, что у них нет this , и то, что у них нет доступа к методам жизненного цикла компонентов Vue.

Вот «скелет» подобного компонента, с которого мы начнём работу над нашим компонентом:


Метод компонента render принимает аргумент context , у которого есть свойство props . Это свойство подвергается деструктурированию и используется как второй аргумент.

Первым аргументом является createElement . Это — функция, которая сообщает Vue о том, какой узел нужно создать. Ради краткости и стандартизации кода я использую для createElement сокращение h . О том, почему я так поступил, можете почитать здесь.

Итак, h принимает три аргумента:

  1. HTML-тег (например — div ).
  2. Объект с данными, содержащий атрибуты шаблона (например — < class: 'something'>).
  3. Текстовые строки (если мы просто добавляем текст) или дочерние узлы, созданные с использованием h .


Подведём краткие итоги по тому, что мы уже создали. А именно, сейчас у нас есть следующее:

  1. Файл с данными, которые планируется использовать при формировании страницы.
  2. Обычный компонент Vue, в котором выполняется импорт файла данных.
  3. Каркас функционального компонента, который ответственен за вывод строк таблицы.
  1. Трансформировать данные в стандартизированный формат.
  2. Вывести трансформированные данные.

Трансформация данных

Мне хотелось, чтобы мои данные были бы представлены в формате, который соответствовал бы аргументам, принимаемым h . Но, прежде чем их преобразовывать, я спланировал то, какую структуру они должны иметь в JSON-файле:


Каждый объект представляет собой одну ячейку таблицы. Каждую строку таблицы формируют четыре ячейки (они собраны в массив):


Посмотрим ещё раз на макет.


Макет страницы

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


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

  • Функция createNode принимает каждое из интересующих нас свойств в виде аргумента.
  • Функция createCell играет роль обёртки вокруг createNode , с её помощью мы проверяем, является ли аргумент text массивом. Если это так — мы создаём массив дочерних элементов.

Теперь мы можем поступить примерно так:


При формировании третьего и четвёртого столбцов мы передаём properties и usage в виде текстовых аргументов. Однако второй столбец от третьего и четвёртого отличается. Тут мы выводим имена классов, которые, в исходных данных, хранятся в таком виде:


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

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


Теперь мы можем сделать следующее:

Трансформация данных, используемых для демонстрации стилей

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


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


Теперь данные строк приведены к нормализованному формату и их можно передать render-функции:

Рендеринг данных

Вот как выполняется рендеринг данных, которые выводятся на страницу:


Теперь всё готово! Вот, снова, исходный код.

Итоги

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

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

Стоит ли полученный результат затраченных усилий? Я так думаю, что тут надо смотреть по обстоятельствам. Это, впрочем, весьма характерно для программирования. Хочу сказать, что у меня в голове, в процессе работы над этим проектом, постоянно появлялась следующая картинка.


Возможно, это и есть ответ на мой вопрос о том, стоит ли этот проект усилий, затраченных на его разработку.

alt

Уникальность программ для 3D моделирования в том, что они позволяют создать нечто несуществующее. А существующее позволяют воссоздать, не поднимаясь с рабочего места. Но только лишь моделированием объектов современные программы не ограничиваются. Уже давно существует возможность создавать изображение объекта с помощью рендеринга. Говоря очень грубо, это аналог фотографии, сделанной прямо в программе моделирования. Благодаря системам рендеринга можно, например, превратить набор объектов в полноценный интерьер.

1. Выбираем рендер

Это статья не про то, какую программу для рендера вам выбрать. Но скажу так: наиболее популярны в архитектурной визуализации VRay и Corona Renderer. Vray более гибкий в настройках, где-то быстрее работает. Corona Renderer дает отличное качество при минимальной настройке и более интуитивна. Обе эти программы необходимо сначала установить. В 3ds Max они устанавливаются как плагины. Однако программа имеет и встроенные пакеты для рендеринга.

Для того, чтобы начать пользоваться новым программным обеспечением нужно открыть окно Render Setup. Это можно сделать кнопкой в Main Toolbar (ссылка на статью Разбор кнопок панели Main Toolbar), с помощью Rendering – Render Setup или горячей клавишей «F10». В выпадающем списке Renderer как раз и выбирается нужная программа.

Render Setup

Чтобы не приходилось выбирать каждый раз заново, опуститесь в самый низ окна и откройте Assign Renderer – «…» – Ваш рендер – OK. В списке не отображается тот рендер, который стоял в окне Production до выбора. Замок рядом с Material Editor означает, что для редактора материалов будет выбрана та же программа, что и для визуализации. ActiveShade можно оставить без изменений. Нажимаем Save as Default.

Assign Renderer

Таким же образом можно менять системы рендеринга между собой.

2. Преднастройка рендерера

Меню Target предлагает на выбор 5 типов рендеринга:

  1. Production – полноценный финальный рендер со всеми настройками
  2. Iterative – игнорирует некоторые настройки для быстрого рендера – наброска.
  3. ActiveShade – в какой-то мере это интерактивный рендер. Но у него есть более серьезные аналоги, встроенные в Corona и Vray.
  4. A360 Cloud – рендеринг в сервисе облачной визуализации. К сожалению, этот сервис имеет много ограничений.
  5. Network rendering - позволяет рендерить на нескольких компьютерах, объединенных в сеть.

Мы же будем использовать Production mode.

Свиток Preset позволяет создавать, загружать и использовать готовые настройки рендера, сохраненные ранее.

Большая кнопка Render запустит расчет сцены.

Перед началом рендеринга обязательно нужно создать поверхность (пол) и источник света!

Галочка Save File позволяет автоматически сохранить картинку после рендеринга. Ниже есть меню Render Output, где можно задать место сохранения файла, создать список сохраненных файлов или выводить на стороннее устройство.

Save File

View to Render позволяет выбрать, какое из окон с проекциями нужно рендерить. Но при переходе из одного в другое меняется и область рендеринга. Для этого воспользуйтесь замком рядом. Он заблокирует переключения между окнами.

3. Настройки раздела Common

Это окно одинаково для всех программ рендеринга и содержит самые базовые настройки.

Time Output позволяет выбрать, сколько и какие кадры будут рендериться. Это скорее нужно для анимации или визуализации каких-то анимированных объектов.

Я приведу в пример 2 картинки, которые являются 0 и 25 кадром. Сохранились они автоматически с помощью функции Save File.

Time output

Area to Render позволяет рендерить не только то, что попадает в вид рабочей области, но и отдельные объекты, регионы и прочее.

Area to Render

Output Size устанавливает размеры итоговой картинки в пикселях. Width и Height отвечают за число пикселей по ширине и высоте. Image Aspect равняется отношению ширины к высоте. Если поставить рядом с этим значением замок, то оба параметра разрешения будут меняться вместе, сохраняя отношение. Pixel Aspect определяет соотношение сторон пикселя. Его изменение влияет на разрешение, не учитывая Image Aspect. В свитке можно выбрать множество заранее настроенных разрешений.

Output Size

Options позволяет быстро включать и отключать отображение разных эффектов:

  • Atmospherics – отображает атмосферные эффекты;
  • Effects – отображает используемые эффекты;
  • Displacement – отображает действие карт смещения;
  • Video Color Check – включает контроль цветовой интенсивности по стандартам PAL и NTSC;
  • Render to Fields – устанавливает режим полукадровой визуализации;
  • Render Hidden Geometry – отображает скрытые объекты;
  • Area Lights/Shadows as Points – изменяет визуализацию пространственных источников света и теней на точечные;
  • Force 2-Sided – включает визуализацию поверхностей с двух сторон, уменьшая скорость рендеринга;
  • Super Black – включает режим суперчерного цвета, который применяется для создания видеоизображений.

Options

Use Advanced Lighting включает визуализацию непрямого освещения. Compute Advanced Lighting when Required позволяет пересчитать непрямое освещение. Это нужно при изменении геометрии сцены во время анимации.

Email Notifications – позволяет отправлять письмо на email по окончании рендеринга.

Scripts – дает возможность добавлять сценарии действий до и после визуализации.

Email Notifications и Scripts

Большая часть остальных меню будет зависеть от программы для рендера. Поэтому разбираться в них нужно конкретно при использовании какого-либо пакета. Но даже без этого программы будут визуализировать сцену. Если у вас стоит Corona Renderer, то можете расставить источники света и просто нажать на большую кнопку Render.

Читайте также: