3D Engineering

...Лучшее из общего.

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Сегодня у нас в гостях замечательный 2D художник–оформитель Алексей Апарин

Сегодня у нас в гостях замечательный 2D художник–оформитель - Алексей Апарин. В этом интервью мы поговорим с Алексеем о его творческой жизни, карьере, о том в каких сферах Алексей применял свой талант и чего достиг.


3dgo.ru: Добрый день, Алексей. Расскажите нам немного о себе, где учились, кем работаете?

Алексей Апарин: Здравствуйте. Родился, живу и работаю в Москве. Мне 29 лет. Женат и недавно стал отцом. Люблю исторические романы, хорошее аниме, industrial, боулинг и cooperative mode на xbox360.
Закончил худграф МПГУ по специальности учитель изобразительного искусства. Кандидат наук. Сейчас работаю художником-оформителем над браузерной mmorpg “war.ru”.

 

3dgo.ru: Как и когда началось увлечение искусством? как пришли в CG?

Алексей Апарин: Помню, что впервые мне захотелось стать художником в возрасте семи лет. Ещё в то время я почему-то хотел танцевать степ, когда вырасту, но если это желание  осталось фантазией, то стремление рисовать усиливалось. Изостудия, художка, худграф –распространённая траектория, рад что она не привела меня, например, в торговлю или рекламу, как случилось со многими моими товарищами. После учёбы я долго работал web-дизайнером, причём  у нас были планшеты, редкие тогда. Конечно, в свободное время рисовал, так и втянулся в CG.

 

3dgo.ru: Есть ощущение что в поисках творческого направления деятельности вы пробовали себя и в преподавательской деятельности и в Web дизайне и работали художником иллюстратором. Что все-таки оказалось Вам ближе всего? Остановитесь ли Вы на этом или же есть мысли или цели испытать свои силы и возможности еще где то?

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

 

3dgo.ru: На сколько нам известно Вы работаете художником-иллюстратором в компании "Акелла". Много ли сил и времени отнимает работа и остается ли время на свободное творчество?

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

 

3dgo.ru: Ваши работы давно не появлялись в галерее 3dgo.ru. С чем это связано?

Алексей Апарин: Дело в том, что я очень не люблю тиражировать свои работы, массово развешивая одно и тоже по разным галереям. Поэтому я, прежде всего, публикую свои рисунки в ЖЖ (чтобы получить отзывы от друзей), затем с большой задержкой на своём сайте, а потом нередко торжествует лень, и работа мне уже не кажется новой. В таком поведении не много смысла, безусловно, надо возвращаться на render . К слову, именно сайту 3dgo.ru я обязан тем, что меня заметили и пригласили работать иллюстратором в Акеллу, получить работу художника, к которой я стремился. Спасибо вам, что вы есть!

 

3dgo.ru: Все Ваши картины получаются очень интересными, сюжетными. Расскажите, как рождаются такие интересные идеи? Что Вас вдохновляет?

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

3dgo.ru: Также нельзя не обратить внимание на очень богатую цветовую палитру в Ваших работах. Как Вы приходите к таким насыщенным цветовым решениям? Сразу ли Вы видите в какой цветовой гамме будет создаваться картина или приходиться экспериментировать?

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

 

3dgo.ru: Какой для вас самый сложный и самый важный этап при создании работы?

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

 

3dgo.ru: Какие задачи особенно помогли в совершенствовании профессионализма?

Алексей Апарин: Очень важно участие в конкурсах (задача - победить) как часть обучения — польза от таких предприятий чувствуется чрезвычайно отчётливо.
Большое число заказов со сжатыми сроками тоже здорово сказалось на появлении уверенности в неминуемом достижении результата – спокойствие отлично помогает сосредоточиться на работе.

 
3dgo.ru: Какую из ваших работ Вы считаете самой сложной, которую Вы бы выделили среди всех?

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

 

3dgo.ru: Есть ли у Вас любимый художник, произведения которого Вас восхищают и, возможно, вдохновляют?

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

 

3dgo.ru: Любимая программа? Чего не хватает в программном обеспечении, которым Вы пользуетесь сегодня?

Алексей Апарин: Painter и Photoshop одинаково важны в моей работе, и буду страдать, если придётся выбирать между ними. Этот софт и так обладает большими возможностями, чем мне реально требуется, так что всего в нём хватает. Однако, я был бы рад гибриду Painter и Photoshop – одновременное использование обеих программ отнимает время и расходует оперативную память.

 

