Я только начинаю изучать Maxscript |
Home· Статьи · Вакансии · Чертежи · 3D Галерея · 2D Галерея · Форум · Форум Realtime | Реклама |  Конкурсы | RAR Award | Правила |
Здравствуйте, гость ( Вход | Регистрация )
Я только начинаю изучать Maxscript |
06/08/2016, 15:35
Сообщение
#1141
|
|
Уже не новичок Группа: Пользователи Сообщений: 11 Регистрация: 24/07/2016 Пользователь №: 116 598 |
фух.. наконецто закончил ..
|
|
|
06/08/2016, 17:27
Сообщение
#1142
|
|
Уважаемый Группа: Участник Сообщений: 862 Регистрация: 05/12/2004 Из: Минск Пользователь №: 8 716 |
Jahman, Спасибо - будем разбираться!)
Сообщение отредактировал IOG - 06/08/2016, 17:27 |
|
|
06/08/2016, 18:02
Сообщение
#1143
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
|
|
|
11/08/2016, 08:22
Сообщение
#1144
|
|
Уже не новичок Группа: Пользователи Сообщений: 11 Регистрация: 24/07/2016 Пользователь №: 116 598 |
|
|
|
23/08/2016, 17:06
Сообщение
#1145
|
|
Уже не новичок Группа: Пользователи Сообщений: 20 Регистрация: 21/12/2013 Пользователь №: 98 131 |
Привет всем, кто может посмотреть код, скрипта, смысл в том, чтобы выравнивать модификаторы свободно повернутого объекта, к которому применен резет икс форм, по 2 точкам. До вчерашнего дня работал с небольшим изъяном - модификатор становился не по центру объекта после выравнивания. Пытался вчера это исправить, однако сделал хуже и в итоге выравнивает на какой-то странный угол. Старый код применил обратно, однако не помогает ничего.
Код macroscript AlignModifier
category: "Maketer" ( if selection.count == 1 then undo on ( points4pos = #([0,0,0],[0,0,0],[0,0,0],[0,0,0]) Node01 = selection[1] local origCoordSys = getRefCoordSys() toolMode.coordsys #world local pos01 = undefined local pos02 = undefined local pos03 = undefined local pos04 = undefined local curSnapMode = snapMode.active local curSnapType = snapMode.type snapMode.active = true snapMode.type = #3D pos01 = pickPoint snap:#3d if classof pos01 == point3 do ( points4pos[1] = pos01 pos02 = pickPoint snap:#3d rubberBand:pos01 ) if classof pos02 == point3 do ( points4pos[2] = pos02 pos03 = [0,0,0] pos04 = [10,0,0] ) snapMode.active = curSnapMode try(snapMode.type = curSnapType)catch() if classof pos01 == point3 and classof pos02 == point3 do ( points4pos[3] = pos03 points4pos[4] = pos04 local p1 = normalize (pos01 - pos02) local p2 = normalize (pos04 - pos03) local angleRot = acos (dot p1 p2) local dum=dummy pos: [0,0,0] rotate dum (eulerangles 0 0 -angleRot) matrixMod=dum.transform setModContextTM Node01 Node01.modifiers[1] matrixMod delete dum max views redraw subobjectlevel=1 subobjectlevel=0 ) ) else messagebox "Select only one object!" title:"Invalid Selection!" ) |
|
|
26/08/2016, 14:22
Сообщение
#1146
|
|
MaxMan Группа: Пользователи Сообщений: 180 Регистрация: 04/05/2006 Из: Ryazan Пользователь №: 30 816 |
Добрый день.
Давно здесь писал про скрипт для имитации костей скручивания у скелета игрового рига. Сегодня понадобилось восстановить, что что я тогда делал. Посмотрел на свой скрипт, понят, что я наворотил кучу лишнего. Как упростить, не создавать пустышку и прочих лишних действий? У меня есть, вот это: Есть 3 куба, красный (как бы - плечо), желтый верх - плеча, зеленый - (предплечье)локоть. Красный является родителем в иерархии для желтого и зеленого одинаково. Надо что бы кость скручивания (желтый) вращалась синхронно с "анимированным братом (зеленый)", только по локальной оси z повторяя повороты с меньшим коэффициентом на определенное значение (например 33 % или *0,33). Мне это скрипт нужен для эксперимента, и вычисления реалистичного скручивания меша, тот который используется в игровом движке (достать настройки контроллеров игрового рига из игры нельзя). Из игры взята анимация скелета, но анимация не для всех костей, только для основных. В игре свои настройки для контроллеров вращения дополнительных костей, которые я пытаюсь понять, методом пробы и сравнения искажения меша в окне редактора и в "окне" игры. В общем хочу применить к этим дополнительным костям контроллеры вращения, менять или процентное соотношение или коэффициент от вращения анимированного "брата". мой код: CODE --пример
a1=Box pos: [0.000000,0.000000,0.000000]; a1.wirecolor = color 0 255 0 -- Char_*_Forearm b1=Box pos: [0.000000,0.000000,35.000000]; b1.wirecolor = color 255 255 0 -- *_ArmRoll c1=Box pos: [0.000000,0.000000,65.000000]; c1.wirecolor = color 255 0 0 -- Char_*_UpperArm b1.pivot =c1.pivot d1=Dummy pos: a1.pivot prc = d1.rotation.controller = rotation_List() prc[1].rotation.controller.Euler_XYZ.controller.Z_Rotation.controller = On_Off () prc[2].controller = Orientation_Constraint() prc[2].controller.appendTarget a1 100 prc[2].controller.relative = off prc[2].controller.local_world = 1 d1.rotation.controller.weight[1] = 100 d1.rotation.controller.weight[2] = 30 prc = b1.rotation.controller = rotation_List() prc[1].rotation.controller = Euler_XYZ () --резерв prc[2].controller = lookAt_Constraint lookAt_Vector_Length:60 prc[2].controller.appendTarget a1 100 prc[2].controller.relative = off prc[2].controller.target_axis = 2 prc[2].controller.target_axisFlip = on prc[2].controller.upnode_world = off prc[2].controller.pickUpNode = d1 prc[2].controller.StoUP_axis = 1 prc[2].controller.upnode_axis = 1 b1.rotation.controller.weight[1] = 100 --резерв b1.rotation.controller.weight[2] = 100 select a1 Сообщение отредактировал Ded_ - 26/08/2016, 14:34 |
|
|
26/08/2016, 21:05
Сообщение
#1147
|
|
MaxMan Группа: Пользователи Сообщений: 180 Регистрация: 04/05/2006 Из: Ryazan Пользователь №: 30 816 |
... ... Посмотрел на форумах как в Майя просто записать для такой кости скручивания скрипт, всего одна строчка. Невероятно просто : CODE L_Shoulder_Twist.rotateX=L_Arm.rotateX*-0.3; <- скручивание левого плеча Как эту строчку написать для 3d Max? У меня не получается, знак умножить в таком выражении Макс не понимает, как Майка : CODE $L_Shoulder_Twist.rotation.controller.X_Rotation.controller=$L_Arm.rotation.controller.X_Rotation.controller*0.3
|
|
|
27/08/2016, 01:44
Сообщение
#1148
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
с анимацией не сталкивался, но может поможет
CODE delete objects
b1 = box height:50 pos:[0,0,0] b2 = box height:50 pos:[0,0,55] c1 = b1.rotation.controller = Rotation_List() c1.available.controller = Bezier_Rotation() c2 = b2.rotation.controller = Rotation_List() c2.available.controller = Rotation_Script() c2[2].script = "dependsOn $box001; local zz = $box001.rotation.controller[1].z_rotation; $box002.rotation.controller[1].z_rotation = -0.3 * zz; $box002.rotation.controller[1].value" -- c2.setactive 2 |
|
|
27/08/2016, 04:32
Сообщение
#1149
|
|
MaxMan Группа: Пользователи Сообщений: 180 Регистрация: 04/05/2006 Из: Ryazan Пользователь №: 30 816 |
с анимацией не сталкивался, но может поможет Код delete objects b1 = box height:50 pos:[0,0,0] b2 = box height:50 pos:[0,0,55] c1 = b1.rotation.controller = Rotation_List() c1.available.controller = Bezier_Rotation() c2 = b2.rotation.controller = Rotation_List() c2.available.controller = Rotation_Script() c2[2].script = "dependsOn $box001; local zz = $box001.rotation.controller[1].z_rotation; $box002.rotation.controller[1].z_rotation = -0.3 * zz; $box002.rotation.controller[1].value" -- c2.setactive 2 Спасибо. Этот код работает! Этот код очень сложный для меня, я бы не за что не допёр. Максимум что я понял, это как добавить строки для других осей: CODE c1 = b1.rotation.controller = Rotation_List() c1.available.controller = Bezier_Rotation() c2 = b2.rotation.controller = Rotation_List() c2.available.controller = Rotation_Script() c2[2].script = "dependsOn $box001; local zz = b1.rotation.controller[1].z_rotation; b2.rotation.controller[1].z_rotation = 0.3 * zz; local xx = b1.rotation.controller[1].x_rotation; b2.rotation.controller[1].x_rotation = 1.0 * xx; local yy = b1.rotation.controller[1].y_rotation; b2.rotation.controller[1].y_rotation = 1.0 * yy; $box002.rotation.controller[1].value" -- c2.setactive 2 А в Maya неужели правда так просто, вместо этого кода написать всего: b2.rotateX=b1.rotateX*-0.3; ? Я не когда не устанавливал Maya, теперь даже захотелось. Сообщение отредактировал Ded_ - 27/08/2016, 04:34 |
|
|
27/08/2016, 10:05
Сообщение
#1150
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
есть замечательный
без даммика не получается вращать в локальной системе координат CODE delete objects b1 = box pos:[0,0,0] height:50 b2 = box pos:[0,0,60] height:50 dm = dummy pos:[0,0,55] b2.parent = dm b2.rotation.controller.z_rotation.controller = float_list() b2.rotation.controller.z_rotation.controller.available.controller = bezier_float() b2.rotation.controller.z_rotation.controller.setName 2 "Wired" c1 = b1[#transform][#rotation][3] c2 = b2[#transform][#rotation][#Z_Rotation][#wired] paramWire.connect c1 c2 "Z_Rotation * -0.3" Сообщение отредактировал Jahman - 27/08/2016, 10:29 |
|
|
27/08/2016, 13:51
Сообщение
#1151
|
|
MaxMan Группа: Пользователи Сообщений: 180 Регистрация: 04/05/2006 Из: Ryazan Пользователь №: 30 816 |
есть замечательный без даммика не получается вращать в локальной системе координат Код delete objects b1 = box pos:[0,0,0] height:50 b2 = box pos:[0,0,60] height:50 dm = dummy pos:[0,0,55] b2.parent = dm b2.rotation.controller.z_rotation.controller = float_list() b2.rotation.controller.z_rotation.controller.available.controller = bezier_float() b2.rotation.controller.z_rotation.controller.setName 2 "Wired" c1 = b1[#transform][#rotation][3] c2 = b2[#transform][#rotation][#Z_Rotation][#wired] paramWire.connect c1 c2 "Z_Rotation * -0.3" Класс! Но тут я уже не знаю куда приписывать строчки для оставшихся осей, как в первом твоем скрипте. Дело в том что в игре, кость скручивания плеча (b2) не является потомком самого плеча (b1), у обеих костей общий предок - ключица, поэтому надо для других осей тоже задавать коэффициент только близкий к единице или равный ей. --- В общем это в теории, а в сцене с костями, применить к ним эти скрипты нельзя вообще, если только не строить свой дубликат скелета полностью. Я подготовил сцену в вложении (для 3ds max 2011 и выше) с этим игровым скелетом. Сделал локатор для удобства вращения плеча и имитации анимации. Переменные для сцены: b1 = $Char_L_UpperArm b2 = $L_ArmRoll dm = $Dummy001 Если не трудно посмотри пожалуйста твой скрипт в этой сцене и повращай плечевой локатор. Хочется, что бы у кости Twist плеча (b2) были настройки вращения (которые буду потом подбирать коэффициентом) по отношению к b1, например такие: X_Rotation * 0.3" Y_Rotation * 1.0" Z_Rotation * 1.0" Сообщение отредактировал Ded_ - 27/08/2016, 14:05
Прикрепленные изображения
Прикрепленные файлы
|
|
|
27/08/2016, 15:18
Сообщение
#1152
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
в ротейшн контроллер x_rotation объекта L_ArmRoll ставим float_script()
в скрипте забираем значение вращения с $Char_L_UpperArm Только фигня какая-то у меня выходит. То ли надо в какой-то другой системе координат значение получать то ли хз. Эт лучше у знающих уточнить, я увы профан в анимации. CODE dependson $Char_L_UpperArm; degtorad((DependsOn_0.rotation.controller.value as eulerangles).x * 0.3) аналогично и для других осей вращения L_ArmRoll Сообщение отредактировал Jahman - 27/08/2016, 15:19 |
|
|
30/08/2016, 11:10
Сообщение
#1153
|
|
MaxMan Группа: Пользователи Сообщений: 180 Регистрация: 04/05/2006 Из: Ryazan Пользователь №: 30 816 |
в ротейшн контроллер x_rotation объекта L_ArmRoll ставим float_script() в скрипте забираем значение вращения с $Char_L_UpperArm Только фигня какая-то у меня выходит. То ли надо в какой-то другой системе координат значение получать то ли хз. Эт лучше у знающих уточнить, я увы профан в анимации. Код dependson $Char_L_UpperArm; degtorad((DependsOn_0.rotation.controller.value as eulerangles).x * 0.3) аналогично и для других осей вращения L_ArmRoll Спасибо! Только фигня какая-то у меня выходит. То ли надо в какой-то другой системе координат значение получать то ли хз. Сегодня обратил внимание, что реальная локальная ось не туда смотрит, как она просто в вьюпорте показана. Если объекту на вращение назначить мишень (плечо- Char_L_UpperArm) и выбрать локальную ориентацию, то ось меняется координатно, почти перпендикулярно по оси Z становится та ось которой надо придать орможение. Это мне тоже пока не понятно. Вот видео, выбора этого объекта: Я что и загоняюсь, пытаясь вычислить настройки контроллера. Любопытства ради. То что он понятен только создателям игры и никто его не выдернул из игры, это факт. Я спрашивал у тех, кто сделал программу для модинга GTA4-GTA5 (OpenIV) У них даже в самой программе в окне просмотра анимации, видно, что нет анимации у некоторых суставов. Мне один из разработчиков этой программы ответил, что мы раньше бились над этими контролерами, но так и не поняли как они работаю и тупо прилинковали кости к анимированным, для более менее адекватного искажения меша, в последующих версиях проги, а в начале вообще без них "выпустили". Вот например видео, с тогда еще новой функцией, просмотра анимации игры - Думаю его вычислить можно. Если заморочиться именно этим, подбором разных значений. Или еще добавление в список, контроллера Look например... Буду вычислять. Сообщение отредактировал Ded_ - 30/08/2016, 11:14 |
|
|
31/08/2016, 18:11
Сообщение
#1154
|
|
MaxMan Группа: Пользователи Сообщений: 180 Регистрация: 04/05/2006 Из: Ryazan Пользователь №: 30 816 |
в ротейшн контроллер x_rotation объекта L_ArmRoll ставим float_script() в скрипте забираем значение вращения с $Char_L_UpperArm Только фигня какая-то у меня выходит. То ли надо в какой-то другой системе координат значение получать то ли хз. Эт лучше у знающих уточнить, я увы профан в анимации. Код dependson $Char_L_UpperArm; degtorad((DependsOn_0.rotation.controller.value as eulerangles).x * 0.3) аналогично и для других осей вращения L_ArmRoll Еще раз спасибо) Не мог понять почему так , пока не решил проверить на правом плече, там все по другому. Импортировал сегодня другой mehs от другой модельки. И там все нормально, скрип работает. В вложении другая сцена с другим мешем с примененными контроллерами (скрипт).
Прикрепленные файлы
|
|
|
01/09/2016, 20:49
Сообщение
#1155
|
|
MaxMan Группа: Пользователи Сообщений: 180 Регистрация: 04/05/2006 Из: Ryazan Пользователь №: 30 816 |
С помощью Jahman, у меня начало получаться подбирать настройки для костей скручивания игрового рига.
Скриптом проще подбирать настройки, в сто раз быстрее. Подобрал для двух пар суставов плеча, осталось подобрать настройки для других (запястье, щиколотка, ключица) Скрипт переделал под себя, толком не понимаю для чего нужны какие команды и поэтому вылетает куча предупреждений, но скрипт работает! (Видео) Исправьте пожалуйста в скрипте то, что вызывает эти предупреждения. CODE a1 = $L_ArmRoll.rotation.controller.X_Rotation.controller = float_script () a1.script = "dependson $Char_L_UpperArm; degtorad((DependsOn_0.rotation.controller.value as eulerangles).x * 0.3)" a2 = $L_ArmRoll.rotation.controller.Y_Rotation.controller = float_script () a2.script = "dependson $Char_L_UpperArm; degtorad((DependsOn_0.rotation.controller.value as eulerangles).y * 1.0)" a3 = $L_ArmRoll.rotation.controller.Z_Rotation.controller = float_script () a3.script = "dependson $Char_L_UpperArm; degtorad((DependsOn_0.rotation.controller.value as eulerangles).z * 0.9)" a4 = $R_ArmRoll.rotation.controller.X_Rotation.controller = float_script () a4.script = "dependson $Char_R_UpperArm; degtorad((DependsOn_0.rotation.controller.value as eulerangles).x * 0.3)" a5 = $R_ArmRoll.rotation.controller.Y_Rotation.controller = float_script () a5.script = "dependson $Char_R_UpperArm; degtorad((DependsOn_0.rotation.controller.value as eulerangles).y * 1.0)" a6 = $R_ArmRoll.rotation.controller.Z_Rotation.controller = float_script () a6.script = "dependson $Char_R_UpperArm; degtorad((DependsOn_0.rotation.controller.value as eulerangles).z * 0.9)" В вложении сцена с этой анимацией (из видео) без применения скрита для плечевых суставов.
Прикрепленные файлы
|
|
|
Bots |
Системное сообщение
|
|
|
|
|
Текстовая версия | Сейчас: 24/04/2024 - 19:16 |