Я только начинаю изучать Maxscript |
Home· Статьи · Вакансии · Чертежи · 3D Галерея · 2D Галерея · Форум · Форум Realtime | Реклама |  Конкурсы | RAR Award | Правила |
Здравствуйте, гость ( Вход | Регистрация )
Я только начинаю изучать Maxscript |
01/09/2016, 22:18
Сообщение
#1156
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
как вариант попробовать заменить "DependsOn_0.rotation.controller.value" на "$Char_R_UpperArm.rotation.controller.value"
в скриптовых контроллерах едва понимаю что куда |
|
|
03/09/2016, 08:40
Сообщение
#1157
|
|
MaxMan Группа: Пользователи Сообщений: 180 Регистрация: 04/05/2006 Из: Ryazan Пользователь №: 30 816 |
|
|
|
16/09/2016, 17:13
Сообщение
#1158
|
|
Советчик Группа: Пользователи Сообщений: 75 Регистрация: 09/06/2009 Пользователь №: 70 500 |
можно ли повернуть на 90 градусов в любую сторону выделительный Segment или отдельный Spline?
Например: У меня есть два Circle они приатачины друг к другу, один из них выделен с помощью Spline, и его мне нужно повернуть на 90 градусов! Заранее спасибо с Уважением Александр! |
|
|
16/09/2016, 18:45
Сообщение
#1159
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
можно конечно. со сплайнами целая морока
поворачивать надо по одному сплайну/сегменту, поскольку поворачивать он будет вокруг центра выделения CODE fn splineRotateSel90 shp axis: = ( -- rotate subobject selection (spline/segment) by 90degrees if superclassof shp == shape do ( max modify mode with redraw off ( modPanel.addModToSelection (xform()) axis = if classof axis != point3 then (if random 0.0 1.0 > 0.5 then [1,0,0] else [0,1,0]) else axis shp.modifiers[1].gizmo.rotation = quat 90 axis collapseStack shp ) ) ) splineRotateSel90 $ в необязательной переменной axis можно указать ось вращения Сообщение отредактировал Jahman - 16/09/2016, 18:52 |
|
|
19/09/2016, 09:40
Сообщение
#1160
|
|
Советчик Группа: Пользователи Сообщений: 75 Регистрация: 09/06/2009 Пользователь №: 70 500 |
можно конечно. со сплайнами целая морока поворачивать надо по одному сплайну/сегменту, поскольку поворачивать он будет вокруг центра выделения Код fn splineRotateSel90 shp axis: = ( -- rotate subobject selection (spline/segment) by 90degrees if superclassof shp == shape do ( max modify mode with redraw off ( modPanel.addModToSelection (xform()) axis = if classof axis != point3 then (if random 0.0 1.0 > 0.5 then [1,0,0] else [0,1,0]) else axis shp.modifiers[1].gizmo.rotation = quat 90 axis collapseStack shp ) ) ) splineRotateSel90 $ в необязательной переменной axis можно указать ось вращения Спасибо все работает )) |
|
|
25/09/2016, 10:35
Сообщение
#1161
|
|
MaxMan Группа: Пользователи Сообщений: 190 Регистрация: 24/06/2010 Пользователь №: 79 099 |
Как-то накопилось за пару недель.
1. А как копировать особую коллекцию через CopyTo? Мне нужно чрезвычайно быстро продублировать SelectedIndices в ListView, у него есть метод .CopyTo <System.Array>dest <System.Int32>index. Тест скрипт: CODE rollout Test "Test" ( dotNetControl lvlist "System.Windows.Forms.ListView" width:1050 height:300 align:#center on Test open do ( lvlist.GridLines = true lvlist.FullRowSelect = true lvlist.HideSelection = false lvlist.View = (dotNetClass "System.Windows.Forms.View").Details lvlist.columns.add "Object" 180 for i = 1 to 10 do lvlist.items.add "Blah" ) on lvlist MouseUp e do ( if lvlist.selectedindices.count > 0 do ( local Selected = #() lvlist.selectedindices.CopyTo Selected 1 print Selected ) ) ) try destroyDialog Test catch() createDialog Test width:1050 height:450 Ни as array, ни #() ничего ему не подоходит! Как создать System.Array нужный просто ума не приложу, там такие классовые методы и типы нужны, тайга сплошная. Сейчас всегда выдает Runtime error: No method found which matched argument list. Если что, сейчас пользуюсь таким кодом, сработал довольно шустро с несколькими тысячами айтемов: CODE lvSelected = #() local ls = lvlist.items for i = 0 to ls.count-1 do ( local li = ls.item[i] if li.selected do append lvSelected li ) 2. Есть ли событие на изменение properties в объекте? Это которые Object Properties... там есть кастомные плагинские свойства и нужно знать когда там че-то изменяется. Потому что у меня скрипт это список ListView с 15-ю столбцами именно с этими свойтвами, чтобы массово и быстро редактировать, но вот если через Object Properties поменять напрямую в скрипте никак не отобразить 3. Возможно делать потоки(threads)? Я могу делать таймеры, делал 4 штуки, но они все на одном ядре =( |
|
|
25/09/2016, 21:40
Сообщение
#1162
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
1.
CODE local Selected = dotnetobject "int32[]" lvlist.selectedindices.count lvlist.selectedindices.CopyTo Selected 1 format "%\n" selected дотнет желает дотнетовский массив 2. Смотря как реализованы твои кастомные свойства на объекте. 3. есть Backgroundworker как вариант. На cgsociety.org полно примеров |
|
|
26/09/2016, 09:02
Сообщение
#1163
|
|
MaxMan Группа: Пользователи Сообщений: 190 Регистрация: 24/06/2010 Пользователь №: 79 099 |
Jahman, спасибо!
Насчет второго, да они в каждом рендере есть вот такие: Я ешё раз посмотрел хэлп и кажется да. нашел, как бонус ещё NodeEventCallback доступный в "3ds Max 2009 and higher ". Буду разбираться. backgroundworker в копилку. Очень круто, спасибо! |
|
|
19/10/2016, 06:58
Сообщение
#1164
|
|
Наш человек Группа: Пользователи Сообщений: 471 Регистрация: 19/10/2006 Пользователь №: 38 802 |
Привет всем, последнее время надоело мне постоянно применять к обьектам модификатор Unwrap UVW, и каждый раз настраивать окошко UV эдитора, думал сделать скрипт для того чтобы одним нажатием на него, у меня применялся модификатор и открывалось окно с нужными мне вкладками, например чтобы помимо окошка UV эдитора, ещё раскрывалось окошко релакса с настроенными параметрами, но когда я создаю скрипт с помощью копирования из MAXScript Listener нужных строчек последовательности моих действий, окна у меня не раскрываются, а лишь применяются модификаторы с параметрами, а как сделать чтобы открылось окно с подменюшками?
Может уже и есть чтото подобное для максовского анврапа, если подскажете буду благодарен, я бы вообще не хотел применять этот модификатор, было бы круто если бы он всегда присутствовал на обьекте без самого модификатора, вроде в Майке такое. Может встречали чтото подобное для макса?. И можно ли сделать чтобы кнопочка Select by Element UV Toggle активировалась допустим при удержании клавиши Ctrl, а если не удерживать её то происходит обычное выделение отдельного элемента? Сообщение отредактировал GC3-SLIM - 19/10/2016, 07:04 |
|
|
28/01/2017, 17:10
Сообщение
#1165
|
|
Уже не новичок Группа: Пользователи Сообщений: 21 Регистрация: 01/03/2016 Пользователь №: 111 388 |
Добрый день. При создании скрипта используются массивы. К окончанию очень много массивов в памяти.
Как по мере использования массива его удалять, если он больше не нужен? Возможно ли это делать внутри цикла? Чтобы если есть массив с 1000 единиц при вкладывании один в другой будет 1млн. и тд. Если 3000 уже 9млн. Как удалять? чтобы быстрее работал скрипт. Спасибо. |
|
|
28/01/2017, 17:40
Сообщение
#1166
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
прежде чем беспокоиться за память надо узнать, а жрется ли она при выполнении скрипта. при смене контекста сборщик мусора может сам удалить все ненужное из памяти. об этом в референсе можно почитать.
и еще надо иметь ввиду, что некоторые функции в максскрипте имеют утечки по памяти, которые не лечатся даже сборщиком мусора. подобная обертка позволяет довольно наглядно профилировать скрипт при написании CODE gc() t1=timestamp() hf = heapfree -- тут какой-либо скрипт format "Time: %sec. Mem: %\n" ((timestamp()-t1)/1000 as float) (hf-heapfree) Сообщение отредактировал Jahman - 28/01/2017, 17:42 |
|
|
26/02/2017, 13:51
Сообщение
#1167
|
|
Уже не новичок Группа: Пользователи Сообщений: 21 Регистрация: 01/03/2016 Пользователь №: 111 388 |
Спасибо, полезно.
Помогите пожалуйста в модификации. Хочу сделать рандом с размещением вершин. 1) Исходные данные: На плоскости есть разбитая плоскость некими полигонами. Все вершины этих полигонов совпадают между собой. Полигоны полилиниями каждый отдельно. Полигоны могут быть или сплайн или "едитбл поли". На этом мой алгоритм заканчивается. Полигоны соприкасаются друг с другом, тоисть на грани соприкосновения находится два обьекта. В одной вершине может соприкосаться один, два, три, четыре или больше полигонов. Зависит от рандома. Задача: (мой предположительный порядок действий) помогите пожалуйста реализовать, написать скрипт. - определить какие вершини между собой совпадают; - как-то связать эти вершини разных обьектов; - в каждой вершине сделать невидимый круг некого радиуса; - круги в каждой вершине рандомного радиуса; - возможность задать мин и макс радиус, или иметь возможность задать два одинаковых радиуса если круги одинаковые хочется; - переместить вершину всех совпадающих обьектов на любую точку окружности; - в результате рандомно изменяется разбитие полигонами, модифицыруется размещение всех вершин; - разные сплайны или полики остаются разными обьектами, только движуться вершины на некое растояние в неком направлении. Большое спасибо за помощь.
Прикрепленные изображения
|
|
|
26/02/2017, 16:23
Сообщение
#1168
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
первый пункт показал.
остальное, надеюсь не должно вызывать затруднений 1. Найти все индексы вершин лежащие в некоторой близости друг от друга. 2. Зная какие индексы образуют группу вычислить среднюю позицию, или взять любую позицию вершины из группы вершин 3. Для каждой группы создать окружность 4. Найти рандомную точку на окружности и перенести в нее все вершины группы ~the end~ CODE fn closeEnough pt1 pt2 dist:0.001 = ( distance pt1 pt2 <= dist )
num = polyop.getNumVerts $ pts = for i=1 to num collect polyop.getVert $ i vertIndexes = #() alreadytaken = #{} for i=1 to num do ( for j=1 to num where i != j and closeEnough pts[i] pts[j] and not alreadytaken[j] do ( alreadytaken[i] = true alreadytaken[j] = true if not isKindOf vertIndexes[i] array do vertIndexes[i] = #( i ) appendIfUnique vertIndexes[i] j ) ) vertIndexes = for vi in vertIndexes where vi != undefined collect vi /* -- можно раскомментить, чтоб выделить все группы вершин selectionMask = #{} for vi in vertIndexes do selectionMask += vi as BitArray polyop.setvertselection $ selectionMask update $ */ Сообщение отредактировал Jahman - 26/02/2017, 16:35 |
|
|
03/03/2017, 23:52
Сообщение
#1169
|
|
Уже не новичок Группа: Пользователи Сообщений: 21 Регистрация: 01/03/2016 Пользователь №: 111 388 |
Смотрю и туплю. Прошу помощи в завершении. Спасибо за помощь, хотя конешно прошу все пункты.
Много пишу спасибо, надеюсь это здесь приятно, что помогло человеку. Напишите пожалуйста второй, третий, четвертый пункты. |
|
|
04/03/2017, 02:31
Сообщение
#1170
|
|
уже всё сделал Группа: Пользователи Сообщений: 2 456 Регистрация: 01/06/2005 Из: z3л3№гр@d Пользователь №: 13 838 |
2. Зная какие индексы образуют группу вычислить среднюю позицию, или взять любую позицию вершины из группы вершин
CODE averagePositions = for vi in vertIndexes collect ( pos = [0,0,0] for i in vi do pos += pts[ i ] pos / vi.count ) 3. Для каждой группы создать окружность CODE minr = 10.0 maxr = 15.0 circles = for a in averagePositions collect random minr maxr 4. Найти рандомную точку на окружности и перенести в нее все вершины группы CODE for i=1 to vertIndexes.count do ( randomAngle = random 0.0 360.0 randomPointOnCircle = averagePositions[ i ] + [ cos randomAngle, sin randomAngle, 0 ] * circles[ i ] polyop.setVert $ vertIndexes[i] randomPointOnCircle ) update $ Это все геометрия класс 8-9, наверное. Синусы, косинусы, вектора. И простейший максскрипт. Тут не должно быть никаких проблем, кроме синтаксиса. Сразу хочу сказать, что ничего из выше написанного я в максе не запускал. зы. В любом случае лучше писать самому и просить указать на ошибку нежели пытаться разобраться в чужом коде. Либо сперва поискать чужой код, разобраться, написать свое и спрашивать. В ином случае какой практический смысл? Сообщение отредактировал Jahman - 04/03/2017, 02:34 |
|
|
Bots |
Системное сообщение
|
|
|
|
|
Текстовая версия | Сейчас: 30/03/2024 - 05:05 |