3dgo.ru: Имея профессиональный опыт в преподавательской деятельности в области изобразительного искусства, какое напутствие Вы можете дать начинающим 2D художникам?

Алексей Апарин: Постарайтесь обязательно «повариться» в художественном образовании. Но если «вышка» не художественная и уже за плечами, то подойдут и какие-нибудь курсы. Надо стремиться в творческую среду – в лучшем случае, чтобы окружающие люди рисовали, будь то учебная студия или офис.
Очень важно чтобы были товарищи-художники, которые без лишних ужимок скажут всю правду о ваших художествах. Случайные люди (я имею в виду обсуждение на различных форумах) на эту роль не годятся, т.е. их авторитет не бесспорен, в них можно сомневаться и обижаться на них. Показывать своим избранным критикам работу лучше начиная с ранних этапов, не дожидаясь полной готовности, добиваться от них предложений по улучшению. Со временем они даже смогут отследить типичные для вас промахи (со стороны виднее), выявят слабые места. А когда цели определены и явно очерчены, их легче достичь.
На своей шкуре оценил, как важно зацепиться за хорошую динамичную и творческую работу на раннем этапе, поэтому больше публикуйтесь в галереях.
Желаю вам удачи!

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

 

Архив статей

 май   Июнь 2019   июл

ВПВСЧПС
   1
  2  3  4  5  6  7  8
  9101112131415
16171819202122
23242526272829
30 
Julianna Willis Technology

Случайная новость

Введение

Этот материал адресуется лицам, использующим или желающим использовать при работе с 3ds Max язык программирования MAXSript.
В параметрической модели имеется взаимосвязь параметров ее различных компонентов. В такой модели изменение значения одного параметра влечет изменения значений связанных с ним параметров модели. Подобные модели широко применяются в САПР. Примером такой модели в 3ds Max может служить объект Biped (двуногий).
3ds Max позволяет создавать параметрические модели посредством связывания параметров, употребления соответствующих контроллеров и модификаторов (преимущественно параметрических), а также за счет создания соответствующего MAXSript-кода, обеспечивающего пересчет модели при изменении значения управляющего параметра.
Рассмотрим параметрическую модель (рис. 1, а), в которой реализуются следующие зависимости:

R = abs(0.25 * H);

spherePosition = conePosition + [0, 0, 1.25 * H],

где
R – радиус сферы;
H – высота конуса;
spherePosition – позиция сферы (координаты ее центра);
conePosition – позиция конуса (координаты центра его основания).

а б

Рис. 1. Параметризованная модель: а – H = 50; б – H = -50

Рассматриваемую модель можно реализовать в 3ds Max несколькими способами. Приведем два из них. В первом употребим контроллеры Float Expression и Position Expression для формирования соответственно первой и второй зависимостей, а во втором – контроллеры Float Script и Position Script.
Создание модели и ее параметризацию средствами контроллеров Float Expression и Position Expression обеспечит следующий код:

delete $*
h = 50
cn = cone radius1:20 radius2:0 height:70 heightSegs:20 sides:24 wireColor:[6, 135, 113]
sph = sphere radius:(0.25 * cn.Height) segs:32 wireColor: [135, 110, 8]
sph.Pos = cn.Pos + [0, 0, 1.25 * cn.Height]
cn.Height.Controller = bezier_float()
fltX = float_expression()
fltX.AddScalarTarget "h" cn.Height.Controller
fltX.SetExpression "abs(0.25 * h)"
sph.Radius.Controller = fltX
--
pstnX = position_expression()
pstnX.AddScalarTarget "h" cn.Height.Controller
pstnX.AddVectorTarget "ps" cn.Position.Controller
pstnX.SetExpression "ps + [0, 0, 1.25 * h]"
sph.Position.Controller = pstnX
animate on (
at time 0f (cn.Height = h; cn.Pos = [0, 0, 0])
at time 50f (cn.Height = -h; cn.Pos = [0, 0, h])
at time 100f (cn.Height = h; cn.Pos = [0, 0, 0])
)
playAnimation()

