Наша новая игра 8 сентября в раннем доступе на steam



MAXScript (скрипты): назначаем горячие клавишы на любые операции в 3ds Max

Часто перед CG-художником встаёт проблема оптимизации своего времени при выполнении часто повторяющихся операций.

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

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

То же самое можно проделывать и в Photoshop, правда там еще легче, поскольку ручками писать код не нужно, а просто включаете запись ваших действий, которые, впоследствии, можно помногу раз повторять. Называются такие записанные действия - Actions (экшэнс). Обалденная штука, просто не представляю, как без них можно жить.

Еще легче жизнь становится, когда вы научитесь пользоваться чужими скриптами. Об этом я писал в статье о Soulburn Scripts.

Ладно, сильно отвлекаться не буду.

Итак, возьму такой элементарный пример: допустим вам нужно часто создавать Box.

Вы можете это делать по старинке: найти взглядом закладку Create >> попасть по ней мышкой >> нажать кнопку Geometry >> выбрать из выпадающего списка Standart Primitives >> нажать кнопочку Box >> перейти в нужный вид вьюпорта >> потянуть мышку (для определения ширины и длины бокса), отпустить клавишу, потянуть мышку еще раз (для определения высоты бокса). Фух! Куб создан 🙂

Можно немножко упростить себе жизнь и воспользоваться шикарным скриптом ActiveType, который я анонсил у себя на социальных аккаунтах (подписаться на них можно в правой верхней части сайта, так вы сможете получать 3D вкусности, которые я НЕ публикую у себя на блоге).

А можно очень сильно упростить себе жизнь и создавать такой параллелепипед нажатием всего одной клавиши.

Чтобы это сделать, сначала нам нужно записать тот код (script), который сопутствует созданию Box'а, а далее мы его просто запустим снова.

Чтобы увидеть код, который создаёт бокс, нужно запустить MAXScript Listener из меню MAXScript или клавишей F11.

После запуска MAXScript Listener вы увидите вот такое окно, теперь нужно активировать MacroRecorder (нажать на пункт меню Enable):

Запускаем MAXScript Listener и включаем MacroRecorder

Это позволит видеть все ваши действия в виде maxscript кода в розовой части этого окна. В белой (нижней) части нужно набирать скрипт, который вы хотите выполнять.

После активации MacroRecorder создайте в окне перспективы Box. Как следствие в розовой (верхней) части MAXScript Listener вы увидите приблизительно такой скрипт:

Box lengthsegs:1 widthsegs:1 heightsegs:1 length:60.2059 width:75.5093 height:63.7197 mapcoords:on pos:[-7.19889,-1.62124,0] isSelected:on

На первый взгляд он кажется ну просто адски сложным, но после моих расшифровок вы поймёте, что он просто элементарен 🙂

Первое слово "Box" означает, что вы создаёте примитив Box 😉 Далее идут все параметры, который можно править для бокса:

Параметры бокса

Параметры "lengthsegs, widthsegs, heightsegs" обозначают количество сегментов по длине, ширине, высоте.

Параметры "length, width, height" обозначают длину, ширину и высоту.

Параметр "mapcoords" (который может принимать значение on или off - вкл. или выкл.) - это значение галочки Generate Mapping Coords.

Параметр "pos" - это координаты куба. Т.е. если будет "pos:[0,0,0]", то бокс будет создан в начале координат.

Параметр "isSelected:on" означает, что только что созданный объект будет также выделенным.

Теперь подправьте эту строку как вам угодно (я, к примеру, только поменял координаты и значения размеров):

Box lengthsegs:1 widthsegs:1 heightsegs:1 length:50 width:50 height:50 mapcoords:on pos:[0,0,0] isSelected:on

Скопируйте её, потом вставьте в нижнюю (белую) часть окна MAXScript Listener и нажмите клавишу Enter.

Произойдёт два события:

  1. У вас в центре координат появился куб с размерами 50 на 50 на 50.
  2. В нижней части MAXScript Listener'а появилось сообщение синим цветом, которое означает, что ваша команда успешно выполнена.