Порядок действий следующий:

  1. Сцена очищается, и создаются объекты конус и сфера с именами cn и sph соответственно.
  2. После создания контроллера fltX (применяется конструктор float_expression) в контроллере создается скалярная переменная h, зависящая от высоты конуса (метод AddScalarTarget): значение переменной h будет равняться высоте конуса. Предварительно этому параметру (высоте конуса) назначается контроллер Bezier Float, ссылка на который используется в качестве второго параметра метода AddScalarTarget.
  3. Далее задается выражение (метод SetExpression), результат которого возвращает контроллер fltX.
  4. Параметру сферы Radius назначается контроллер fltX.

Теперь изменение высоты конуса, например на вкладке Modify после выбора конуса, приведет к изменению радиуса сферы.
Для управления позицией сферы используется контроллер Position Expression, программируемый в следующем порядке:

  1. После создания контроллера pstnX (применяется конструктор position_expression) в контроллере создаются скалярная переменная h, зависящая от высоты конуса (метод AddScalarTarget), и векторная переменная ps, зависящая от позиции конуса (метод AddVectorTarget). Как и в случае метода AddScalarTarget, вторым параметром метода AddVectorTarget также является ссылка на контроллер (cn.Position.Controller). Значение переменной ps после установления такой связи будет равно значению позиции конуса (величина типа Point3).
  2. Далее задается выражение (метод SetExpression), результат которого возвращает контроллер pstnX.
  3. Свойству сферы Position назначается контроллер pstnX.

Наличие такого контроллера обеспечит надлежащее перемещение сферы при изменении позиции конуса.
Для демонстрации результата в точках 0f, 50f и 100f временной шкалы создаются ключи анимации высоты и позиции конуса.
После запуска программы можно открыть диалог настройки контроллера, например Float Expression (рис. 2), выполнив следующие действия: выбрать примитив Sphere – меню Graph Editors – Track View – Curve Editor – ветвь Objects – Sphere01 – Sphere (Object) – Radius – двойной удар мышью.

Рис. 2. Диалог настройки контроллера Float Expression

Порядок запуска MAXScript-кода в 3ds Max описан ниже.
Вторая реализация рассматриваемой модели, основанная на контроллерах Float Script и Position Script, поддерживается следующим кодом:

delete $*
h = 50
cn = cone radius1:20 radius2:0 height:70 heightSegs:20 sides:24 wireColor:clr
sph = sphere radius:(0.25 * cn.Height) segs:32 wireColor:clr2
sph.Pos = cn.Pos + [0, 0, 1.25 * cn.Height]
fltS = float_script()
fltS.AddNode "cn2" cn
fltS.Script = "abs(0.25 * cn2.Height)"
sph.Radius.Controller = fltS
--
psS = position_script()
psS.AddNode "cn2" cn
psS.Script = "cn2.Pos + [0, 0, 1.25 * cn2.Height]"
sph.Position.Controller = psS
animate on (
at time 0f (cn.Height = h; cn.Pos = [0, 0, 0])
at time 50f (cn.Height = -h; cn.Pos = [0, 0, h])
at time 100f (cn.Height = h; cn.Pos = [0, 0, 0])
)
playAnimation()

В обоих контроллерах определяется переменная cn2 (метод AddNode), хранящая ссылку на объект конус. Это обеспечивает доступ к свойствам конуса, что и используется соответствующим образом в Script-выражениях контроллеров (свойство Script).
С другими возможностями программного управления моделями 3ds Max можно познакомиться, обратившись, например, к приведенным в конце урока источникам.
Рассмотренную модель можно, разумеется, реализовать интерактивно, без применения MAXScript. Следующая модель такой альтернативы не имеет.

Описание модели стула

В рассматриваемом примере регулируемым параметром является радиус скруглений R между отдельными компонентами модели стула. Изменение радиуса влечет изменение высоты ножек стула, размеров его сиденья и спинки (рис.3).

а б

Рис. 3. Параметризованный стул: а - R = 5; б - R = 15

Модель имеет следующие характеристики:

  1. Радиус всех скруглений одинаков и изменяется с шагом 1 в диапазоне 5 – 15 единиц.
  2. При пересчете модели сохраняются габариты стула, хранимые глобальными переменными wX, wY и wZ, а также размеры и положение задних ножек стула.
  3. Каркас стула воспроизводится цилиндрами и дугами (примитивы Cylinder и Arc); последние используются для отображения скруглений.
  4. Сиденье и списка стула отображаются посредством примитива Plane (плоскость).
  5. Сиденье отстоит от основания стула на 0.5 * wZ.

MAXScript-реализация модели стула

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

global rlFlt
global clr = [6, 135, 113], clr2 = [135, 110, 8]
global wX = 60.0, wY = 45.0, wZ = 120.0
global arrC = #(), arrRc = #()
--
fn Prps = (
 delete $*
 units.DisplayType = #Generic
 units.SystemType = #Inches
 viewport.SetLayout #layout_4
 viewport.ActiveViewport = 4
 max vpt persp user
 viewport.SetGridVisibility 4 false
 max tool zoomExtents
 backgroundColor = color 200 200 200
)
--
fn fndPs R wX wY wZ &arrPs = (
 x = 0.5 * wX
 y = 0.5 * wY
 vY = [0, wY, 0]
 wZ2 = 0.5 * wZ
 p1 = [-x, -y, 0]; p2 = p1 + vY
 p3 = [x, -y, 0]; p4 = p3 + vY
 p5 = [0, -y, wZ2]; p6 = p5 + vY
 p7 = [x, -y, 0.75 * wZ]; p8 = p7 + vY
 p9 = [x + 2 * R, 0, wZ]
 p10 = [-x, -y, wZ2 - R]
 p11 = [x, -y, wZ2 + R]
 arrPs = #(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)
 for k = 1 to 2 do arrC[k].Height = wZ2 - R
 for k = 5 to 6 do arrC[k].Height = wX - 2 * R
 for k = 7 to 8 do arrC[k].Height = wZ2 - 2 * R
 arrC[9].Height = wY - 2 * R
)
--
fn fndPs2 R wX wY wZ &arrPs2 = (
 x = 0.5 * wX
 y = 0.5 * wY
 vY = [0, wY, 0]
 wZ2 = wZ / 2
 pc1 = [-x + R, -y, wZ2 - R]; pc2 = pc1 + vY
 pc3 = [x - R, -y, wZ2 + R]; pc4 = pc3 + vY
 pc5 = [x + R, -y, wZ - R]; pc6 = pc5 + vY
 pc7 = [x + R, -y + R, wZ]; pc8 = pc7 + [0, wY - 2 * R, 0]
 arrPs2 = #(pc1, pc2, pc3, pc4, pc5, pc6, pc7, pc8)
)
--
fn mkChr R wX wY wZ = (
 Prps()
 arrC = for k = 1 to 11 collect cylinder wireColor:clr2 radius:2
 arrPs = #()
 arrPs2 = #()
 fndPs R wX wY wZ &arrPs
 fndPs2 R wX wY wZ &arrPs2
 arrC[3].Height = arrC[4].Height = sqrt ((0.5 * wX)^2 + (0.5 * wZ)^2)
 for k = 10 to 11 do arrC[k].Height = wY
 for k = 5 to 9 do arrC[k].Pivot = [0, 0, 0.5 * arrC[k].Height]
 for k = 1 to 11 do arrC[k].Pos = arrPs[k]
 for k = 3 to 4 do rotate arrC[k] -(atan (1.0 * wX / wZ)) [0, 1, 0]
 for k = 5 to 6 do rotate arrC[k] 90 [0, 1, 0]
 for k = 9 to 11 do rotate arrC[k] -90 [1, 0, 0]
 rc = arc radius:R from:0 to:90 pie:off reverse:off pos:[0, 0, 0] \
  rotation:(quat -0.5 0.5 -0.5 -0.5) wireColor:clr2 \
  render_renderable:on render_displayRenderMesh:on render_useViewportSettings:off \
  render_mapcoords:on render_displayRenderSettings:off render_viewport_thickness:4.0 \
  render_thickness:4.0
 arrRc = for k = 1 to 7 collect copy rc
 arrRc.WireColor = clr2
 arrRc[6].Rotation = quat 0 0 -0.707107 0.707107
 arrRc[7].Rotation = quat 0 0 0 1
 insertItem rc arrRc 1
 arrNg = #(0, 0, 180, 180, 0, 0, 0, 0)
 for k = 1 to 8 do (
  rotate arrRc[k] arrNg[k] [0, 1, 0]
  arrRc[k].Pos = arrPs2[k]
 )
 max tool zoomExtents
 global pln = plane length:wY width:(wX - R) lengthSegs:1 widthSegs:1 \
  pos:[0, 0, wZ / 2] wireColor:clr
 p = arrPs[7]; p[2] = 0
 global pln2 = plane length:wY width:(wZ / 2 - 2 * R) lengthSegs:1 widthSegs:1 \
  pos:p wireColor:clr
 rotate pln2 -90 [0, 1, 0]
)
--
fn chgChr R wX wY wZ = (
 for k = 1 to 2 do arrC[k].Height = 0.5 * wZ - R
 for k = 5 to 6 do arrC[k].Scale = [1, 1, (wX - 2 * R) / arrC[5].Height]
 for k = 7 to 8 do arrC[k].Scale = [1, 1, (0.5 * wZ - 2 * R) / arrC[7].Height]
 arrC[9].Scale = [1, 1, (wY - 2 * R) / arrC[9].Height]
 arrC[9].Pos = [0.5 * wX + 2 * R, 0, wZ]
 arrC[10].Pos = [-0.5 * wX, -0.5 * wY, 0.5 * wZ - R]
 arrC[11].Pos = [0.5 * wX, -0.5 * wY, 0.5 * wZ + R]
 arrPs2 = #()
 fndPs2 R wX wY wZ &arrPs2
 for k = 1 to 8 do arrRc[k].Pos = arrPs2[k]
 arrRc.Radius = R
 pln.Width = wX - 2 * R
 pln2.Width = 0.5 * wZ - 2 * R
)
--
rollout rChr "Chair" width:120 height:100 (
 spinner spnR "R " pos:[15,5] width:100 height:20 range:[5,15,1] type:#integer
 colorPicker theClr "Color " pos:[15,30] width:100 height:20 color:clr modal:true
 button btnNmt "Animation" pos:[15,55] width:100 height:20 toolTip:"Play animation"
 button btnCls "Close" pos:[15,80] width:100 height:20 toolTip:"Close Dialog"
 on spnR changed val do chgChr val wX wY wZ
 on theClr changed newClr do (
  clr = newClr
  pln.WireColor = newClr
  pln2.WireColor = newClr
 )
 on btnNmt pressed do (
  animationRange = interval 0f 100f
  timeConfiguration.PlaybackLoop = false
  with redraw off (
   animate on (
    at time 0f chgChr spnR.Range[1] wX wY wZ
    at time 50f chgChr spnR.Range[2] wX wY wZ
    at time 100f chgChr 10 wX wY wZ
   )
  )
  max tool zoomExtents
  playAnimation()
  with redraw off (
   sliderTime = 0f
   chgChr 10 wX wY wZ
  )
  spnR.Value = 10
 )
 on btnCls pressed do closeRolloutFloater rlFlt
)
--
function opnRlFlt = (
 if rlFlt != undefined then closeRolloutFloater rlFlt
 rlFlt = newRolloutFloater "Chair" (rChr.Width + 35) (rChr.Height + 35) 50 50
 addRollout rChr rlFlt rolledUp:false
 rChr.spnR.Value = 10
)
--
mkChr 10 wX wY wZ
opnRlFlt()