Отдавая вам этот синий код, 3ds Max, грубо говоря, возвращает вам параметры вновь созданного объекта:

$Box:Box002 @ [0.000000,0.000000,0.000000]

$ - такой значок ставится перед путём к объекту (путь к объекту в 3ds Max - это тоже самое, что путь к файлу в Windows или путь (адрес) к странице в интернете).

Таким образом, эта синяя строка говорит нам: был создан примитив Box с именем Box002, который размещен в центре координат (т.е. все три координаты положения X, Y, Z нулевые).

Радуемся! 🙂

Теперь пришел черед...

...назначить горячую клавишу этому скрипту.

Создаёте в папке c:\Users\ИМЯ_ВАШЕГО_ЮЗЕРА\AppData\Local\Autodesk\3dsMax\2012 - 64bit\enu\scripts\startup\ (это если у вас тоже Windows 7 и 3ds Max 2012 x64) текстовый файл (не файл Word, а именно текстовый *.txt файл) с названием, к примеру, createBox.txt.

Почему именно в этой папке? Просто в этой папке хранятся все ваши настройки 3ds Max и скрипт из этой папки будет автоматически подгружаться при запуске Макса.

Кстати, ENU - это очень полезная папка, с её помощью можно вылечить очень многие глюки 3d Max.

Открываете этот файлик и вписываете туда следующие строчки:

macroScript createBox
category: "3dyuriki.com"
tooltip: "CreateBoxInWorldCenter"
(
Box lengthsegs:1 widthsegs:1 heightsegs:1 length:50 width:50 height:50 mapcoords:on pos:[0,0,0] isSelected:on
)

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

Теперь сохраняемся и меняем разрешение файла createBox.txt на createBox.ms.

Перезагружаем 3ds Max >> открываем окно Customize User Interface и видим, что на закладке Keyboard, в выпадающем списке Category выбран пункт 3dyuriki.com, а ниже - находится созданный нами скрипт CreateBoxInWorldCenter.

Всё! Мучения закончились. Достаточно назначить на него hotkey и, нажимая его в любом вьпорте, вы будете создавать куб.

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



Подпишитесь на обновление блога (вот 3 причины для этого).
Введите ваш e-mail:


P.S. Замечательную работу на заглавной картинке сделал иранец Mohsen Fallah с помощью 3ds Max, After Effects, Maya, Photoshop и ZBrush. Оригинал смотрите там.

Реклама (как сюда попасть): наиболее эффективным методом рекламы в интернете (не имиджевой) является контекстная реклама, которая зависит от того, кто на неё смотрит, какие у него интересы, возраст, пол, на какой странице он на неё смотрит и т.д.




Вам понравилась статья? Хотите отблагодарить автора? Расскажите о ней друзьям.
Или подпишитесь на обновление блога по E-Mail.

Введите ваш e-mail (используется только для отправления обновлений блога):