Запуск программы

Запуск программы выполняется в 3ds Max в следующем порядке:

  1. Открыть редактор кода (меню MAXScript – MAXScript Editor).
  2. Перейти в открывшийся диалог и при необходимости создать новую вкладку (Ctrl + N).
  3. Скопировать код, приведенный в уроке, в чистую вкладку редактора.
  4. Позиционироваться в любом месте скопированного кода и нажать Ctrl + E, либо воспользоваться меню редактора Tools – Evaluate All.
  5. Употребить появившийся диалог (рис. 4) для управления моделью стула, которая отобразится в сцене непосредственно перед открытием диалога.

Рис. 4. Управляющий диалог Chair

Описание программы

Построение стула обеспечивает функция mkChr, которая принимает в качестве параметров значения радиуса скруглений, длину, ширину и высоту стула – это соответственно параметры R, wX, wY и wZ. Стул состоит из 11 цилиндров (примитив Cylinder), 8 дуг (примитив Arc) и двух плоскостей (примитив Plane). Последние употребляются для отображения сиденья и спинки стула.
Переменные wX, wY и wZ объявлены как глобальные, что позволяет применять их в обработчике on btnNmt pressed управляющего диалога Chair (идентификатор rChr).
Цилиндры хранит массив arrC; номера цилиндров, то есть их индексы в массиве arrC, показаны на рис 5, а.

а б

Рис. 5. Нумерация компонентов модели стула: а – нумерация цилиндров; б – нумерация дуг

Дуги хранятся в массиве arrRc; их индексы в этом массиве показаны на рис. 5, б.
Плоскости для сиденья и спинки имеют в программе соответственно идентификаторы pln и pln2. Эти имена являются глобальными и поэтому доступны в обработчиках диалога Chair.
Перед построением модели функцией Prps удаляются все элементы сцены и устанавливаются требуемые параметры сеанса – это тип единиц измерения, число видовых портов (4), активный видовой порт (4) и его тип (Perspective). Кроме того, в этом видовом порте устраняется изображение сетки и выполняется команда max tool zoomExtents.
Координаты базовых точек цилиндров и дуг вычисляются соответственно функциями fndPs и fndPs2, принимающими вдобавок к параметрам R, wX, wY и wZ соответственно массивы arrPs и arrPs2. В эти массивы названные функции записывают необходимые для построения примитивов координаты их базовых точек. Нумерация базовых точек отвечает показанным на рис. 5 нумерациям цилиндров и дуг.
Параметризация модели обеспечивается функцией chgChr, которая вызывается обработчиком on spnR changed при изменении счетчика R (spinner spnR) диалога Chair. Также эта функция применяется при создании ключей анимации (кнопка Animation диалога Chair).
Функция принимает параметры R, wX, wY и wZ. Параметр R является изменяемым, и его значение берется равным показанию счетчика R диалога. Прочие параметры после запуска программы не изменяются.
Получив новое значение радиуса, функция chgChr:

  • изменяет высоту цилиндров 1 и 2 (свойство Height цилиндра);
  • соответствующим образом масштабирует цилиндры 5 – 9 (свойство Scale цилиндра);
  • изменяет положение цилиндров 9, 10 и 11 (свойство Pos цилиндра), смещая позицию цилиндров 10 и 11 в начало, а цилиндр 9 в конец соответствующих дуг модели;
  • изменяет координаты центра каждой дуги (свойство Pos дуги); для этой цели, как и при создании модели, выполняется обращение к функции fndPs2;
  • изменяет значение радиуса каждой дуги (свойство Radius дуги);
  • модифицирует ширину сиденья и спинки (свойство Width плоскостей pln и pln2).

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

for k = 5 to 9 do arrC[k].Pivot = [0, 0, 0.5 * arrC[k].Height]

Таким образом, функция chgChr обеспечивает получение экземпляра модели, отвечающего принятому функцией значению радиуса скругления R. Все преобразования выполняются исходя из неизменности габаритов стула и положения его сиденья. Единственными неизменяемыми компонентами модели являются цилиндры 3 и 4, отображающие задние ножки стула.
Кроме обработчика on spnR changed, вызываемого при изменении показания счетчика R, диалог Chair (см. рис. 4) содержит обработчики on theClr changed, on btnNmt pressed и on btnCls pressed do, выполняемые соответственно при нажатии на полосу с цветом (элемент colorPicker), на кнопку Animation (элемент button btnNmt) и Close (элемент button btnCls).
Ключи анимации рассчитываются в точках 0f, 50f и 100f временной шкалы после нажатия на кнопку Animation диалога Chair: выполняется обработчик on btnCls pressed do, в котором трижды вызывается функция chgChr. После воспроизведения анимации (метод playAnimation) временная шкала устанавливается в точку 0f и вновь вызывается функция chgChr со значением параметра R, равным 10. Это обеспечивает появление начального образа стула. Это же значение радиуса скругления устанавливается и в счетчике R диалога (spnR.Value = 10).

Заключение

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

  • структуризации модели и сохранения в ней параметров, влияющих на ее геометрию;
  • поиска зависимостей между параметрами;
  • реализации этих зависимостей (как правило, с привлечением MAXScript).

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

Источники

  1. Autodesk® 3ds Max® 2009 MAXScript Reference.
  2. Бартеньев О. В. Программирование модификаторов 3ds Max. Учебно-справочное пособие. – М.:Физматкнига, 2009. – 341 с.
  3. http://100byte.ru/

далее