комментарий 41 к статье “Создаём первый скрипт или как назначать горячие клавиши (hotkeys) на любые действия и комманды в 3ds Max”

  1. Класс! Не думал что все так просто! Спасибо за урок и за сайт отдельное спасибо! Много полезного нашел для себя! Удачи!

  2. О класс про максскрипт начал рассказывать. Лично мне до определённого момента было довольно легко в понимании, а потом настал момент что мой мозг перестал понимать суть кода) Если ты тему скриптинга продолжаешь буде круто.

  3. было бы интересно как создать свое меню по ПКМ

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

  5. Так ведь создание своего квад-меню по ПКМ — это стандартными средствами делается. Заходите в Customize User Interface >> закладка Quads и либо правите существующее меню, либо создаёте свое (новое).

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

    • не совсем про то меню имел ввиду, про квад я знаю, а про меню допустим более сложного скрипта чем создать бокс, например как есть скрипт по созданию болтов и гаек, там свое меню есть который настраивает некоторые параметры обьекта, есть ли такие уроки или ссылки? для новичков конечно), заранее спасибо

      • 2 gudvin:
        если скрипт не mse (encrypted), то можно в нём и поглядеть.

        по скриптовым обьектам в референсе есть статьи Scripted Geometry Plug-ins, Scripted SimpleObject Plug-ins

        на рендере кто-то делал кухонную мебель скриптовую

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

        • Ооо, по-поводу статьи — это отличная идея!
          Мой e-mail внизу сайта.

  6. Отлично!!!! Здорово!!!=) Большое спасибо!!!=))) Очень полезная информация =)

  7. 2 yuriki

    Спасибо тебе огромное, очень просто и доходчиво, надеюсь это не последний урок на эту тему, ооочень надеюсь… ну пожалуйста! 🙂

  8. Можете помочь немного с написанием скрипта?
    У меня есть очень небольшой и простой самодельный скриптик, вот он

    macroScript ViewGrid
    category:"Plugins"
    internalcategory:"Plugins"
    ButtonText:"ViewGrid"
    tooltip:"ViewGrid"
    (
    actionMan.executeAction 0 "40135"
    actionMan.executeAction 0 "40084"
    )

    Его действия: он облегчает выбор в сцене Grid объекта. Создал на поверхности такой Helper как Grid, жму кнопку «G» кстати эта кнопка в Максе никогда не задействована ничем (сам доктор прописал как говорится) И вид становится по Grid объекту. Не нужно лезть во View, или как сейчас стало в Tools, искать там в длинной строчке Grid and Shapes затем Active Grid Object, потом щёлкать на параметр Viewport`а точнее правой мышкой на Perspective, ищем мышкой Extented Viewport — Grid — Display Plane. Мягко говоря, — неудобно, вот все эти действия и повесил на этот скриптик.
    У меня вопрос: можно ли организовать, что бы при повторном нажатии на «G» включался Active Home Grid? И если возможно, возвратить тот вид который был до этого?
    Заранее спасибо за помощь.

    • Да, можно.
      Нужно ввести проверку (if).
      Проверяем какой сейчас вьюпорт
      if viewport.getType()
      и если это #view_grid, значит переключаемся в перспективу
      then viewport.setType #view_persp_user
      Если нет, то переключаемся в вид на сетку
      else

      Точно также проверяется активна ли сейчас Home grid или Grid object.
      Всё это я нашел минут за 20 поисков в официальном хелпе, поскольку перед этим я с вьюпортами в maxscript не работал. Так что это не так уж и сложно 😉

      Кстати на G назначена функция отображения и прятания домашней сетки.

    • Можно также завести свой флажок и использовать вот это:
      «max views undo
      Performs viewport undo operation»
      тоже поиском в MAXScript Reference за 2 мин (с учетом чтения комментов и запуска макса) 😉 В общем погуглить или скурить кусочек мана бывает куда быстрее, чем ждать ответа с форума!

  9. Огромное Спасибо) ПО новому взглянул на интерфейс) Всегда хотелось помакскриптить)

    • Хотелось большего хелпа в этой области 🙂
      В вот, скажем, что делать, если скрипт .ms и мы хотим его кинуть кнопкой или тот же хоткей ?
      Накопал: создаем .mcr (кагбе макросы) в UI\MacroScript. Пишем: macroScript Имя category:»ИмяКатегории» buttonText:»ИмяТогоЧтоХотимДобавить» toolTip:»ТоЧтоНаКноакеИлиЧтоТамНаписано» silenterrors:true
      (
      on execute do(
      filein ((getDir #UI) + «\\MacroScripts\\какой-то_скрипт.формат»)
      —— путь к скрипту как и к созданому нами файлу с макросом
      )

      )

      ————————

      Есть еще
      Icon:#(«Имя» ,Чтозачисло?Обычно1пишут)
      тогда на кнопочке будет указаная иконка. Только в UI\Icons нужно создать иконки в bmp формате. При чем 2 —
      1) имя_16a (с альфа) и имя_16aі (без альфа)
      2) имя_24a (с альфа) и имя_24aі (без альфа)

      Заключение: терь можно любой скрипт запускать на выполнение хоткеем или кнопками 🙂

      bon voyage!

  10. А как может помочь maxscript при сложном моделировании? Я не говорю о создании удобных хоткеев на нужные действия.
    Вот, например, я моделирую высокополигональный автомобиль. Что тут можно автоматизировать скриптом?

    • Видел не скрипт, а плагинчик — зашивал квадами формы из сплайнов лучше, чем Surface. Мне в моделировании помогает Straighten Edge и аналог с нелинейной интерполяцией (без интерфейса сам же себе и накидал), в анимации не знаю уже как обойтись без установщика Pivot по вертексам и замены эйлерового вращения на TCB (лючки криволинейно расположенные всякие готовить). Набор скриптов определяется личными предпочтениями имхо — пробуйте, пишите, спрашивайте, как решить ту или иную занудную вешь.

  11. Один из способов узнать возраст спиленного дерева — посчитать годовые кольца на пне. Например на сосне до 50 лет они отчётливо различимы. Каждый год добавляется два разноцветных слоя. Эти слои мне и необходимо воссоздать примерно 260 за 130 лет. Большая надежда на скрипты -вот почему я здесь. Дальше хуже : добавление нового годового слоя ( и отдельной 3D модели) в параметрах: толщины, высоты,смешения, материала-текстуры,… зависят от многого например: температуры, состава почвы, внешних механических воздействий и генокода. И пусть в невероятно сложном скрипте (возможно плагине) необходимо изменять (при необходимости) или за счёт ограниченного выбора случайных чисел -делать модель и неповторимой как в природе И соответствовать реалиям. Не говорите что подобный комлекс моделей не поддержат визуализаторы или игровые движки (есть и поточный способ-когда часть сцены можно обыграть отдельно). Иначе не вижу способа увидеть модель — например свой бюст вырезанный из ствола например Канадской сосны спиленной 300 лет назад. Структура дерева на таком бюсте будет «реальной» для любого эксперта , а не «пакемонской» как делают всё что я видел. Или Вы можете направить меня в освоении написания подобных СКРИПТОВ или о человечестве я слишком хорошо подумал. Кстати не видел и анимации роста той же сосны, не видел её структуры например под микроскопом в каком нибудь игровом движке воссозданной…фантазия людей конечно заставляет делать монстров, а если задать другие параметры например гравитации или состава почвы дерево может измениться так как и фантазёр не придумает.

    • Александр, вы затронули практически неразработанную тему — насколько я знаю все системы процедурного моделирования деревьев работают с внешним видом, анимацией и всё. Уточните, что конкретно вам надо, иначе то задача либо будет нерешенной, либо растянется на годы. Создайте один экземпляр своего бюста вырезанного из дерева вручную, записывая видео и комментируя. Тогда и только тогда можно будет разобрать процесс на какие-то элементарные вещи и записать в виде скрипта, потом вынести какие-то рульки управления и творить реалистичные срезы.

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

  12. Здравствуйте!
    Спасибо за урок, пригодился. Думал, что он поможет в моей следующей проблемке с которой я столкнулся, но увы.
    Уже некоторое время я постепенно назначаю хоткеи на все часто используемые действия. Дело дошло до команд Extrude, Inset, Bevel при работе с подобъектами в Editable Poly (и прочих подобных команд во всех типах подобъектов). При чём нужно активировать не саму кнопку, а маленький квадратик «Settings» справа от них, для последующего ввода руками точных значений.
    Может быть подскажете способ это сделать, сам пока не разобрался…

    • Скорее всего, это можно сделать только назначив на горячую клавишу скрипт. Но я так и не смог с наскоку понять какой именно.
      Искал я вот здесь.

    • Блин, что-то я сразу начал решать задачу самым сложным путём 😉
      Оказывается можно просто в Customize user interface назначить горячую клавишу на пункты, которые заканчиваются словом «Settings». К примеру, Chamfer Setting, Bevel Settings. И тогда будут появляться кади-манипуляторы (они еще grip называются — крутилки).
      Только все эти пункты запрятаны НЕ в группе Main UI, а в группе Editable Poly. Чтобы понять какая между этими группами разница — читайте эту статью.

  13. Пригодилось, но есть вопрос.
    Мне нужно на горячую клавишу повесиить Bridge в Edit poly. Если я это делаю через группу Editable Poly. Bridge включается но не срабатывает так как если бы у меня были выделены две грани и нажать на кнопку Bridge. Попробовал сделать скриптом. Получилось:
    Получилось:

    macroScript Bridge
    category: «#Noname»
    (
    $Box01.bridgeSelected = 1
    $.EditablePoly.Bridge ()
    )
    Вот беда, что должно быть написанно вместо Box01 чтобы срабатывало с любым выделенным объектом?

  14. Здравствуйте. Подскажите пожалуйста. Я хочу чтобы у меня создавался не просто цилиндр, а вот такой.
    Модифицированный цилиндр
    Как это сделать. Код из Listener не работает, если его просто вставить.
    (
    $Cylinder:Cylinder001 @ [1.838620,6.702880,0.000000]
    macros.run «Modifier Stack» «Convert_to_Poly»
    subobjectLevel = 2
    $.EditablePoly.SetSelection #Edge #{30, 55}
    macros.run «Editable Polygon Object» «EPoly_Select_Loop»
    macros.run «Tools» «SmartScale»
    $.EditablePoly.SetSelection #Edge #{44, 68}
    $.EditablePoly.SetSelection #Edge #{44, 46, 68, 70}
    $.EditablePoly.SetSelection #Edge #{44, 46, 48, 68, 70, 72}
    $.EditablePoly.SetSelection #Edge #{42, 44, 46, 48, 65, 68, 70, 72}
    $.EditablePoly.Remove ()
    )

    • Некоторые действия (а особенно ВСЕ действия, выполняемые мышкой) не записываются в Listener. Также некоторые действия, которые отображаются в Listener нельзя напрямую выполнить. Нужно найти соответствующую этим действиям команду.

      • Можно ли как-то добавить свои примитивы? Например смоделить несколько объектов и каким-то образом добавлять их хоткеем?

        • можно использовать обьекты как примитивы:
          http://www.scriptspot.com/3ds-max/scripts/primitive-maker
          или написать свой обьект:
          https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2015/ENU/MAXScript-Help/files/GUID-C0BFFE27-BB59-4265-8F70-BFE8A636F7CB-htm.html

          ну и потом повесить Create что-то на хоткей

          • Офигеть. спасибо большое!!!

          • А не подскажешь. Я создал набор своих примитивов. Например Screw — гайка, я посмотрел, когда жму на кнопку, в категории, которую создал скрипт, т.е. создать Screw, посмотрел в лисенере, выполняется команда Screw (), запилил скрипт на эту команду, поставил ее в квад меню, но только когда я ее жму через квад меню, она создается, но только стандартного размера, я ее не могу растягивать, а когда жму через кнопку в панели create, все нормально, создается в зависимости от видового окна по соответствующей оси и растягивается до нужного размера. В чем дело?

        • Screw () — всё правильно, создание без параметров в начале координат, с ориентацией и масштабом по умолчанию. Надо вызывать процесс создания объекта startObjectCreation. Документация тут: http://docs.autodesk.com/3DSMAX/16/ENU/MAXScript-Help/index.html?url=files/GUID-D8CBACCF-73B3-41DF-9A2D-031CED757371.htm,topicNumber=d30e673417

          • Спасибо — буду глядеть. А не подскажешь такое дело..
            Почему в Listener никак не отображается переключение между переходом вкладок Create и Modify, не отображается On/Off Modifier те. включение, выключение модификатора ? п.с. нужно, чтобы свой скриптик усовершенствовать, он работает когда выбрана панель mofifier, а когда выбрана панель Create вызывает ошибку.

          • Пожалуйста. Официальную версию думаю доска не выскажет, но очень много при записи не показывается и я полагаю, что это по причине того, что это функции ядра 3ds Max. Ради скорости какая либо отладка (запись действий это в том числе своего рода отладка) не предусмотрена. Предусмотрено управление:
            http://docs.autodesk.com/3DSMAX/15/ENU/MAXScript-Help/index.html?url=files/GUID-D2A6D67D-60D6-4068-80E2-7C16496213CF.htm,topicNumber=d30e663178
            Для модификаторов .enabled = true/false.

            То есть в скрипте надо лишь сделать принудительное переключение к панели Modify. И ещё момент — длинные циклы через неё делаются долго и надо либо делать по другому, либо указывать, что не надо перерисовывать интерфейс.

          • Если хочется доступа к всем потрохам, то ваш выбор maya или blender. У майи весь интерфейс на МЕЛ написан, а блендер с открытыми исходниками всего вообще.

          • ASK’R, спасибо за ваш опыт. По-поводу Blender я с ним знаком, я в нем разверку делаю, например, именно в нем это удобно. Blender быстр, согласен, но все-равно в нем меньше инструментов для моделинга, без кастомизации естественно. Но тут вот какая проблема, лично для меня. Чтобы моделить также быстро, как я это делаю в 3d max, мне нужно потратить не меньше месяца на то, чтобы руку набить именно инструментами блендера или майки, а это очень много и дорого. У меня работы на месяц вперед с дедлайнами и т.д. можно конечно остановиться ,а стоит ли оно того? а что кушать?

  15. Help! Help! Помогите! После переустановки windows перестал работать хоткей с командой bridge EditablePoly.Bridge ()
    тот бридж, который соединяет лупы. Причем я перетащил этот скрипт на панель Drag$Droop ом когда жму на панеле его, он работает ,ставлю хоткей — нифига. П. С, на эту клавишу ничего больше не запилено.

  16. Спасибо огромное автору сайта и всем, кто отвечал мне. Разобрался со всем, что хотел, теперь пользуюсь командной панелью только для мониторинга модификаторов и текущих выбранных закладок. Переключаю закладки хоткеями. В контекстном меню создаю свои примитивы. Все на хоткеях.
    Единственное, что хотелось бы улучшить, так это мой с позволения сказать скрипт. Он служит для входа/выхода редактирования Edit Poly. Т.е. я выбираю объект, жму на клавишу и он автоматически выбирает эдит поли в стеке, дальше уже выбираю вертексы или другие субуровни, потом жму эту же кнопку и выходу из объекта и выбираю следующий объект. Так вот хотелось бы добавить, что если не выбрана закладка модифи, он в нее переходил, В общем я не знаю как грамотно вставить команду setCommandPanelTaskMode #modify
    Пробовал по-разному, но скрипт почему-то перестает работать на выход из объекта. Вот мой скрипт:
    (
    if subobjectLevel > 0 then
    (
    subobjectLevel = 0
    )
    else
    (
    modPanel.setCurrentObject $.baseObject
    )
    )

  17. Спасибо! Полезная статья!
    Увидел в ней наводку для исправления ошибки:
    Сбрасывались горячие клавиши на свои меню quads после перезапуска программы (только эти установки сбрасывались).
    Проверив файл «3dsMax.ini» с расположением:
    C:\Users\any_user\AppData\Local\Autodesk\3dsMax\2020 — 64bit\ENU
    увидел, что должен быть файл «MaxStartUI.mnux» в папке
    C:\Users\any_user\AppData\Local\Autodesk\3dsMax\2020 — 64bit\ENU\en-US\UI
    а он у меня отсутствовал 🙂
    в нем прописывается инфо о настройках quads меню (как я понял).
    Вероятно, ошибка была в том, что я сохранял все пользовательские настройки (Custom User Interface) на другом диске, и получилось какое-то рассогласование.
    Т.е. при запуске программы, при повторной загрузке фала .kbdx, где горячие клавиши сохранялись, все срабатывало. При новом запуске горячие клавиши своих quads исчезали)

Извините, в данный момент комметарии закрыты.

© 2008 - 2018 3dyuriki.com
Для связи со мной 3dyuriki@gmail.com