Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум .:3DCenter.ru:. _ Maxscript _ Я только начинаю изучать Maxscript

Автор: C00PER 24/06/2004, 03:06

Раз уж появилась традиция создавать такие темы, создадим её и тут, а то всякие шарики да стекляшки уже заезжены до дыр, а столь важный аспект Макса, как Скриптинг, особого интереса у населения не вызывает. Надо это упущение исправлять dry.gif

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

Ну и для начала выложу своё сегодняшнее творение - творение, которое появилось на свет после нескольких лет повторения одной и той же процедуры. Обычная ситуация - нам надо простому плоскому объекту назначить материал с текстурой. После создания материала и выбора битмапки, нам надо, чтобы текстура легла в соответствии со своими пропорциями, а не растягивалась по размеру объекта. Для этого, мы идём в UVW Map, и там жмём Bitmap Fit, там открывается окно выбора файла, там мы ищем этот файл, и хорошо если мы в редакторе материалов, при выборе битмапки воспользовались максовской листалкой, тогда она битмапка сразу видна в окне Bitmap Fit, а если мы битмапку закинули драг-н-дропом, например из ACDSee, то листать придётся с чёрт знает какого места. Вощем целая история. Ну вот, этот скрипт ставит большую и жирную точку в этом занятии, он автоматически ставит размер гизмы равный размеру битмапки. Всё бы замечательно, но мне хотелось бы добавить ещё одну функцию - чтобы он анализировал, по какой из осей объект шире всего, и применял UVWMap на эту ось. Я хотел считать размеры объекта командами $.min и $.max, но столкнулся с каким-то непредсказуемым поведением - они как-то странно ведут себя в локальных коорднатах (или я чего проглядел): по идее in coordsys local $.min должен показывать минимальное значение боундинг бокса, независимо от угла наклона объекта, однако стоит только чуть повернуть объект, как он выдаёт какие-то немыслимые значения.

Вот и скрипт. Самое разумное ему место - в менюхе Utilities в Редакторе материалов wink.gif

Автор: C00PER 25/06/2004, 01:04

Сделал проверку габаритов. cool.gif Теперь плоскость гизмы параллельна оси самого большого габарита объекта, но стандартными средствами макса мне сделать это не удалось, поэтому нужны http://scriptspot.com/Main_Extensions.asp?BrowseType=Complete&Sort=Name

Автор: Desead 25/06/2004, 08:45

Тема интересная, но глядя на подобные форумы понимаешь, что максскрипт мало кого интересует по разным соображениям ,а жаль, можно значительно упростить себе жизнь. Вообщем развивать тему надо. Рано или поздно допишу скрипт который ищет нужный битмап по всем материалам, и ещё умеет искать объект с нужным ID, если кого заинтересует то выкину, говорите. Нужно конечно это гейм девелоперам в первую очередь

Автор: DIA-Doca 25/06/2004, 17:23

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

Нас тут четверо собралось, игру делать будем. Вот я и взялся за это дело.

Автор: Desead 25/06/2004, 17:28

QUOTE(DIA-Doca @ Jun 25 2004, 18:23)
По-моему гей мекерам в первую очередь нужны скрипты, переводящие модели и анимации во внешние, открытые файлы.
Именно этим я щаз и занимаюсь.

Нас тут четверо собралось, игру делать будем. Вот я и взялся за это дело.

это тоже надо, но это самая первая и очевидная проблема, а в период работы их ещё гора возникнет

Автор: Desead 25/06/2004, 19:00

а кто-нить знает как скриптом нажать утилитку reset xform, я так понял можно воспользоваться $.transform но вот пока не понял как
или я всё таки не туда двигаюсь ?

Автор: C00PER 28/06/2004, 07:23

Desead, вот тебе улучшенный ResetXform, который сохраняет информацию о вращении, то бишь обнуляет только масштаб.

http://scriptspot.com/download.asp?ID=1937

Или просто напиши ResetXForm $ , но это только для макса 6

А у меня появился ламерский вопрос: Как можно назначить одному Эррею в качестве цвета другой Эррей.
Например у меня есть:

CODE
sel = selection as array
col = for s in sel collect s.wirecolor


затем я например всем объектам назначаю один общий цвет, а потом мне надо для каждого объекта, находящегося в Эррее Sel назначить его исходный цвет, который лежит в Эррее Col

Вот что находится в первом Эррее:
CODE
#($Teapot:Teapot02 @ [15.607554,34.097706,0.000000], $Teapot:Teapot03 @ [-26.646317,-26.881655,0.000000], $Teapot:Teapot01 @ [-55.240364,7.516488,0.000000])


Вот что во втором:
CODE
#((color 223 189 154), (color 27 33 248), (color 4 230 216))


Как второе назначить первому ну никак не могу въехать smile.gif Пожалуйста не оставляйте без внимания сей пост, ибо в качестве благодарности вы получите довольно забавный скрипт
rolleyes.gif

Автор: Desead 28/06/2004, 09:35

to COOPER: благодарю за помощь, вечером погляжу как там с цветом обстоят дела, чего если получится, то напишу

Автор: C00PER 28/06/2004, 15:28

Ещё вопрос, совсем простенький lamer.gif
Есть две Point3... Как из них получить Matrix3? Пдразумевается что Scale будет равным 1 unsure.gif

edit: Свою ошибку понял, конечно сморозил полную херню, нужна ещё одна Point3. Будем копать дальше..

Автор: pepper 28/06/2004, 22:45

QUOTE
для каждого объекта, находящегося в Эррее Sel назначить его исходный цвет, который лежит в Эррее Col
.........
Как второе назначить первому ну никак не могу въехать

Сам ответил на свой вопрос и не заметил: rolleyes.gif

for j=1 to col.count do sel[j].wirecolor=col[j]

ЗЫ:Моделил дом для игрушки и в результате чего я тоже написал пару скриптиков по UVW mapping'y.Есть: применение для каждого полигона одного UVW, перестановка(обмен) 2-х UVW координат (с 2-х полигонов)...были еще идеи только сейчас не вспомню...

Автор: DIA-Doca 29/06/2004, 09:20

QUOTE(pepper @ Jun 28 2004, 23:45)
ЗЫ:Моделил дом для игрушки и в результате чего я тоже написал пару скриптиков по UVW mapping'y.

О, так мы коллеги? Тоже гейм мекер?
Так вот почему ты UVW мэппингу так помог быстро?! Кстате спасибо ещё раз!

Автор: Shiva 29/06/2004, 09:46

У меня другая идея...
Как насчет продолжить доброе дело мешьтулз??
У меня есть идеи инструменов, которых мне не хватает...
например все наверно знаете Grow и Shrink?!
И наверно знаете Ring и Loop?!
так вот.. очень часто мне надо Совмещенная команда.. т.е. чтобы Ring не окутывал кольцем всю модель а выделял лишь ближайшие 2е грани...
Смогете?..
а то у меня всейчас времени нету разбираться и вспоминать максскрипт..

Автор: Desead 29/06/2004, 10:11

to COOPER: ну вот, тебе уже ответили, а я ещё даже не посмотрел :-)

по поводу выделений loop тоже вопрос у меня есть. Кто нибудь занет сам алгоритм по которому происходит выделение, на глаз понятно что там последовательные рёбра. Есть некоторые мысли но чтобы не изобретать с нуля велосипед, лучше его апгрейдить так сказать.

to Shiva: а мештулз автор больше не изменяет ??? я как то не задавался просто этим вопросом. Я давно пытался поглядеть алгоритм с помощью которого он реализует свои функции, но либо мне в тот момент знаний скрипта не хватало, либо моего образования, вообщем я понял только поверхностно. И с твоим выделением тоже разберёмся :-) мне 2 дня осталось до сдачи этапа, и постараюсь тебе помочь, если никто другой не опередит конечно.

Автор: C00PER 29/06/2004, 11:31

QUOTE
Сам ответил на свой вопрос и не заметил:

Дык, ламер-с rolleyes.gif Спасибо! Ура! Работает! Ждите прикольную феньку cool.gif

QUOTE
У меня есть идеи инструменов, которых мне не хватает...
например все наверно знаете Grow и Shrink?!
И наверно знаете Ring и Loop?!
так вот.. очень часто мне надо Совмещенная команда.. т.е. чтобы Ring не окутывал кольцем всю модель а выделял лишь ближайшие 2е грани...

Хехе, мне тоже этого нехватает dry.gif

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

да, самый лучший выход это попытаться разобраться в готовом скрипте, как я и делаю tongue.gif

Автор: C00PER 30/06/2004, 11:36

А можно-ли каким-нибудь образом сохранить материалы нескольких объектов для того чтобы назначить их им же в дальнейшем? Ну наподобие вот того примера с цветами.

Автор: C00PER 30/06/2004, 21:16

Что за фигня? Или где я туплю?

Пишу функцию, которая бы реагировала на смену выделения на уровне подобъекта. Пользуюсь Change Handler'ом. Функция:

CODE

when select $.Poly_Select change handleAt:#redrawViews do print "shit"

Получаем, что когда к объекту применён модификатор Poly_Select, и в нём меняется выделение, пишется текст. Вроде всё работает.

Но когда вместо print "shit" я пишу getfaceselection $ $.Poly_Select, то почему то не работает! Хотя если эту функцию просто ввести в командной строке, то всё нормально, а вот на смену выделения никак не хочет цепляться, и главное - даже не выдаёт никакой ошибки, просто ничего не происходит...

Автор: Desead 30/06/2004, 21:30

QUOTE(Shiva @ Jun 29 2004, 10:46)
У меня другая идея...
Как насчет продолжить доброе дело мешьтулз??
У меня есть идеи инструменов, которых мне не хватает...
например все наверно знаете Grow и Shrink?!
И наверно знаете Ring и Loop?!
так вот.. очень часто мне надо Совмещенная команда.. т.е. чтобы Ring не окутывал кольцем всю модель а выделял лишь ближайшие 2е грани...
Смогете?..
а то у меня всейчас времени нету разбираться и вспоминать максскрипт..

вообщем скрипт вот, размещаю и файлом и в теле, чтоб если у кого вопрос возникнет, не спрашивал, а что ты сделал в 17 строчке :-), а более конкретно

------------------------------------------
macroScript Ring_2
category:"D_script"
toolTip:""
(
if (selection.count==1) and
(classof $ == editable_poly) and
(subobjectlevel==2) then
(--1
edge_s = polyop.getedgeselection $
final_edge=edge_s
i_end = (edge_s as array).count
for i=1 to i_end do
(--2
temp=polyop.getfacesusingedge $ (finditem edge_s (edge_s as array)[i])
vert1=(polyop.getvertsusingedge $ (finditem edge_s (edge_s as array)[i])) as array
temp=(polyop.getedgesusingface $ temp) - edge_s
y_end=(temp as array).count
for y=1 to y_end do
(--3
vert2=(polyop.getvertsusingedge $ (finditem temp (temp as array)[y])) as array

if (vert2[1] != vert1[1]) and
(vert2[1] != vert1[2]) and
(vert2[2] != vert1[1]) and
(vert2[2] != vert1[2]) then
(--4
new_edge=polyop.setedgeselection $ (finditem temp (temp as array)[y])
new_edge=getedgeselection $
final_edge=final_edge+new_edge
)--4
)--3
)--2
polyop.setedgeselection $ final_edge
update $
)--1

)
------------------------------------------
ставить его так - копируем в папочку Х:\3dsmax6\UI\MacroScripts\
после этого он появиться, при перезагрузке макса, в настройке хоткеев, квад меню, это уж куда тебе удобнее, можно и в бар вынести. Вопросы лучше здесь, но можно и в асю.

Пока писал столько идей о возможных выделениях в голову пришло !!!, если когда-нибудь всё-таки напишу модификатор edit_poly, то объязательно всё это туда вставлю, хотя лениво....жуть как :-)))

ps. кстати про выделять 2 соседних ребра, а само выделение считается ? я исходил из того что считается, то есть выделяется получается один ринг вокруг
...ну ежели не точно понял, то могу дополнить. Обратил внимание только что на это условие просто :-)

 Ring_2.mcr ( 1,03 килобайт ) : 7
 

Автор: Desead 30/06/2004, 21:38

QUOTE(C00PER @ Jun 30 2004, 12:36)
А можно-ли каким-нибудь образом сохранить материалы нескольких объектов для того чтобы назначить их им же в дальнейшем? Ну наподобие вот того примера с цветами.

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

Автор: C00PER 30/06/2004, 21:42

спасиб, я уже понял что материалы - это дохлый номер. тогда остаётся только Vertex Colors..

Автор: C00PER 30/06/2004, 21:46

Ого! Круто! Работает smile.gif Но ринг это хорошо, а вот если бы ещё в ширину росло (луп) это былоб вообще замечательно!
Кстати модификатор Едит Поли наконец-то БУДЕТ в 7 максе wink.gif

Автор: pepper 30/06/2004, 21:51

QUOTE
так вот.. очень часто мне надо Совмещенная команда.. т.е. чтобы Ring не окутывал кольцем всю модель а выделял лишь ближайшие 2е грани...

Вот мой скриптик:

ind1=polyop.getedgeselection $ as array
$.SelectEdgeRing()
ind_a=polyop.getedgeselection $ as array

polyop.setedgeselection $ ind1

$.EditablePoly.ConvertSelection subobjectLevel #Face
subobjectLevel = 4
$.EditablePoly.ConvertSelection subobjectLevel #Edge
subobjectLevel = 2

zz=polyop.getedgeselection $ as array
sel_ar=#()

i=1
for i=1 to ind_a.count do
(
for j=1 to zz.count do
(
if zz[j]==ind_a[i] then append sel_ar zz[j]
)
)
polyop.setedgeselection $ sel_ar
update $

Автор: C00PER 30/06/2004, 22:53

о, мастера, помогите тёмному! как заставить макс реагировать на выделение на уровне подобъекта! например при выделении фейса выполнять команду!

попробую поковырять PainterInterface rolleyes.gif

Автор: Desead 01/07/2004, 09:02

to pepper

QUOTE(pepper @ Jun 30 2004, 22:51)
QUOTE
так вот.. очень часто мне надо Совмещенная команда.. т.е. чтобы Ring не окутывал кольцем всю модель а выделял лишь ближайшие 2е грани...

Вот мой скриптик:

попроще у тебя скрипт будет, чё то наверное я намудрил у себя, надо твой попробовать :-)

в двух словах об используемом алгоритме можно ?
тоже изначально пробовал реализовать через стандартный Shrink, но при крестообразном выделении работало некорректно, пришлось напрямую всё прописывать.
я смотрю ты вообще не стал использовать bitarray, а мне пришлось конвертить то его в аррэй, то интеджер в битаррэй, намучился с этим.

QUOTE
о, мастера, помогите тёмному! как заставить макс реагировать на выделение на уровне подобъекта! например при выделении фейса выполнять команду!

не было необходимости сталкиваться, поэтому как помочь не в курсе

QUOTE
Ого! Круто! Работает  Но ринг это хорошо, а вот если бы ещё в ширину росло (луп) это былоб вообще замечательно!
Кстати модификатор Едит Поли наконец-то БУДЕТ в 7 максе


ээээ..поподробней тогда, а то не понял, то есть нужен такой же вариант, то есть на выделение только двух соседних рёбер, но лооп, так ?

ну всё, если поли наконец то будет в 7 максе, то теперь я себя уж точно не заставлю сесть за его написание :-)


QUOTE
спасиб, я уже понял что материалы - это дохлый номер. тогда остаётся только Vertex Colors.


ну почему, в принципе там всё понятно, только вот доступ есть не ко всем функциям, допустим простецкая вроде кнопочка - Put material to scene, а через скрипт этого не так просто реализовать, прямой функции нет.

Автор: C00PER 01/07/2004, 10:55

Ура! У меня получилось!!!! Я сделал ПОЛИГОНАЛЬНУЮ СИСТЕМУ КООРДИНАТ! Причем, независимую от класса объекта - будь то Меш, Поли, Примитив и даже Нурбс. При старте она запросит сначала выделить объет, а затем выделить на нём Полигон. И всё! готова новая система координат smile.gif Ну и намучался же я с этим Painterinterface smile.gif На данный момент, это самое сложное из всего что я сделал за время изучения Максскрипта, а изучаю я его меньше недели rolleyes.gif

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

http://alexcooper.nm.ru/stuff/Cooper-PolyCoordinateSystem.zip

Апдейт - теперь, после создания системы координат, возвращает на тот уровень выделения, на котором был до начала функции cool.gif

Автор: 111 01/07/2004, 21:47

ну вы ребяты монcтры просто какие то. я тоже скриптом балуюсь помаленьку, по надобности...

кстати, объясните алгоритм Loop select и ring select

Автор: Desead 02/07/2004, 12:08

to pepper: посмотрел скрипт, всё просто и понятно, и чего спрашивается я не стал использовать готовое решение - ring, а написал его заново, не понятно.
кстати здесь :
$.EditablePoly.ConvertSelection subobjectLevel #Face
subobjectLevel = 4
$.EditablePoly.ConvertSelection subobjectLevel #Edge
subobjectLevel = 2
можно было и не ходить по уровням, убрать их вообще и во второй строчке написать $.EditablePoly.ConvertSelection #face #Edge
ну это я так, мысли вслух :-)))

QUOTE
ну вы ребяты монcтры просто какие то. я тоже скриптом балуюсь помаленьку, по надобности...
кстати, объясните алгоритм Loop select и ring select


я ринг реализовал так:
текущее выделение рёбер преобразовал в фейсы а их опять в рёбра,
получился контур рёбер вокруг выделения. Этот контур и начальное выделение пораздельности преобразовал в вертексы ,т.е. каждому ребру соответствовало 2 вершины, и вот их то и сравнивал. Если одна из вершин первого ребра совпадает с любой из вершин начального выделенного ребра, значит первое ребро нам не подходит, иначе - оно нужное, и.т.д, перебирая все рёбра и сравнивая вершины с начальным выделением. правда есть маленькое отличие от стандартного ринга, при работе с фейсам имеющими 5 и более рёбер ,стандартный ринг ничего не выделяет, а этот алгоритм выделит те рёбра которые не соприкасаються с выделенным, но это скорее расширение чем недостаток, т.к. можно сделать просто ещё одно условие работы скрипта- если у фейса более 4 ребёр то я вообще не работаю - т.е. будет стандартный ринг :-)

а с лупом тоже самое думаю, только выбираешь рёбра по совпадающим вершинам , а не по разным, и то же самое изменение от стандартного лупа будет.
ну вот собственно и всё :-)))

Автор: pepper 02/07/2004, 14:56

QUOTE
$.EditablePoly.ConvertSelection #face #Edge

буду знать. спасибо.

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

с лупом(мой вариант):выделенному еджу делаем Grow и сравниваем полученные еджи с еджеми полученными от лупа.

Автор: Desead 02/07/2004, 18:53

тут поступило предложение дополнить всё это дело ещё и лупом, и подобным шринком...забацаем ! :-)

to pepper:
дальше буду делать как ты, через стандартные средства, так меньше работы получается :-)

Автор: pepper 03/07/2004, 12:08

QUOTE
тут поступило предложение дополнить всё это дело ещё и лупом, и подобным шринком...забацаем ! :-)


вот луп:

ind1=polyop.getedgeselection $ as array
$.SelectEdgeLoop()
ind_a=polyop.getedgeselection $ as array

polyop.setedgeselection $ ind1
$.EditablePoly.growselection()
zz=polyop.getedgeselection $ as array
sel_ar=#()

i=1
for i=1 to ind_a.count do
(
for j=1 to zz.count do
(
if zz[j]==ind_a[i] then append sel_ar zz[j]
)
)
polyop.setedgeselection $ sel_ar

update $

QUOTE
дальше буду делать как ты, через стандартные средства, так меньше работы получается :-)


Ну и зря. Простой вариант не всегда лучше сложного. Мой алгоритм переберает все эджи полученные от ринга или лупа, т.е. чем больше плотность сетки, тем дольше будет происходить сравнение. В твоем алгоритме сравнивается фиксированное число точек и число сравнений не зависит от сложности сетки модели, что и сказывается(положительно) на производительности wink.gif

Автор: C00PER 03/07/2004, 14:30

здорово! приятно видеть мастеров за работой %) уже добавил оба скрипта в набор полезных тулзов. Pepper, вставь в начало кода disablesceneredraw() а перед update $ enablesceneredraw()

Автор: Desead 05/07/2004, 08:17

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

QUOTE
Ну и зря. Простой вариант не всегда лучше сложного. Мой алгоритм переберает все эджи полученные от ринга или лупа, т.е. чем больше плотность сетки, тем дольше будет происходить сравнение. В твоем алгоритме сравнивается фиксированное число точек и число сравнений не зависит от сложности сетки модели, что и сказывается(положительно) на производительности

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

Автор: Shiva 05/07/2004, 08:36

pepper и Desead - молодцы! yes.gif
Только хорошо бы все скрипты доводить до полезной завершенности.
Loop я так понял тоже работет только в одну сторону?!..
Давайте все таки соберем этот набор из Selection Tool в нечто полноценное и отдадим народу в пользование. )
Сам с удовольствием буду пользоваться. laugh.gif
я это вижу как 4е инструмента - 4е иконки на тулзбаре..
иконки могу нарисовать..
1) Grow Ring
2) Shrink Ring
3) Grow Loop
4) Shrink Loop
Но не забывайте, это инструмет, а инструмент должен быть быстрым и надежным!
Если он будет тормозить работу или глючить - толку тогда от него?..
Вспоминаю (да именно вспоминаю) CleanCut... замечательный удобный инструмент... если бы не вылетал раз в 5 минут!! mad.gif

Автор: Eraser 05/07/2004, 09:39

Странно что у тебя с клинкатом проблемы - у меня все путем, не знаю даже как без него сейчас было бы smile.gif

Автор: pepper 05/07/2004, 10:27

QUOTE
Loop я так понял тоже работет только в одну сторону?!..

Что значит "тоже" и в одну сторону?
Все работает как и просили: выделяется по 2 эджа смежных с выделенными эджами.

QUOTE
1) Grow Ring
2) Shrink Ring
3) Grow Loop
4) Shrink Loop

А что каждый должен выполнять?

Автор: C00PER 05/07/2004, 13:18

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

Автор: Shiva 05/07/2004, 22:05

Именнно! )
каждый из них должен выполнять свою аналогию..
1) Grow Ring - выделение увеличиваеться по кольцу <IIII>
2) Shrink Ring - выделение уменьшаеться по кольцу >IIII<
3) Увеличиваетьяс по "Смежным"??? <---->
4) уменьшаетсья по смежным. >----<

Автор: Desead 07/07/2004, 10:17

QUOTE(Shiva @ Jul 5 2004, 23:05)
Именнно! )
каждый из них должен выполнять свою аналогию..
1) Grow Ring - выделение увеличиваеться по кольцу   <IIII>
2) Shrink Ring  - выделение уменьшаеться по кольцу   >IIII<
3) Увеличиваетьяс по "Смежным"???   <---->
4) уменьшаетсья по смежным.  >----<

я вроде наконец то понял как должен работат shrink ring и shrink loop, на выходных если получиться со временем то попробую написать :-)))

Автор: pepper 07/07/2004, 10:56

А я вроде уже сделал. cool.gif tongue.gif
С шринк лупом проблем почти нет.
А вот шринк ринг не работает только если веделенны ВСЕ грани рига(от одного края объекта до другого).....короче, тестим!
Если всё устроит, то заверну все скрипты, чтобы можно было хоткеи назначить

 shrink2.zip ( 930 байт ) : 474
 

Автор: Desead 07/07/2004, 13:34

2 pepper: ...качаем, тестим, щас чё нить скажу :-)))

слегка глянул, при не 4 угольных полигонах работает loop странно, остальное пока не глядел :-)

Автор: Desead 07/07/2004, 15:37

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

1. на discreet есть документ - maxscript referense version four от января 2001 г, кто-нить встречал версию поновее ?

2. кто-нить знает насколько аккуратно скрипт работает с оперативной памятью, а то возникает ощущение что он всё очень сильно засоряет и за собой не убирает

3. кто-нить делал аналог майковского append polygon- а то строить полигоны по вертексам достало, по рёбрам быстрее.

4. в unwrap есть 2 очень полезные тулзы - stitch selected и pack uvs, но как и многое в максе до ума не доведённые. Кто нибудь их переделывал ? а то мне сейчас предстоит это делать. Проблема в следующем: при упаковке остаётся много свободного места, наверняка можно использовать более продуктивный алгоритм сортировки, а при склеивании(stitch) макс масштабирует только ребро, а не весь элемент - но ведь это же глупо, намного быстрей можно было раскладывать всё при наличии нормального ститча.

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

уххх... ну вроде всё, надеюсь хоть кто-то с чем-нить сталивался

Автор: 111 07/07/2004, 20:34

ага, посмотрим как вы shrink победите smile.gif

Автор: Desead 09/07/2004, 12:46

2 pepper: вообщем просидел я с твоим шринком 2 дня, ничего не понял как ты пытался его реализовать, понял только что ищешь бордюры, и их удаляешь, что происходит дальше, то есть для чего ты сравниваешь одни и теже фейсы в циклах while я не понял. Если оттолкнуться от того что в обычном массиве номера фэйсов будут повторяться, то это можно как-то использовать и кроме определения бордюра, что наверное ты и старался сделать, вообщем если ты объяснишь суть вот этого кусочка, то был бы рад. И кстати на мой взгляд просто удалять бордюр нельзя не ссылаясь на соседние рёбра, так можно и лишнего наубирать, но это уже зависит от того как мы понимаем алгоритм работы шринка.

а вот и непонятный кусочек:

i=1
while i<=pa.count-1 do
(
j=i+1
b=0
clearlistener()
format "i=% j=% b=%\n" i j b
while j<=pa.count do
( ----- while 2
if pa[i]==pa[j] then
(
deleteItem pa j

b=1
j-=1 --cause we deleting 1 element
)
j+=1
) ----- end while 2
if b==1 then
(
deleteItem pa i
i-=1
)
i+=1
)

и ещё чуть не забыл, если выделено всё, то шринк и не должен работать, ему не отчего отнимать :-)

чё то все молчат....и в аськах тоже

to 111: а почему ты думаешь что со шринком могут быть проблемы?
это вроде обычный алгоритм поиска решений

Автор: pepper 09/07/2004, 13:40

Алгоритм едж шринка:
1.выделенные ребра преобразуем в полигоны
2.создаем массивчик в который записываем полигоны, пренадлежащие данному еджу
Если выделенны 2 соседних еджа, то полигон в таком массиве встретится 2 раза.
Если полигон встречается 1 раз, то он являлется "крайним"(из которого мы получим крайние еджи))

Теперь непонятный кусок:
3.елси полигоны совпадют(их может быть >2) удаляем их из массива
(т.к. нам нужны полигоны, которые встречаются 1 раз)

CODE

i=1
while i<=pa.count-1 do--перебираем до предпоследнего елемента
(
j=i+1--наинаем сравнивать с позиции следующего элемента
b=0 --а было ли совпадение
clearlistener()
format "i=% j=% b=%\n" i j b
while j<=pa.count do --перебор до последнего елемента
( ----- while 2
if pa[i]==pa[j] then--совпали
(
deleteItem pa j--удаляем

b=1--отмечаем что совпали
j-=1 --массив уменьшился,значит счетчик тоже уменьшаем
)
j+=1--следующий елемент
) ----- end while 2
if b==1 then --если было совпадение
(
deleteItem pa i--удаляем елемент
i-=1--уменьшаем счетчик
)
i+=1 --следующий елемент
)

Я не использовал цикл for т.к. он не позволяет уменьшать счетчик.
Поэтому выбрал while.

4.выделяем полученные "крайние" полигоны
(их можно увидеть перейдя на уровень полигонов после выполнения скрипта)
5.конвертим их в еджи
6.вычитаем: (первоначально выделенные еджи)-(еджи от "крайних" полигонов)

Особенность конвертации еджей в полигоны(пункт 1) состоит в том, что
если едж крайний, то один из его полигонов будет с индексом 0!
Значит 4 пункт не работает(в объектах нет полигона с индексом 0).
То есть он работает(я удаляю 0 элементы), но не учитывается
.............
.............
у-у-у....появилась идея....
если едж крайний и он выделенный, то он однозначно должен быть не выделенным(после шринка)
.....надо замутить.....

Автор: 111 09/07/2004, 13:46

так изложите алгоритм шринка на человеческом языке

Автор: pepper 09/07/2004, 14:32

QUOTE
так изложите алгоритм шринка на человеческом языке

Это на каком? blink.gif biggrin.gif

Короче вот. Теперь шринк ринг роботает как надо!
Лип шринк в предыдущем файле.

 ring_shrink2.zip ( 600 байт ) : 478
 

Автор: Desead 09/07/2004, 14:38

to pepper: сам код то ясен, и про индексы полигонов 1 и 2 тоже понятно, мне именно алгоритм не понятен используемый тобой, без привязки к конкретному языку.

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

Автор: pepper 09/07/2004, 15:03

Алгоритм такой:
Каждому еджу соответствует только 2 полигона.
(на рисунке стрелками показано соответствие эджа полигону)
Эти полигоны записываем в массив. Если их >2(на рисунке указано число повторений полигона в массиве), значит выделены соседние эджи.
Если полигон в массиве встречается один раз, значит он крайний и эдж его тоже крайний.

 

Автор: Desead 09/07/2004, 15:28

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

Автор: Desead 10/07/2004, 19:14

to pepper:
вообщем мы немного по разному представляем себе алгоритм работы шринка и поэтому скрипты работают по разному. Я исходил из следующих соображений: от выделенных рёбер нужно получить такое выделение, которе при использовании ринга на 1 ребро(ну то что мы раньше написали) даст начальное выделение. хотя мне кажется в некоторых моментах ты не до конца прав rolleyes.gif
вообщем скрипт вот:
-----------------------
macroScript Srink_ring
category:"D_script"
(
if (selection.count==1) and
(classof $ == editable_poly) and
(subobjectlevel==2) then
(--1
edge_selection = polyop.getedgeselection $
if (edge_selection as array).count < 3 then
(--2
polyop.setedgeselection $ #{}
update $
)--2
else
if edge_selection.numberset != edge_selection.count then
(--3
$.shrinkselection ()
shrink_edge=getedgeselection $
temp_edge=edge_selection
del_edge=#{}

while not(temp_edge.isempty) do
(--4
i_edge=(temp_edge as array)[1]
setedgeselection $ #{i_edge}
$.selectedgering ()
i_edge=getedgeselection $
i_edge*=temp_edge
setedgeselection $ i_edge

if i_edge.numberset < 3 then del_edge+=i_edge
else
(--5
temp_face=#()
for j=1 to i_edge.numberset do
(--6
append temp_face ($.getedgeface (i_edge as array)[j] 1)
append temp_face ($.getedgeface (i_edge as array)[j] 2)
)--6
for j=1 to temp_face.count do
(--7
x=temp_face[j]
temp_face[j]=0
df=finditem temp_face x
if df != 0 then temp_face[df]=0
else temp_face[j]=x
)--7
for j=1 to temp_face.count do
if temp_face[j] != 0 then
(--8
te=polyop.getedgesusingface $ (temp_face[j])
del_edge=del_edge+te*i_edge
)--8
)--5
temp_edge=temp_edge-del_edge-i_edge
)--4
setedgeselection $ (edge_selection-del_edge+shrink_edge)
update $
)--3
)--1
)
-----------------------

с лупом проще, это точно. В нём у меня теже различия с тобой что и в шринке, но так как ещё не известно что Shiv'e больше подойдёт пока луп не стал делать, может и вовсе не придётся :-)))

2 Shiva: ну собсна смотри, то что ты хотел или как ?

to 111: Алгоритм шринка в моём понимании(тот который в максе а не тот который используется скриптом) независимо от подуровня, переводим выделение в рёбра, и если ребро является бордюром то соотвествующее ему начальное выделение удаляем, повторяем для всех рёбер. вот и всё

 shrink_ring.mcr ( 1,51 килобайт ) : 0
 

Автор: pepper 11/07/2004, 13:58

2 Desead:

QUOTE
Я исходил из следующих соображений: от выделенных рёбер нужно получить такое выделение, которе при использовании ринга на 1 ребро(ну то что мы раньше написали) даст начальное выделение...

Я уже писал: простой алгоритм не всегда эффективный по быстродействию.
Сравни время своего и моего скриптов:
start=timeStamp()
-----------
script
-----------
end=timeStamp()
format "time=%" ((end-start)/1000.0)
Причем у меня учитываются бордеры(borders) объектов(на которые тратится бОльшая часть времени),а у тебя - нет.

QUOTE
хотя мне кажется в некоторых моментах ты не до конца прав

В каких?blink.gif

QUOTE
но так как ещё не известно что Shiv'e больше подойдёт пока луп не стал делать, может и вовсе не придётся :-)))

По-моему они все дружно забили на эти скрипты, а говорили очень надо....wacko.gif

QUOTE
to 111: Алгоритм шринка в моём понимании(тот который в максе а не тот который используется скриптом) независимо от подуровня, переводим выделение в рёбра, и если ребро является бордюром то соотвествующее ему начальное выделение удаляем, повторяем для всех рёбер. вот и всё


Ну а другого алгоритма быть и не может. Главное - как найти этот "бордюр".

Автор: C00PER 11/07/2004, 15:38

никто не заби(ы)л! все с интересом наблюдают, что же будет дальше! smile.gif

Автор: Desead 12/07/2004, 09:07

3 pepper:

QUOTE
Я уже писал: простой алгоритм не всегда эффективный по быстродействию.
Сравни время своего и моего скриптов:

с этим и не спорю, это на 100% верно. К примеру -взял сферу, сверху meshsmooth с 3 или 4 итерациями, вообщем > 240000 поликов. мой вариант напрягался аж 36 секунд, твой всего 14 :-)

QUOTE
QUOTE

хотя мне кажется в некоторых моментах ты не до конца прав

В каких? blink.gif

возьми сферу, и создай крестообразное выделение - то есть 4 ребра и попробуй: ничего не происходит. потом попробуй добавить по несколько последовательных рёбер с любых сторон(loop) - после применения скрипта у нас опять остаёться начальный крест. то есть скрипт-ring_shrink2, а работает как loop в данной ситуации

собственно почему я так утверждал что по моему мнению ты не до конца прав - потому что у тебя нет проверки на паралельные рёбра, тоесть если у конкретного ребра есть его ring-рёбра, то крайние из всего этого набора нужно удалить, именно поэтому и нет смысла вообще искать бордюры.
Я старался действовать так, но увеличивать объём кода чтоб ручками искать ring-последовательность от каждого ребра было лениво smile.gif поэтому я и воспользовался стандартным рингом и потом логическим AND узнал всю последовательность. вот и всё, надеюсь понятно написал biggrin.gif

Автор: C00PER 13/07/2004, 15:04

а я вот тут тоже без дела не сидел, и написал скрипт, который, внимание, конвертирует выделение ЭДЖЕЙ на уровне ЭДИТАБЛЕ ПОЛИ в ВЕРТЕКСЫ в ОКНЕ УНВРАП ЕДИТОРА! Так как в УНВРАП эдиторе нету Эджлупов и Рингов, вы выделяете на уровне едитабле поли с помощью эджей, а этот скрипт переносит это выделение на вертексы прямо в УНВРАП Эдитор! Чёрт, вот это было сложно %) Чуть репа не лопнула, оказывается у геометрического вертекса и у текстурного вертекса номера совсем разные, но номера ФЕЙСОВ всегда одинаковые, и благодаря этому можно вычислить какой геометрический вертекс соответствует текстурному!
Скрипт вроде работает, НО! Он работает по немного упрощенной схеме, поэтому он быстрый, но иногда может неправильно выделять КРАЙНИЙ ВЕРТЕКС! Как правило всего лишь один вертекс может быть выделен неправильно. Я думаю сделать более точную версию, но она будет медленнее... Поживем увидим, а пока:

 EdgeToUVWConvert.zip ( 632 байт ) : 329
 

Автор: 111 13/07/2004, 15:41

полезный стрипт

Автор: C00PER 13/07/2004, 16:35

щас я его заверну в MCR, и он станет ещё полезнее..
мастера, объясните, что за баг: после всех операций, проведенных скриптом, он как то отрицательно реагирует на команду $.unwrap_uvw.unwrap.edit(), и окошко, не успев открыться, сразу же закрывается... Я решил продублировать команду, вроде помогло.., но пока буду это место иметь ввиду.. И ещё, чем отличается команда $.unwrap_uvw.unwrap.edit() от $.unwrap_uvw.edit() ? Обе действуют одинаково

Автор: Teapot 13/07/2004, 16:39

off_top.gif
Умные вы парни, факт. А вот научить Макс чертить и печатать по автокадовски - слабо rolleyes.gif

Автор: C00PER 13/07/2004, 16:48

вот первый кандидат на бетатестирование очень неплохо сидит в Кваде, и не появляется пока не соблюдены условия: должен быть выделен объект, он должен быть Едитабл Поли, и находиться вы должны на уровне Еджей. У меня он прошёл успешное тестирование, как на примитивах, так и на тяжеленных сетках, изуродованных всякими оптимайзами, но всякое бывает.

 

 EdgeToUVWConvert.zip ( 669 байт ) : 355
 

Автор: Desead 13/07/2004, 16:51

to COOPER: то что в анврапе нельзя выделять как в поли это бесит, но опять же есть стандартные средства для этого (COOPER только не кидай в меня камнями, я уже на второй твой скрипт так говорю :-)) )
я поступаю так выделяю в поли что мне надо, потом конвертю в поли и сверху анврап, и всё это выделение там, либо можно выделение передать через 2 подряд меш/поли селект. Но скриптом конечно быстрее, так что штука полезная, бесспорно.

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


кстати COOPER у тебя ася не пашет я так понял ?

Автор: C00PER 13/07/2004, 17:06

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

а стандартными средставми я щас попробовал, чего-то у меня не получилось. дело в том, что в Анврапе всё-же принято работать с вертексами, а выделять проще Эджами (лупами), вот я и взялся за написание.

ася работает, и практически всегда включена, просто я в инвизе. так что стучи, но сначала назовись, а то не открою smile.gif

Автор: Desead 13/07/2004, 18:28

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

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

Автор: C00PER 13/07/2004, 19:02

ну тогда в конце можно будет добавить вариант с эджами и поли wink.gif

Автор: 111 13/07/2004, 22:18

наверное вы все знаете но всё же, на всякий случай

если лениво ошибки ловить

silentErrors:TRUE

или что наверное более правильно

try
(
)
catch
(
)

Автор: C00PER 13/07/2004, 22:24

оп! я вроде делал через трай... видать когда копировал код в макроскрипт, эту часть упустил.. а что, глючит? где именно?

Автор: C00PER 13/07/2004, 22:49

так, совсем я засиделся, уже гоню малость.. ведь точно помню что писал $.modifiers[#unwrap_uvw].unwrap.edit () ДВА раза, и сохранял, а сюда выложил нефиксенную! Извиняюсь, если кому то причинил неудобства, вот фиксенная, и через Try wink.gif

 EdgeToUVWConvert.zip ( 634 байт ) : 316
 

Автор: C00PER 14/07/2004, 02:42

ёёёё!! только что узнал что в UVW Unwrap Editor'e ЕСТЬ ЭДЖЛУП!!!
Вот эта команда! Быстро засовывайте её в менюхи!

$.unwrap_uvw.uvEdgeSelect()

Млять, сколько ещё я буду находить недокументированные возможности в Максе ?!? stena.gif stena.gif stena.gif

п.с., но всё-равно, с теми штуками, что тут были сделаны Desead'om и Pepper'ом выделять всёже удобнее через EPoly а потом кидать в Unwrap

Автор: Desead 14/07/2004, 08:46

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

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

Автор: Shiva 15/07/2004, 12:23

Хм, COOPER, а можешь подробно описать Как ее туда запихнуть? (

Автор: C00PER 15/07/2004, 13:18

В listener, но при открытом окне UVW Editora, ну и естественно при имеющемся выделении Эджей

Автор: Shiva 15/07/2004, 18:28

Не, ты не понял.. ты говорил - забиндить кудысь..
было бы удобно его запихнуть вот в Квадру по кравой кнопке. (см. рис)
или к примеру добавить в UVWTools (script) но это уже посложнее наверно.
Кстате UVWTools это та фигня справа с кучей всякой полезности для анврапа. wink.gif
нашел на scriptspot.com

 

Автор: C00PER 15/07/2004, 21:10

аа, ну просто эту команду оформляешь как макроскрипт (*.mcr), кладешь в УИ\Макроскриптс, затем идешь в настройку Квадов, справа выбираешь Unwrap UVW Quad и перетаскиваешь туда этот скрипт

CODE

MacroScript UVWedgeLoop
category:"Cooper"
tooltip:"UVWedgeLoop"
(
$.unwrap_uvw.uvEdgeSelect()
)

Автор: Shiva 16/07/2004, 00:37

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

Автор: Shiva 18/07/2004, 14:34

2pepper: дошли у меня руки до твоих скриптов.
Прикольно. biggrin.gif
Почти то что надо. Почти.
Только что ганял скрипт - LoopShrink...
выцепил Глюк..
вот в такой ситуации как на картинке LoopShrink уже ничего не делает.
в чем прикол.. в том что ты проверяешь наличие Любых смежных граней, а не только по Loop... в чем прико лупа.. он работает ТОлько в случае если из одной точки выходят 4е грани.. тут и просто определить какая из них являеться Продолжением, а какие две являються Пересекающими.
Но!!
Этот скрипт который у тебя получился Тоже ОЧЕНЬ полезен..
Я бы его назвал Shrink Free Edge.
yes.gif

Ща буду дальше его гонять..
(скоро выпустим коллекцию скриптов от 3д центра biggrin.gif )

 

Автор: Shiva 18/07/2004, 14:51

ХаХаХа!! laugh.gif
С RingShring таже фигня но наоборот... он оставляет Разомкнутые грани. т.е. как бы в противоположность претидущемю. biggrin.gif
Супер!!
У нас уже есть 2а дополняющих скрипта!
И не одного того что задумывалось с начала ))))
Надо придумать понятное название Этому скрипту.. тоже полезен будет. wink.gif

 

Автор: Shiva 18/07/2004, 15:11

Сейчас попробую разтолковать как Правильно...
(блин.. чувствую надо самому учить скрипт)
В случае с Лупами надо сначала сделать проверку (1):
есть выделенная грань, у которой есть два конца (vetrex)...
скрипт Отдельно работает с КАЖДЫМ вертексом.
с начала к пример у левым (как на картинке)
в идеале из этого вертекса долно исходить ЕЩЕ 3 грани! не больше и не меньше! (итого на 1 вертекс 4 грани)
тут не трудно определить что нам нужна Одна (голубая), остальные игнорируються как "пересекающие".
именно ЕЕ (голубую) мы выделяем в случае с Grow и именно по ней мы ориентируемся в случае с Shrink! (т.е. если она не выделена то мы убираем выделение и с нашей красной грани)
Остальные просто игнорируються!!!

НО, если в случае с GROW это условие с (1 vertex - 4 edge) Должно выолняться (иначе Grow не должен происходить) то в случае с Shrink - Если их НЕ четыре то учитываються Все.. т.е. надо чтоб на всех небыло выделения только тогда убераеться выделение с красной грани.

Потом также процедура происходит и с Правым (вторым вертексом) (если конечно к этому времени наша красная грань не потеряла и так выделения.)

 

Автор: Shiva 18/07/2004, 15:49

Я ПРИДУМАЛ.. все просто!!!
GrowRing:
1) к выделеннию примени Grow
2) запомни какие грани выделелись.
3) отмени Grow
4) Примени Ring
5) через булиановскую опирацию AND сравни Запомненной и текущее выделение.
Все! )))

Остальное по томуже принципу

Автор: pepper 19/07/2004, 21:04

2Shiva: переделал скрипт луп шринка. Если подойтет - свисни. happy.gif

 loop_shr3.zip ( 531 байт ) : 361
 

Автор: Shiva 19/07/2004, 23:09

QUOTE(pepper @ Jul 19 2004, 22:04)
2Shiva: переделал скрипт луп шринка. Если подойтет - свисни. happy.gif
[right][snapback]191668[/snapback][/right]


Неподходит ))))
Все отлично, но попробуй выделить 1 или 2 еджа рядом... не работает! (
Причем прикол:

I
o--
I

Не работает..
а если:

I
o---
I

то работает Правильно.. т.е. результат:

х
ох-х
х

П.С. ( о - Vertex smile.gif )
Вот. )))

Почему не попробудешь сделать как я описал только с Shrink?

Автор: pepper 20/07/2004, 11:58

QUOTE
Неподходит ))))
Все отлично, но попробуй выделить 1 или 2 еджа рядом... не работает! (
Видать я вчера пережарился на солнышке.blush.gif
Исправь последние сторки:
CODE

ss=((ea as bitarray)-polyop.getEdgeSelection $)
if (ss as array).count!=0 then
polyop.setEdgeSelection $ ss else
polyop.setEdgeSelection $ ea
enableSceneRedraw()
update $
на
CODE

ss=((ea as bitarray)-polyop.getEdgeSelection $)
polyop.setEdgeSelection $ ss
enableSceneRedraw()
update $


QUOTE
Почему не попробудешь сделать как я описал только с Shrink?

А ты пробовал для --- применить шринк?

Автор: Shiva 20/07/2004, 16:20

Отлично. Работает...
Кстате Cooper сделал ShrinkRing по моему алгоритму... )
тоже отлично работает...
но тоже Очень медленно..
он сейчас работает над увеличением скорости... успешно причем..
смысл в том чтобы откинуть изночално ненужные еджи... %)

Автор: C00PER 20/07/2004, 17:57

... стой, какой shrink ring? я не делал никакого shrink ring smile.gif

Автор: Shiva 20/07/2004, 22:37

QUOTE(C00PER @ Jul 20 2004, 18:57)
... стой, какой shrink ring? я не делал никакого shrink ring smile.gif
[right][snapback]192089[/snapback][/right]


Упс.. сорри я тебя с Desead перепутал. wacko.gif

Автор: Desead 27/07/2004, 12:33

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

2 Shiva, вообщем ломал я голову над скоростью и пришёл к неутешительному выводу что если писать руками некоторые стандартные вещи то скорости это не даст. у меня соображений пока нет никаких. получается на тяжёлой модели скорость с ~80 до ~60 сек уменьшил за счёт скрытия ненужных фэйсов, и всё, дальше наверное тупик, если на С не переходить конечно, но это глупо для такой тривиальной задачи.

Автор: Shiva 27/07/2004, 20:36

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

Насчет скрипта - не волнуйся, мало кто моделит поликами Тяжелые модели. если не трудно - приведи его в божеский вид, и соберем наконец это Selection Tools from 3Dcenter wink.gif

Автор: C00PER 27/07/2004, 21:26

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

зато уже просто задолбали с одними и теми-же вопросами типа как сделать стекло, почему хром не такой как на картинке, почему врей не рендерит, или вообще перлы типа "люююююююди хееелп!!!!! я в тридемаксе роботаю третий день, по чему у миня не как ни палучается зделать мошину??????? может кто мне скинет на емейл????????????????"

Автор: Shiva 28/07/2004, 07:48

ЭЭЭЭ.... я понимаю, наболело.. но харе офтопить. wink.gif
у меня иконки уже готовы, хочу скрипты финальные увидеть, готовые к инсталяции в тулбар. 8D

Автор: C00PER 28/07/2004, 09:02

Ну ладно ладно wink.gif У меня есть мега-предложение. А давайте-ка сделаем нормальный Chamfer smile.gif Чтобы не гладкий срез был, а скруглённый с заданным радиусом и количеством сегментов. Я наверное раз сто слышал от совершенно разных людей такое пожелание и сам с ними целиком согласен smile.gif

Мой план таков (хотя он безусловно может быть неверным изначально):

Сначала выделяем нужные эджи (рис 1) и делаем обычный чамфер (рис 2)

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

user posted image

user posted image

user posted image

user posted image

user posted image


Хоть на первый взгляд это и кажется фантастикой, я сам дошёл аж до пятого пункта, и при этом в конце у меня имелось сохранённое выделение граничных эджей, полученных после чамфера (рис 2), затем имеются номера промежуточных эджей (рис 3) и номера соответствующих этим эджам вертексов. То есть мы знаем что "в эдже номер 9, полученном после чамфера используются вертексы номер 4 и 13" а потом, когда этот эдж разобъется на много новых эджей, мы наверное как нибудь можем использовать полезно эту информацию о старых вертексах.

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


Есть ещё извращенческий вариант - использовать Arc Shape и Bevel Profile. Сначала рисуется арка между вертексами (как - не имею ни малейшего представления smile.gif ) Затем из эджа объекта делается сплайн, и ко всему этому хозяйству применяется Bevel Profile. Последнего даже настраивать не надо, главное сместить Пивот арки в её основание, то есть в самый низ

user posted image

user posted image

user posted image


интересно послушать мнения мастеров по поводу этого бреда.



Что интересно - я нашёл нечто похожее в CSPolyTools. Там есть функция Push, которая выдавливает вертексы вдоль их нормалей (точнее нормалей смежных фейсов). В принципе функция давно устарела, так как такое можно сделать просто переключив координатную систему на Локальную, но нам это может пригодиться. Ещё, там же есть функия Spherify, которая сдвигает выделенные вертексы относительно заданной точки, таким образом что они сформировывают сферу. Так что, почти всё есть для нормального чамфера, осталось только всё это собрать воедино smile.gif

Автор: Desead 28/07/2004, 11:26

2 Shiva: вот финальная версия, постараюсь послезавтра на её основе луп сварганить
у файлика меняем раширение на mcr, а то сюда нельзя такие заливать

 D_script_ShrinkRing.txt ( 1,89 килобайт ) : 460
 

Автор: Shiva 28/07/2004, 14:24

2 C00PER: думай прощще.. Чамфер это Актуально.. даже Очень.. я прост не хотел еще и этим вас грузить )))
и так... есть РАДИУС и есть кол-во сегментов...
все просто - применяем Обычный чамфер столько раз, сколько сегментов у нас надо /2 и радиус тоже уменьшаем у каждого следующего толи в 2а толи в 4е раза..

 

Автор: C00PER 28/07/2004, 17:03

ерунда wink.gif хочу нормальный чамфер

Автор: Desead 28/07/2004, 17:08

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

блин, пока я писал, уже твая ерунда появилась :-)))

Автор: C00PER 28/07/2004, 19:53

Desead, вспомни что я говорил в начале нашего разговора - всё будет не так просто. А ты - "это же элементарно, простая матиматика" wink.gif Выходит я был прав tongue.gif А несколько чамферов получаются неровно! Как бы ты не старался побдирать значения

Автор: Shiva 28/07/2004, 20:42

QUOTE(C00PER @ Jul 28 2004, 18:03)
ерунда wink.gif хочу нормальный чамфер
[right][snapback]196399[/snapback][/right]


что в твоем понимании Нормальный?..
Если правильно выбрать коеффициент уменьшения стандартного чамфера для каждой следующей итерации (скорее всего по косинусу) то получишь Отличный чамфер.. правда - только четный.

П.С. и опять таки - это ЧИСТЕЙШАЯ математика.. и то что человек потупился заглянув в учебник - не значит что там нет ответа!

Автор: Eraser 28/07/2004, 21:03

Согласен с Шивой, че марочится с дугой, если результат будет такой же как если бы чамферили находя промежуточное расстояние. Проблема в том как это расстояние найти smile.gif

Автор: Shiva 28/07/2004, 22:35

вы конечно будете плеваться, но:
aa = 10
for i=1 to 3 do
(
aa = aa / 2
print aa
$.edgeChamfer = aa
$.EditablePoly.buttonOp #Chamfer
)


но вопрос с коефициентом не отпадает ((.. он должен быть гдето 2.2хххх

Автор: Desead 29/07/2004, 11:17

2 COOPER: конечно только математика :-) здесь больше ничего и не надо. Я подхожу не только со стороны сложности скрипта, а ещё и со стороны трудозатрат. Допусти я только час убил чтобы вспомнить, найти и вновь понять что такое арккосинус, так как понятное дело что в повседневке это мне не надо.
Я согласен что приятнее работать с чемфером который, ты знаешь, создаёт скос по идеально правильной и математически точно васчитанной дуге, но какой от этого прок ???, я думаю никакого.
Только не подумай что я отказываюсь писать этот скрпит, мы уже договорились с тобой что сделаем - значит сделаем ! сейчас вот Shive лооп только отдам и всё ,сразу за чемфер :-)))

Автор: C00PER 29/07/2004, 12:08

QUOTE
Только не подумай что я отказываюсь писать этот скрпит, мы уже договорились с тобой что сделаем - значит сделаем ! сейчас вот Shive лооп только отдам и всё ,сразу за чемфер :-)))

вот это я понимаю, разговор drinks.gif но я всё-же настаиваю на том, что от этого не просто прок будет, а тебя на руках будут носить сотни людей wink.gif)

Автор: pepper 29/07/2004, 12:19

Если и делать "нормальный Chamfer", то только с возможностью
задания профиля скругления.
Алгоритм простой:нарезаем(cut) n-прямых,параллельных выбранной и
расставляем(move) их согласно профилю.
Профиль будем задавать через Curve Control.

 

Автор: C00PER 29/07/2004, 13:07

слушай, а это идея... в Softimage XSI есть даже возможность выбора сплайнового объекта в качестве профиля для среза wink.gif

Автор: Desead 29/07/2004, 14:05

вот давайте только без сплайного профиля :-))))))))
а что за зверь такой - curve control ???
щас погляжу справку

Автор: Michael_fd 29/07/2004, 14:25

А в чем собственно проблема? Исходя из предыдущей картинки выставить точки по ровной дуге не представляет никакой сложности. Каждая следующая точка встает сюда:
x = r*cos(a);
y = r*sin(a);

/*
Это относительно СК, которая имеет ноль относительно мира в иксе крайней из гоизонтальных точек и в игрике крайней из вертикальных. Перевести потом значения из этой СК в любую другую тоже не представляет никаких трудностей.
*/

Теперь r - это радиус вашей дуги, а "a" это угол, который образуется в результате проведения луча от начала координат в очередную точку, т.е.:
a = 90 - arctg(d/h), для "горизонтальных" точек и
a = arctg(d/h), для "вертикальных".

d - это расстояние между очередной точкой и предыдущей (если она первая, то d = 0);
h - расстояние от начала нашей СК до первой точки.

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

Удачи! smile.gif

Автор: Desead 29/07/2004, 16:03

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

Автор: Desead 31/07/2004, 14:20

Ну вот наконец я и доделал этот луп тоже....вообщем мне даже самому понравилось, поставил оба скрипта себе в квад, нихай работают коли написаны :-))), для желающих скачиваем по ссылочке, и все дружно хлопаем в ладоши Shive который заставил всё это дело написать, а сейчас ещё и красиво оформит всё это дело с кнопочками да пимпочками biggrin.gif biggrin.gif biggrin.gif

ps и конечно не забываем сменить расширение у файла с тхт на mcr

 D_script_ShrinkLoop.txt ( 2,23 килобайт ) : 469
 

Автор: C00PER 31/07/2004, 22:50

пиво в студию drinks.gif

Автор: Desead 02/08/2004, 18:27

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

Автор: DIA-Doca 02/08/2004, 19:48

Млин, я тожа от этого с ума схожу wacko.gif
Я, например, как только увидел в Рино их замечательную фаску, так сразу и влюбился wub.gif (в хорошем смысле)

Автор: DIA-Doca 02/08/2004, 19:51

Млин, я тожа от этого с ума схожу wacko.gif
Я, например, как только увидел в Рино их замечательную фаску, так сразу и влюбился wub.gif (в хорошем смысле)

Автор: Shiva 03/08/2004, 16:38

И таааааак... Вот так вот оно выглядит у меня.
ОГРОМНОЕ спасибо Desead и Pepper за скрипты.

 

Автор: Shiva 03/08/2004, 16:41

Забирайте. инструкция по установке внутри.
О всех багах, прозьбах и предложениях пишите здесь. )

 PolySellectionTools.rar ( 7,15 килобайт ) : 356
 

Автор: Ito 03/08/2004, 17:03

спасибо ребята, офигенную работу проделали!!!


2Shiva: обьясни мне непонятливому для чего нужны эти кнопки?(см.рис)

сколько уже с meshtools'ом работаю, но так до сих пор и не понял истинного их назначения

если не трудно покажи на примерах

 

Автор: Shiva 03/08/2004, 17:38

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

Автор: Ito 03/08/2004, 17:47

тот что вращает эдж у меня его сразу же "убивает", стирает тоесть

и часто ли ты это вращение используешь? не легче ли побыстрому ремувить эдж, а затем его создать с помощью того же коннекта точек?

Автор: Shiva 08/08/2004, 15:10

Чесно - вообще не пользуюсь. Скажем так.. я не пользуюсь бОльшей частью Мештулзов.. может просто потому что незнаю где и как их удобно использовать.

Автор: Desead 09/08/2004, 11:25

не, вращение это тема ,я его даже на отдельный кей вынес.

Автор: C00PER 10/08/2004, 22:50

ГЫЫЫ! быстренько идём на скриптспот, и в поиске пишем ChamferMadness

smile.gif) Воистину существует какая-то телепатическая связь rolleyes.gif

Автор: Desead 11/08/2004, 09:41

но это просто обычный чемфер, с используемым индексом 2.62, это не честное скругление :-))))))))))))))))

Автор: C00PER 11/08/2004, 19:27

дык и я о чём! самое интересное - если учесть что на написание этого скрипта у него ушло какое то время, плюс какое-то время он болтался в отстойнике скриптспота, прежде чем его выложили, из этого можно сделать вывод, что автор занялся написанием скрипта в тот же момент когда я предложил эту идею smile.gif может он к нам наведывался?

Автор: Ito 12/08/2004, 16:20

ситуация следующая

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

p.s: знаю что в полимагусе есть что то подобное, но там соединение эджей, к тому же не очень стабильное

 

Автор: Desead 13/08/2004, 09:29

есть данная штука в максе, connect называется, расположена там же где булеан, но не очень гибкая и в некоторых случаях говорят странная. Хотя данная операция на самом деле нужна частенько, стоит подумать о её написании

Автор: C00PER 13/08/2004, 16:58

Да ты чего, друг! В Meshtools'ах такое с рождения присутствует smile.gif)

Автор: Shiva 14/08/2004, 23:34

QUOTE(C00PER @ Aug 13 2004, 17:58)
Да ты чего, друг! В Meshtools'ах такое с рождения присутствует smile.gif)
[right][snapback]204205[/snapback][/right]


Да.. блин.. и как это я просмотрел.. мучался без коннекта. (
Спасибо за наводку.

П.С. у меня еще пару идей скриптов родились...
подскажите, как определить какие вертексы пренадлежат к данному еджу?

Автор: C00PER 15/08/2004, 00:14

polyOp.getVertsUsingEdge $ эдж

а вообще полазий по главе Editable_Poly Methods. Там много интересного

Автор: Ito 16/08/2004, 00:03

хм...
я был тоже приятно удивлен, заметив что это есть в meshtools'е под названием connect

ещё сильнее я удивился когда узрел этот коннект в действии по создании дырки в кубе, вот так, одним нажатием
а я то извращался

Автор: Shiva 16/08/2004, 00:52

QUOTE(C00PER @ Aug 15 2004, 01:14)
polyOp.getVertsUsingEdge $ эдж

а вообще полазий по главе Editable_Poly Methods. Там много интересного
[right][snapback]204726[/snapback][/right]


Где полазить?.. в макс хелпе?... или может уже есть книги по этому делу?! wink.gif

Автор: C00PER 16/08/2004, 01:10

в хелпе по макскрипту, что идёт с максом smile.gif

п.с. А конект тот немного недоделан. В XSI к примеру можно так конектить любое количество поликов, а тут только 2. Еслиб я понял принцип его работы, может бы доделал, но разбираться в чужом скрипте ещё сложнее чем писать его самому cool.gif

п.п.с. Хех. Что-то мне кажется что МОЖНО сделать конект для любого количества полигонов, или точнее для двух групп с любым количеством, но чтоб в каждой группе количество было одинаково.... попробую поразмыслить об этом на досуге, хотя у меня такая большая очередь стоит недописанных скриптов

Автор: Desead 23/08/2004, 11:46

а я вот смысл коонекта тоже не могу сформулировать ,как же блин это ??? :-))

Автор: eddi 23/08/2004, 12:11

ПОВЕЛИТЕЛИ СКРИПТОВ, а что вы всё по моделингу да по моделингу, может кто поможет мне? Как написать такой скрипт: чтобы менялась прозрачность отдельных партиклов в зависимости от скорости, т.е. чем выше скорость частицы, тем непрозрачнее частица.
PS: ну отттттчень надо!! PLZ
PS: если не трудно, выложите прямо сам скрипт.

Автор: Desead 23/08/2004, 17:43

а я тока моделингом и занимаюсь потому всё в основном понему и пишу и по материалам, вот щас за анврап ещё взялся
а тебе помочь сможет следующая строчка, но это для superspay, для других не смотрел, но думаю так же

if $.speed > X then $.visibility = Y
где
X - скорость при которой меняется порог видимости
Y - необходимая прозрачность при заданном пороге скорости
соответсвтенно работает только когда твой патикл выделен

Автор: eddi 25/08/2004, 04:34

прошу прощения за тупой вопрос, но куда это всё писать?
я работаю в максе 5 и этот скрипт нужен для следующего: я сделал в realflow атмосферу(воздух, который должен быть невидимый) и запустил пулю через него, получилось, что пуля режет воздух. Этот скрипт должен скрывать частицы пока они не отразились от пули. Я бы рад всё это сделать в ParticleFlow, но там так реально не получится. А может есть конвертилка частиц realflow в particleflow?(тогда сразу отпадёт вопрос)

Автор: Desead 25/08/2004, 09:17

вот оказывается как матрицы рождаются :-))), я с патиклами вообще не работаю, поэтому здесь помочь не смогу. А ты уверен что в particle flow реально не получиться ,вроде говорят мощная система.

а скрипты запускать так: жмёш ф11, в появивишимся окне ctrl+n, и пишешь что надо, для запуска на выполнение жмёш ctrl+e

Автор: eddi 26/08/2004, 05:02

1) Desead, спсиб, но ведь скрипту, на скока я знаю, надо както указать к чему применяться, или мне надо выделить партиклы? ОК, ща попробую..
2) в particle flow реально не получиться, т.к. тама у меня до сих пор не получилось сделать соударение частиц друг с другом..

Автор: Desead 26/08/2004, 09:22

ну да, забыл написать что объект должен быть выделен, знак доллара обозначает выделенный объект smile.gif

Автор: eddi 27/08/2004, 07:30

..не работает, т.е. работает, но частицы становятся полностью прозрачными и зависимости нет..
..что я делаю: выделяю емитер, F11, new script, ctrl+v(if $.speed > 0 then $.visibility = 1), ctrl+e..
!!..замечу, что двигаются только партиклы, а не емитер..!!
PS..наверное у меня руки кривые..

Автор: Shiva 27/08/2004, 13:12

QUOTE(eddi @ Aug 26 2004, 06:02)
1) Desead, спсиб, но ведь скрипту, на скока я знаю, надо както указать к чему применяться, или мне надо выделить партиклы? ОК, ща попробую..
2) в particle flow реально не получиться, т.к. тама у меня до сих пор не получилось сделать соударение частиц друг с другом..
[right][snapback]209985[/snapback][/right]


1) В PFlow есть свои "модули" для подключения скриптов в Event. туда и пихать.. но тот скрипт что тебе дали неподойдет.
2) До сих пор?! а.. ну.. да.. есть такое.. но все это делается спокойно скриптами при знании математики.. Я вот как-раз для одного ролика писал скрипт для Pflow - чтоб атомы отсткакивали друг от друга... очень даже класно получилось. tongue.gif Скоро выложу. Но, это не совсем то что делает RF.. RFlow делает комплексный расчет...

А, о конверторе и не мечтай.

Автор: pepper 11/09/2004, 13:12

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

 

Автор: pepper 11/09/2004, 13:14

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

1. Как видно на картинке выделенный сплайн направлен в сторону "от" куба. Для выбранных мной еджей полигоны построились в правильном направлении. А вот если бы, я выбрал противоположный едж куба, то полигоны все-равно строились бы в таком же напрвлении. Т.е. "не в ту сторону".
Кто может подсказать, как можно сделать align сплайна к ребру куба.(желательно скрипт)

2.полигоны я создаю функцией polyop.createPolygon,для которой очень важен порядок вертексов(по и против часовой стрелки). Как узнать порядок вертексов:когда они в соответствии с обходом по часовой стрелки а когда нет

 

Автор: C00PER 11/09/2004, 13:30

ого! вот так неожиданность! удивил, действительно удивил! ohmy.gif blink.gif drinks.gif

Автор: 111 11/09/2004, 19:25

аналог рельсов для поликов было бы очень полезно иметь.

Автор: Mike_1 11/09/2004, 20:34

Вот надумал разбираться с максовским скриптом. Пока назрел такой вопрос, думаю не сложный:
как узнать координату точки (через скрипт), зная её номер?

Автор: pepper 12/09/2004, 11:15

2 Mike_1: $.verts[номер].pos

Кстати о $. Как известно, доллар обозначает текущее выдиление. Так вот, походив по дискритовскому форуму, случайно обнаружил топик в котором рассматривались такие примеры

1.
ts1 = timestamp()
for i=1 to 5000000 do $
ts2=timestamp()
format "time=%" ((ts2-ts1) / 1000.0)

2.
ts1 = timestamp()
for i=1 to 5000000 do selection[1]
ts2=timestamp()
format "time=%" ((ts2-ts1) / 1000.0)

3.
ts1 = timestamp()
z=selection[1]
for i=1 to 5000000 do z
ts2=timestamp()
format "time=%" ((ts2-ts1) / 1000.0)

результат на лицо:
1.time=1.688
2.time=1.328
3.time=1.0

Автор: C00PER 13/09/2004, 02:12

ну то что существует разница между $ и selection[1], это ещё объяснимо, я даже когда разбирался с change handlers'ами, наткнулся на такое замечание:
Due to the way that 3ds max internally processes notification signals, the $ form of accessing selected objects is not recommended in a select change handler. To access the selected objects, you should use the selection objectset. This is because $ relies on information that has not yet been set in the selection processing whereas selection uses a different method of accessing selections and the information it uses has been set up. Что говорит о том, что это совершенно разные методы выбирания объектов, но вот почему второе и третье дают такую разницу, непонятно, ведь это одно и тоже. но оказывается, не совсем. спасибо, будем иметь ввиду, что всегда лучше назначать команды в переменные, нежели выполнять команды в командах drinks.gif вот жаль что по чамферу помочь не могу %(

Автор: C00PER 13/09/2004, 02:19

ыыы! а ты попробуй вот так:

ts1 = timestamp()
b=$
for i=1 to 5000000 do b
ts2=timestamp()
format "time=%" ((ts2-ts1) / 1000.0)

получишь время самого быстрого из тех примеров! во дела wacko.gif

Автор: Mike_1 13/09/2004, 19:47

pepper Спасибо за подсказку. Посмотрел - все ништяк wink.gif

и еще вопросец: можно ли с помощью скрипта узнать какие точки принадлежат полигону?

p.s. когда надоем с вопросами, скажите...

Автор: Desead 15/10/2004, 21:24

чё то давно я сюда не заглядывал :-)
Пеппер реально ПЕРЕЦ !!!!!!! :-))) молодца
постараюсь помочь тебе с разворотом сплайна относительно выделенного ребра !

Автор: -=VG=- 15/11/2004, 17:25

2 Pepper: можно вычислить матрицу3 на основе ребра и напр. первой точки сплайна. (по трем точкам) и относительно этой СК вычисляй все нужн. тебе координаты. Если я правильно тебя понял:-)

Автор: Buck 07/01/2005, 15:32

Реально круто!!! Поздновато я сюда поселился... Сэньк за скрипты. Поставил - Реально, мужики!!!! :beer:

А как сделать, чтоб не ругался, когда ничего не выделено?
Я тут про вращение скрипт налабал под 7й Макс, но вроде должен идти под ранние версии. Там топик мой висит еще. Как вам кажется, пригодный скрипт?

Автор: Buck 08/01/2005, 14:53

Короче нашел я как добавлять ролауты...
addRollout итп.
Но в окне они почемуто не хотят лепиться. появляются только под окошком МаксСкрипт в последней закладке...

вроде и с английским нормально, но не могу я найти как их запихнуть в окно. sad.gif

пишу

utitlity buck "Buck's"
(
.....

on buck open do
(
addRollout rot
)
)--конец utility

createdialog тыры-пыры

создает окно, а ролаут создается только в последней закладке sad.gif

Автор: 1асс 08/01/2005, 19:44

В указателе: Rollout Floaters as Extended viewports

Автор: Buck 09/01/2005, 19:26

Все, разобрался, спасибо! smile.gif

Автор: _romka 19/01/2005, 09:50

О блин, шикарная веткаsmile.gif У меня идейка пару недель назад сформировалась, сделать скрипт, похожий на скрипт пепера, но только для бевела - бевел по сплайну, может уже есть где?

Автор: Desead 19/01/2005, 10:59

2 Buck:
c роллаутами тока вручную пожалуйста не парься, зачем ? ведь есть визуальный макс скрипт где всё это вписывается автоматом и само !

Автор: Buck 19/01/2005, 14:43

2 Desead
конечно! я с визуала и начинал скрипт изучать... smile.gif

Автор: Bornie 03/03/2005, 10:54

Я с мах скриптом работую недавно.

может кто знает как с его помошью создавать линии.

Автор: C00PER 04/03/2005, 15:15

хелп знает wink.gif
почитай главу "How do I create a line between two points?"

Автор: 1асс 05/03/2005, 17:27

Хелп, как правило, вообще все знает, так что сначала к нему, а потом уже сюда, не раньше.

Автор: secco 11/03/2005, 08:55

Простые вопросы.


короче, что хочу:

1) как сделать, чтобы при однократном "нажатии на кнопку" выполнялась одна команда, а при провторном на нее же - другая? например, нужно сделать кнопки управления вьюпортами таким образом, чтобы при первом нажатии, напр., кнопки "Top" выполнялось max vpt top, а при повторном - на нее же - max zoomext sel all. Я сначала сделал запуск обеих команд с одного нажатия Тор, но это оказалось не всегда удобно.Хочется знать, как запустить именно так, как написано выше.

2)еще вот: из-за частого использования SelectionFilters пришлось вынести их на кнопки, ( выпадающие списки не люблю - промахиваюсьsmile.gif. Это оказалось лехко, но захотелось для большего удобства вот чего:есть, напр., кнопки, задающие фильтры (Geometry, Lights etc - кроме кнопки ALL.) - КАК сделать, чтобы при нажатии на одну из этих кнопок она оставалась в положении "On", а при "выключении" все сбрасывалось в положение "All"? Типа переключателя? Знаю только, что надо использовать выражение On IsChecked, но шняга выходит.


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

Автор: secco 11/03/2005, 23:35

ну что, никто..??
Какая жаль

Автор: C00PER 12/03/2005, 00:59

1)

CODE

global numberoftimes
if numberoftimes == undefined then numberoftimes = 1
case numberoftimes of
(
1:
(
print "One"
max vpt top
numberoftimes = 2
)
2:
(
print "Two"
max zoomext sel all
numberoftimes = 1
)
)


2) сколько не читал, так и не смог понять %)

QUOTE
ну что, никто..??
Какая жаль


терпение wink.gif не каждую же минуту сюда заглядывают

Автор: secco 12/03/2005, 01:19

Спасибо, Куп, как всегда, выручаешь.

А с терпением, да, нелады.. не в курсе. как пофиксить?

Автор: -=VG=- 12/03/2005, 01:43

2 secco: возможно для обоих вопросв: заведи глобальную переменную типа bool и проверяй ее при нажатии.

Не люблю я глобальные переменные, некрасиво это и не использую. Даже не скажу будет ли это правильно. Но в теории должно сработать.

Автор: secco 12/03/2005, 01:44

а про второй пункт, наверное путано написал,
Короче:
Есть кнопка Geometry, на ней висит команда setSelectFilter 2.
Нажмаешь ее - она остается вкл.(как привязки. например) - нажмаешь ее еще раз - она отжимается, и фильтры переходят в положение all, т.е. выполняется команда setSelectFilter 1.


Так понятней?

Сомневаюсь.smile.gif)

В любом случае спасибо. 56[1].gif
to -=VG=-
а чем плохи глобальные переменные?

Хотя я все равно не пойму.
wacko.gif

Автор: Antosha Marchenko 26/03/2005, 22:44

Братцы, помните об такой подлянке.

пишу листенеру

CODE
findItem Matr3DDInd [0,0.956522,0]
ответ
CODE
0

хотя если ему написать
CODE
Matr3DDInd[2]
то он выдаст ту самую
CODE
[0,0.956522,0]

Ладно, пишу ему такое
CODE
Matr3DDInd[2]==[0,0.956522,0]
а он на это
CODE
false

В чём же дело? А вот в чём
CODE
distance Matr3DDInd[2] [0,0.956522,0]

на что ответ
CODE
2.38419e-007

вот.

Автор: vansan 26/03/2005, 23:51

2 Cooper:
Можно спросить по поводу скрипта кот. соединяет 2 точки на сплайнах? Я когда начинаю править их - у меня при преобразовании каждой точки в Bezier Corner не получается редактировать созданные линии. На них появляется что-то вроде управляющей точки с крестиком на конце, а дальше что делать не знаю blush.gif

Автор: C00PER 27/03/2005, 15:57

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


vansan, там в скрипте есть такие строки:
addKnot ss 1 #corner #line PointA
addKnot ss 1 #corner #line PointB

замени на
addKnot ss 1 #corner #curve PointA
addKnot ss 1 #corner #curve PointB

при желании можно добавить чтобы сразу были безьер-корнерами.

Автор: Antosha Marchenko 27/03/2005, 16:09

Суть в том что величины выводятся в листенер с недостаточной точностью.

Если флоат-величина хранится в переменной, потом ты её вывел в листенер, то не факт, что то, что тебе покажет листенер будет равно тому что хранится в переменной.

Мало того, что они будут не совсем равны, так и все стандартные максскриптовские сравнивалки (типа файндИтем) тоже скажут что они не равны!!!!

Автор: C00PER 27/03/2005, 16:36

нда. а вот и мой пример - простейший Mousetool

CODE

tool foo
(
on mousePoint clickno do
(
if clickno == 1 then print worldpoint
else #stop
)
)

startTool foo



Попробуй сначала кликни в виде Спереди, потом в виде Слева, а потом в виде Сверху... Ты увидишь, что для первых двух, он для одной из осей выдаёт не точный ноль а чтото вроде -2.69365e-006 или -1.95169e-006, что вообщем то является практически нулём. А для вида Сверху - твердый ноль. Как объяснить?

Автор: Mefistofel 28/03/2005, 01:35

Я совсем не разбираюсь в Maxscript, да и в 3ds max собственно тоже, поэтому такой вопрос. Мне нужно чтобы студенту в обучающей программе по инженерной графике предоставлялась возможность в отдельном окне ввести координаты точки, а потом учитывая эти координаты происходило следующие: появлялись три плоскости проекции в объеме и в этом же объеме точка с этими координатами, потом появлялись ее проекции на эти плоскости, потом сама точка исчезала, плоскости разворачивались и клались как-бы на чертежный лист, потом между проекциями нашей точки проводились линии связи.
Все должно быть анимировано, чтобы человек понял что при развороте плоскостей на чертежный лист координаты точки соохраняются( все это похоже на то когда кубическую коробку из под телевизора рвешь по граням и раскладываешь на полу). Анимацию сделать несложно , но как сделать , чтобы координаты в отдельном окне студент с клавы вводил я не знаю. Вообщем подскажите хотя бы сложно это в 3ds max или нет. Заранее спасибо.... smile.gif

Автор: 111 29/03/2005, 00:54

делаешь думи к которому привязана анимация. и всё. пусть вводит координаты думи - она туда и передвинется.

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

Автор: Mefistofel 29/03/2005, 01:12

QUOTE(111 @ Mar 29 2005, 01:54)
делаешь думи к которому привязана анимация. и всё. пусть вводит координаты думи - она туда и передвинется.

а вообще скриптом ооой как много чего сделать можно.
[right][snapback]343264[/snapback][/right]


Я если честно совсем зеленый , ну то есть зеленее некуда, что такое думи, и с чем его едят smile.gif . И еще если не секрет , какие книги лучше вообще по 3ds max и отдельно по maxscript. ( я так понял что это форум для совсем неумеющих, это я про себя, поэтому мои вопросы могут показатся совсем уж наивными, но что поделать надо ведь когда нибудь начинать)

Автор: 111 30/03/2005, 14:37

dummy - объект пустышка. просто объект которого не видно. спецом для таких случаев, когда надо что-то как-то хитро залинковать.

книшки любые хорошие (я не знаю конкретно) smile.gif
максскрипт почти эксклюзивно по хелпу и по примерам других скриптов.

Автор: Antosha Marchenko 16/04/2005, 14:57

Подучиваю С++
Провёл експеримент, на сколько максскрипт медленней математику считает.
В С++ и в Максскрипте запускал в цикле одинаковые математические выражение с флоат величинами.

Получилось что в С++ они щитались в 166 раз быстрее. Вот так.

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

Автор: 111 17/04/2005, 00:39

всего то 166 раз? маловата что-тоsmile.gif

Автор: burp 30/04/2005, 17:36

Можно ли с помощью скрипта управлять перемещение по сцене как в каком нибудь шутере при помощи курсора и мышки, а то со стандартным управлением я запарился уже. Кстати эта функция была неплохо реализована в вобщем то, отстойной проге 3d canvas. Если это есть скажите где взять такой скрипт

Автор: Eraser 30/04/2005, 17:49

3ds max 7

Автор: burp 30/04/2005, 22:31

QUOTE(Eraser @ Apr 30 2005, 18:49)
3ds max 7
[right][snapback]366190[/snapback][/right]

Мне нужно для пятого, а седьмой я достать пока не могу

Автор: Eraser 30/04/2005, 22:37

Врядли кто-нибудь будет писать скрипт на функцию, уже реализованную в 7 Максе (если до этого конечно не написали), так, что, думаю, тебе легче достать 7й макс.

Автор: burp 01/05/2005, 00:48

И всё таки если есть у кого то такой скрипт дайте знать

Автор: Eraser 01/05/2005, 00:57

http://www.scriptspot.com/download.asp?ID=2100 - разве что в этом наборе.

Автор: burp 01/05/2005, 01:35

QUOTE(Eraser @ May 1 2005, 01:57)
http://www.scriptspot.com/download.asp?ID=2100  - разве что в этом наборе.
[right][snapback]366431[/snapback][/right]

thanks! В любом случае полезная вещь 38[1].gif

Автор: G_M 05/05/2005, 02:13

Да.. моя мечта чтобы сделали транслятор Maxscript -> C++ (в качестве скомпиленого и готового к употреблению плага)..

Т.е. Написал ты скрипт- модификатор, а с помощью транслятора - перевёл его в *.dlm.
Для скорости естественно..

Автор: 111 05/05/2005, 13:21

было б крута

Автор: Bolat 26/05/2005, 17:09

Приветы.

Я в MAXScripte полный ламер.
С синтаксисом языка ваще не знаком.

Опишите пожалуййста как в сцене создать примитив.
И как вообще запускать скрипт?

Автор: G_M 26/05/2005, 18:09

2 Bolat

Для начала начни читать хелп по MAXScript - по мере понимания принципов работы со скриптом, ставь конкретные задачи, и ищи пути их решения с помощью MaxScript используя тот-же хелп..
Там кстати и примеров много..

Автор: C00PER 26/05/2005, 18:16

примитив создать? легко - box() smile.gif

Автор: secco 26/05/2005, 18:19

2 C00PER

не каждый примитив= вох %)

Автор: C00PER 26/05/2005, 20:18

но и далеко не каждый бокс - примитив laugh.gif

Автор: Bolat 27/05/2005, 06:00

G_M
Я читаю англиский хелп - ниче понять не могу.

QUOTE
ставь конкретные задачи

Конкретная задача:
Создать примитив.
Мне нужен сам код скрипта.
Люди я программер, просто синтаксиса языка MAXScript не знаю.
Дайте мне один маленький конретный примерчик кода - чисто для старта, а там я уж сам ...

Автор: 111 27/05/2005, 08:06

в хелпе ж есть чуть ли не раздел примеров - how to называется кажется

Автор: G_M 27/05/2005, 12:47

Cистаксис языка построен на тех-же принципах что и C++
В разы проще естественно..

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

Автор: G_M 28/05/2005, 02:30

Вот кстати есть немножечко для начала:

http://paulneale.com/tutorials/GCDSigNotes/GDCMaxScriptClass2005.htm

Автор: greate 14/06/2005, 11:53

а в помощь начинающему как в мс зделать проверку
ну типа есть chetbox если он включен рендерим такуюта камеру ,если нет то мы ее пропускаем тут програмерский народ говорит что есть такая функ.if но как её реализовать не представлаю даже смутно (Новичок)....:)помогите плизззз
очень надо зарание спасибо!

Автор: Antosha Marchenko 20/06/2005, 13:42

Подскажите малограмотному. Как редактировать флоат-величину побитно?
(это чтоб неймед селекшены сохранять через УВВ)

Как я понимаю специальных средств в максскрипте для этого не предусмотрено. (поправте, коль ошибаюсь). Тобишь нельзя обратиться к биту флоат переменной. Но должна быть закономерность по которой человеческие числа переводятся в биты флоата. Знает её кто-нибудь?
Можно, канешна, просто топорно представлять обе части переменной как сумму степеней двойки. Но так у меня получается что теряются несколько бит. И ваще, хочется сделать паелегантней.

Вот мои изыскания:
Я так понимаю в флоате должно быть 32 бита.
максимальное значение флоата: 3.40282e+038
Если это переписать так : 340282e+032 получается 6 бит на експоненту (вместе с её знаком) и 15 бит на основную чать, плюс её знак, того 22 бита. Где-то ещё 10 бит. Листенер не отображает несколько десятичных знаков, но всё равно все биты найти мне не удалось.

Величины:
340282.001e+032
и
340282.005e+032
максскрипт воспринимает как разные.
А вот
340282.001e+032
и
340282.004e+032
как одинаковые.
То есть в дробной части явно меньше 10 бит.

А как обе части флоат величины по-умному называются?

Автор: ECXIMER 04/07/2005, 13:09

Привет 3D программерам. Вопрос - как прочитать информацию о материалах, а точнее о всех цветах диффуза на всех объектах во всей сцене? А потом полученную инфу обработать. Нужно одномерный массив составлять?

Автор: ECXIMER 04/07/2005, 14:01

Вопрос номер 2 - как получить значения RGB выделенного объекта с произвольным именем? Спасибо!

Автор: ECXIMER 11/07/2005, 23:20

Мда..... Спасибо ВСЕМ что ответили....sad.gif

Даже и не знаю спрашивать или не спрашивать.......

вобщем такая делема - описываю функцию в начале скрипта, в функции ссылаюсь на роллаут.лайбл.текст - при выполнении функции выдаёт ошибку что мол не могу найти такой лейбл! ПЕРЕМЕЩАЮ функцию в конец скрипта (полсе инициализации этого лейбла) - но возникла следующая проблема - переменная (описываемая в функции) вызывается из тела скрипта - пишет что не может найти переменную, так как она ещё не определена..... sad.gif что делать?

Автор: -=VG=- 12/07/2005, 10:38

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

P.S. по предудущим вопросам все есть в хелпе.
arr=for i in objects collect i.material.diffuse - если все материал у кажного объекта один. Или нужно смотреть на тип материала и ..... Здесь довольно много примеров с материалами было.

Автор: vansan 12/07/2005, 11:16

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

Автор: ECXIMER 12/07/2005, 12:36

Вооот, Другое дело! Спасиб! smile.gif

ЗЫ В первый и второй я сам уже допёр.... через Купера smile.gif Спасибо ему!

Автор: Chapaev4life 05/10/2005, 13:05

Я в максе уже месяц,но к моему позору я не знаю че такое макскрипт и че он ткого делает? blush.gif обьясните,а? lamer.gif

Автор: Antosha Marchenko 08/12/2005, 23:18

У меня прогресс smile.gif сёдня узнал что если нажать Ctrl+D в листенере, он очистится.
Если вдруг кто-то ещё не знает - ЗНАЙТЕ!!!!!!!

Автор: 1асс 09/12/2005, 10:11

Есть и еще куча очень полезных комбинаций.

Например выделить весь текст между скобками Ctrl+B кажись.

ВСЕМ УЧИТЬ КЛАВИАТУРНЫЕ СОКРАЩЕНИЯ smile.gif

Автор: 111 10/12/2005, 07:26

2Antosha Marchenko
ctrl+D не работает в 7м максе, моэет это ты про 8?

21асс
какие ещё полезные комбинации кроме Ctrl+B?

Автор: 1асс 10/12/2005, 13:04

Это для Едитора:


MAXScript Editor Commands
The following menu bar commands and keyboard shortcuts are available in the MAXScript Editor. The edit commands listed below are also available in the MAXScript Editor right-click menu.

File > New, CTRL+N

Opens a new MAXScript Editor window for writing a new script.

File > Open, CTRL+O

Opens a common File Open dialog for choosing an existing script. A new MAXScript Editor window then displays the selected script.

File > Close, CTRL+W

Saves the contents of the MAXScript Editor to the current file name, and then closes the Editor window. If there is not a current file name (that is, the MAXScript Editor window was opened with File > New), a common File Save dialog is opened.

File > Save, CTRL+S

Saves the contents of the MAXScript Editor to the current file name. If there is not a current file name (that is, the MAXScript Editor window was opened with File > New), a common File Save dialog is opened.

File > Save As

Opens a common File Save dialog for choosing a new file name used to store the existing script.

File > Evaluate All, CTRL+E

Evaluates the entire contents of the MAXScript Editor. This is similar to selecting all text, and then pressing SHIFT+ENTER. It has the advantage that the window's scroll position does not change.

Edit > Undo, CTRL+Z

Undoes the last change made to the MAXScript Editor’s content.

Edit > Undo, CTRL+Y

Redoes the undone changes made to the MAXScript Editor’s content.

Edit > Cut, CTRL+X

Copies the selected text to the cut/paste buffer and deletes the text.

Edit > Copy, CTRL+C

Copies the selected text to the cut/paste buffer.

Edit > Paste, CTRL+V

Places the text in the cut/paste buffer at the cursor. If text is selected when executing this command, the selected text is replaced with the cut/paste buffer contents.

Edit > Delete, DEL

Deletes the selected text.

Edit > Select All, CTRL+A

Selects all text in the MAXScript Editor.

Search > Find, CTRL+F

Displays Find dialog. Performs search in the MAXScript Editor for the Find What text. Search can be restricted to occurrences that are not part of a larger word, or are the exact combination of uppercase and lowercase letters as the Find What text. If matching text is found, the text is selected.

Search > Find Next, CTRL+G

Repeats the last Search > Find by finding and selecting the next occurrence of the Find What text.

Search > Replace, CTRL+H

Displays Replace dialog. Performs search in the MAXScript Editor for the Find What text, and replaces the matching text with the Replace With text. Search can be restricted to occurrences that are not part of a larger word, or are the exact combination of uppercase and lowercase letters in the specified text.

Help > Help

Displays the MAXScript Online Reference.

Help > About MAXScript

Displays About MAXScript dialog.

TAB, CTRL+I

Indents selected lines of text by one tab width.

SHIFT+TAB, SHIFT+CTRL+I

Unindents selected lines of text by one tab width.

SHIFT+ENTER

A MAXScript Editor can send code selections to Listener for evaluation. Select some text in MAXScript Editor and press SHIFT+ENTER to send the selected text to Listener. Listener compiles and evaluates it and prints out the result at the end of the current text in Listener. If you press SHIFT+ENTER with no text selected, the line containing the cursor is sent to Listener for evaluation. This behavior is similar to using SHIFT+ENTER in Listener, except that the results of the evaluations are printed in the Listener, not inserted into the MAXScript Editor text.

If you have a number pad on your keyboard, the Number-Pad ENTER key is an alternative to SHIFT+ENTER and can be used to execute commands. You may find the Number-Pad ENTER key faster and easier to use.

CTRL+Right-Click

Displays a pop-up menu of all the utility, structure, user-interface item, function, handler, plug-in, tool, Macro Script, and rcmenu definitions that exist in the current script. Select one of the items in the pop-up menu to position that definition at the top of the MAXScript Editor window. This simplifies large script navigation.



CTRL+B

Selects the text in the current bracket. Bracket balancer lets you check bracket balancing in long bits of code. The balancer works with any of the following: (), [], and {}. To use it, place the cursor anywhere in the script text and press CTRL+B. If the cursor is next to a bracket, the code bracketed by it and its matching bracket will be selected and highlighted. If the cursor is not next to a bracket, the closest bracketed code containing the cursor will be selected. If you press CTRL+B again, the next outer bracketed fragment is selected, and so on. You can keep pressing CTRL+B to move out through bracket nestings. If at any point there is a bracket mismatch, the balancer will beep and not select any text.

CTRL+D

Performs a simple syntax coloring scheme in the MAXScript Editor. Each time you press CTRL+D, the window is redrawn with comments in green, MAXScript reserved words in blue, and string literals in dark red. This often helps in reading large, complex programs. New text is always colored black and you have to press CTRL+D at some point to recolor the script. Syntax coloring is a programming aid and does not effect script execution.

Script files will be automatically syntax colored when opened. Automatic syntax coloring as you type in the Editor will also be performed, but only on single line basis. Comments and strings spanning multiple lines will not be colored properly - please use Ctrl+D in such cases to force a manual update.

CTRL+R

Places the cursor at the location where it was previously placed with a mouse click or a find operation. Consecutive uses of CTRL+R cycle through the last eight cursor positions. This feature is useful if you edit at one location, move the cursor elsewhere with find or scroll operations, and then want to return to the edit location. This feature allows you to quickly review the code pieces you recently worked on.

Автор: GURA 21/01/2006, 13:12

vopros nachinayushego: u menya yes mesh. ya xochu rozrezat dva rebra etogo mesha i soedinit rebrom. kak eto sdelat?

Автор: emeric 21/02/2006, 12:57

У меня возник вопрос: при создании нового скрипта, к примеру:
(
k=10
)
print k

дожно выводится сообщение "10", у меня же ВСЕ сообщения выводятся по 2 (!!) раза. Что делать? Причем это не только в этом скрипте, а во всех!!

Автор: 111 22/02/2006, 06:37

это если из листенера, а как нормально через ран запустишь - то по одному разу будет писать.

Автор: xzena 03/04/2006, 10:53

пишу участок скрипта, где обьект по передвижению ползунка поворачивается вдоль оси, а потом по кнопке reset поворот сбрасывается и ползунок выставляется в исходную позицию.
slider sobj "Z Movement" range:[-90,90,0]
on sobj changed val do obj.rotation.z_rotation=val
button resets "Reset"
slider tobj "X Movement" range:[-90,90,0]
on tobj changed val do obj.rotation.x_rotation=val
button resett "Reset"
on resets pressed do
( obj.rotation.z_rotation=0
sobj.value=0
)
on resett pressed do
( obj.rotation.x_rotation=0
sobj.value=0
)

скажем, так его пишу. И проблема в том, что для z оси всё работает класно! а для следующих двух работает коряво. Ползунок после reset назад не возвращается, обьект хоть и сбрасывает поворот, но следующее действие начинает от предыдущего угла поворота. Как это можно исправить? blink.gif

Автор: Pontific 05/06/2006, 12:57

Здравствуйте,
В процессе освоения максскрипта у меня возникла проблема.
Написал скрипт для анализа координат вертексов в поли.
строка:
if x1 != x2 then ... какие-то действия
Эти 2 переменные по сценарию равны! В лисенере это показывается. Но и в скрипте, и в лисенере при команде x1 != x2 пишет true. Я в замешательстве! Как это побороть!

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

Вот конкретные команды привожу
x1=$.verts[b[a]].pos[i]
x2=$.verts[b[a1]].pos[i]
b-массив, a, a1, i - индексы.
т.е. координаты этих точек по, предположим y, в поли совпадают.
Далее я хочу проверить, а не равен ли x1 и x2, и что вы думаете? Макс говорит, что не равны, причем я знаю что они равны!
Вот картинка.
Ну что это за несправедливость![attachmentid=68874]

 

Автор: Svetozar 05/06/2006, 16:16

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

в твоем скрипте у меня все работает, но я за место b[a] вставил цифры (что тебя за массивы я не знаю), у меня есть подозрения что эти значения всетки отличаются, но на очень мало значение, оно даже не выводиться на печать, но это только моё предположение...

Автор: Pontific 05/06/2006, 16:58

Svetozar как ты оказался прав, разрази меня гром!
2-е суток я этот баг убивал. Оказалось надо было просто ceil*1000 сделать этим значениям. Кто бы мог подумать, что в максе координаты 2 точек на одной оси могут отличаться на 0.00001 единицу даже если бокс только нарисован!
И эта сволочь (макс) же не выдает этого!

Автор: Pontific 05/06/2006, 17:11

От радости забыл поблагодарить smile.gif
Спасибо за совет!

Автор: Svetozar 05/06/2006, 19:32

пожалуйста :о)

почему то, когда у меня была такая проблема - я не догадался... %(

Автор: gotik 07/07/2006, 23:55

помозжите, делаю анимацию
с помосчью Parameter Wiring...
вот в этот скриптик нужна константа:
"if (roll > 10 and roll < 50) then
roll=10;
else
if (roll >49 and roll < 99) then
roll=10-1;
else
if (roll >98) then
roll=0;
else
if (roll <0 ) then
roll=0;
else roll=roll"
то есть значению roll нужно задать константу для вот этого выражения:
"if (roll >49 and roll < 99) then
>>> roll=10-1; <<<
else", тоесть значение roll должно считаться в другую сторону, то есть наубывание

Автор: -=VG=- 09/07/2006, 19:53

QUOTE(Pontific @ 05/06/2006, 13:57) [snapback]649814[/snapback]

Эти 2 переменные по сценарию равны! В лисенере это показывается. Но и в скрипте, и в лисенере при команде x1 != x2 пишет true. Я в замешательстве! Как это побороть!


Уважаемые программеры мне однажды сказали, никогда не сравнивай два числа (не integer) друг с другом, а сравнивай их разность с 0, причем не просто (a-cool.gif==0, а (a-cool.gif>0 :-)


Автор: secco 27/09/2006, 12:29

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

Автор: -=VG=- 01/10/2006, 12:04

QUOTE(secco @ 27/09/2006, 13:29) [snapback]720473[/snapback]

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


используй CreateDialog вместо NewRolloutFloater и Addrollout. В последних исправлениях моих "ровнялок" (VGAlignPoints и т.п.) я тоже сделал так: открывать роллоуты рядом с курсором:

createDialog DilogName pos:(mouse.pos+[0,-100]) width:120 height:100

Автор: secco 02/10/2006, 11:21

спасибо, Влад, уже разрулил, делал также, через mouse.pos со смещением , дешево и сердито

Автор: Track 14/10/2006, 05:17

Уважаемые не подскажете как заставить работать скрипт вот основные строки

CODE

fn filterClassofCallback node =
(
superclassof node
)

for i in selection[1] do(
ClassName=lowercase ((SuperClassof i) as string)

registerSelectFilterCallback filterClassofCallback ClassName
)
for i = 1 to GetNumberSelectFilters() do(

if ClassName == lowercase (GetSelectFilterName i)then(
    setSelectFilter i
    exit
    )
)



Сразу после выбора Selection Filter ScriptListener выдает ошибку
CODE

>> MAXScript Select filter Callback Exception: -- Unable to convert: GeometryClass to type: Boolean <<


Спасибо


CODE
fn filterClass node =
(
superclassof node==superclassof obj
)

obj=selection[1]
ClassName=lowercase ((SuperClassof obj) as string)

registerSelectFilterCallback filterClass ClassName


Заработало!!!

Автор: secco 17/10/2006, 13:26

все бы так отвечали сами на свои вопросы %)

у меня вопрос,
если я юзаю какую нить команду(например)

getRefCoordSys()


она мне возварщают тип выбаннй координатной системы
есил мне надо чтоб при выбранной системе системе View команда выводила мне не #hybrid, а именно словво View?

тоже. например , при $.constrainType (в поли)
чтоб возвращало не циферки, а нужные мне слова, Edge или Face например


Автор: Yuri Yarunin 17/10/2006, 14:10

QUOTE(secco @ 17/10/2006, 14:26) [snapback]733727[/snapback]
у меня вопрос,
если я юзаю какую нить команду(например)

getRefCoordSys()

она мне возварщают тип выбаннй координатной системы
есил мне надо чтоб при выбранной системе системе View команда выводила мне не #hybrid, а именно словво View?

тоже. например , при $.constrainType (в поли)
чтоб возвращало не циферки, а нужные мне слова, Edge или Face например

Вот накидал пример с координатными системами. С поли разберёшся по аналогии.
CODE
function getRefCoordSysAsString = (
    local request, result
    request = getRefCoordSys () as string
    result = case request of
    (
        "hybrid":"View"
        "screen":"Screen"
        "world":"World"
        "parent":"Parent"
        "local":"Local"
        "object":"Object"    
    )
    return result as string
)

detectCoorSys = getRefCoordSysAsString()
messagebox detectCoorSys

Автор: secco 18/10/2006, 13:16

еще вопрос, плиз

если я юзаю команду

snapmode.type

мне выводит Undefined -- но тока до тех пор, пока не поменяешь тип привязки. на любой, хотя на тот же, что и был
как избавиться от этого? не менять/возвращать же ее принудително, тока чтоб не видеть этого Undefined //
EDIT - в 9ке ксати, этого бага нет

и еще - можно ли получить значние плолжения Angle Snap(on--off)?
чет в хелпе тишина, видимо можно тока вкл - выкл,,или как?

Автор: dust_99 29/12/2006, 18:15

скриптоманы.. подскажите че тут не так?
вот запускаю скрипт- он пашет потом выдает

смотрю где он спотыкается
-- Error occurred during fileIn in StringStream:"-- Error occurred during fileIn in StringStream:"$trimtab_rudder + 2_Object0039"
-- Error occurred during fileIn in <File:K:\PROG\mdl\Новая папка\Import.ms>
>> MAXScript FileIn Exception: -- Type error: Call needs function or class, got: 2 <<

подскажите- в чем тут загвоздка?

PS скрипт предназначен для импорта из ДАТ файла в макс

 

Автор: secco 27/03/2007, 12:33

а никто не скажет, как получить номер материал ID
чет в хелпе не могу найти

Автор: gotik(Unter) 18/07/2007, 23:53

оживим темку
ожень нужно узнать+) как макс определяет копии объектов в сцене, в частности как можно найти все копии при выделении одного из этих объектов

Автор: CyberFlipper 19/07/2007, 07:31

Поковыряй, там видно как:
[attachmentid=101928]
Оно уже делает то, что ты просишь.
Выделяешь объект и запускаешь скрипт из мекнюшки.

Положи в стартап скриптов и ищи в Customize Ui- CFScripts. Назначь на кнопку или тулбар.
Или выковыряй кусок кода - как хочешь.


Только не копии, а инстансы. Копии независимы по определению.

 InstancesViewer.rar ( 319 байт ) : 248
 

Автор: gotik(Unter) 19/07/2007, 09:59

2 CyberFlipper,вай вай спасибо
надеюсь что то что нужно+)
ЗЫ:что за голова хотел спросить про инстансы, а написал про копии+)

Автор: megavitus 19/07/2007, 10:38

не понимаю, зачем писать скрипт для выделения инстансов, когда макс сам по себе это умеет:
нажимаем кнопку Select by Name, ставим галку select Dependents, и ещё раз тыкаем на имя объекта

Автор: gotik(Unter) 19/07/2007, 22:34

megavitus пробовал и так, но видать руки у меня кривые

Автор: CyberFlipper 20/07/2007, 07:37

QUOTE(megavitus @ 19/07/2007, 13:38) [snapback]888673[/snapback]

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

Согласен канешна! Но:
Писал его еще до того, как эта фишка в максе появилась.
Либо до того, как узнал что она есть, хыхы (такое совсем не исключено).
Да и в любом случае скриптом быстрей выделять - один клик вместо трех.
Торжесто лени smile.gif

Автор: megavitus 20/07/2007, 14:33

to CyberFlipper:
да я тоже грешеным делом писал smile.gif тока у меня осталось make instanсe/unique, а выделялку прибил как только узнал что можно и так.

Автор: Arhat 29/07/2007, 09:25

подскажите код, чтобы скрипт выполнялся применительно к instance объектам (не всем инстансам в сцене, понятное дело, а к тем которые являются инстами друг друга) только один раз
а то классическая ламерская ошибка - сколько среди выбранных объектов инстансов, столько раз применительно к нему выполняется функция (в моем случае добавляется модификатор)

и еще, как фильтровать объекты по названию (не classOf а именно названию) модификатора, допустим верхнего в стеке, по идее должно быть как то так
if $.modifiers[1].name == "foo" do (foo)

но не пашет

Автор: CyberFlipper 30/07/2007, 10:49

Простой вариант: modPanel.addModToSelection (Uvwmap ()) ui:on

Интерфейс ModPanel сам сообразит, какому объекту что и как добавлять smile.gif

Могу предложить сложный, если нужно smile.gif

Автор: Arhat 30/07/2007, 12:25

не, не пашет, через modPanel модификатор добавляется ко всем объектам сразу, а нормально запустить for цикл через нее нельзя (или я не знаю как)

т.е.
for o in $ do (modPanel.addModToSelection (Uvwmap ()) ui:on)
просто добавит ко всем объектам модификатор столько раз, сколько выбрано объектов, потому что в modPanel.addModToSelection нельзя поставить переменную "о", после modPanel.addModToSelection может идти только модификатор

давай сложный способ

Автор: CyberFlipper 30/07/2007, 13:02

Можно и так:

CODE


instances=#() --reset instances array
added=#()     --reset added array
myMD=(Uvwmap length:1000 width:1000 height:1000 maptype:4 axis:0)  --modifier to adding

--loop in selection
for obj in selection do
    (
    InstanceMgr.GetInstances obj &instances --get instances for current obj
    if (finditem added instances[1]==0)do     --if not present in collected, add modifier
        (
        try (AddModifier instances[1] myMD)
        catch()
        )
    join added instances --this obj and all it's instances are collected
    )



Если я натупил, пусть гуру поправят... smile.gif

Автор: Arhat 31/07/2007, 11:54

2CyberFlipper, что то не пашет, у тебя самого он работает? у меня он создает один общий модификатор на все выделенные объекты

Автор: -=VG=- 31/07/2007, 13:36

for obj in selection where obj.modifiers["UVW Mapping"]==undefined do AddModifier obj (Uvwmap())

если на объекте (среди выделенных) нет модифера UVWMap (во всем стеке!!!) - то этa строчка скрипта добавит его. А при инстансах он добавит в первый инстанс, а потом на следующих пропустит

Автор: CyberFlipper 31/07/2007, 14:48

Ну да, один на все. А нужно было другое? Тогда я недопонял...

Автор: Arhat 31/07/2007, 16:50

-=VG=-, спс помогло
ты в принципе ответил и на вопрос про то как фильтровать объекты по имени модификатора, но меня смущает такая вещь (вроде размышление на вольную тему)

я заметил вот что, допустим я хочу удалить модификатор но не через его номер в стеке, а через класс, если использовать
deleteModifier $ (Bend())
то он ничего не удалит, а выдаст No such modifier in node: Bend:Bend (в стеке разумеется есть бенд)
это происходит наверное потому, что добавляется модификатор через modPanel а удаляется (если врубить макро рекодер и посмотреть) через deleteModifier $ 1 то есть через номер модификатора в стеке
т.е. добавить модификатор через макс скрипт можно достаточно просто, а чтобы удалить конкретный модификатор надо маяться с classof и for циклом, удалять через класс или через название (для этого я и интересовался как обращаться к модификатору через его имя), чтобы скрипт просмотрел все модификаторы в стеке и удалил нужный через его позицию

хотя в хелпе про синтаксис deleteModifier написано

deleteModifier <node> <modifier_or_index>

это значит, что и через deleteModifier $ (bend()) модификатор должен удаляться, ведь для addModifier синтаксис похожий
addModifier <node> <modifier> [before:index]
и addModifier $ (bend()) работает норм

Автор: -=VG=- 01/08/2007, 10:45

deleteModifier <node> <modifier_or_index> в этой команде подразумевается, что ты будешь удалять модификатор (если не по индексу удалять хочешь), который присутствует в стеке (настроенный и т.п., т.е. именно ссылка на модфикатор стека), а
deleteModifier $ (Bend()) - тут получается, что эта команда будет искать в стеке модификатор, который ты только что в этой - же команде и создал, т.е. новый, и которого в стеке естественно нет
посему должно работать например так:
deleteModifier $ $.modifiers["Bend"]

Автор: Arhat 01/08/2007, 13:52

-=VG=-, понятно, спс еще раз

Автор: S.T.E.A.L.T.H. 21/10/2007, 19:02

Вот начал изучать по-тихоньку Maxscript и застрял на одном месте... Подскажите плз, что нужно написать, чтобы в материал эдиторе, например, у материала с именем VRayMtl4 изменить параметр Sample Type на costum sample object? 54[1].gif

Автор: S.T.E.A.L.T.H. 24/10/2007, 00:24

QUOTE(S.T.E.A.L.T.H. @ 21/10/2007, 20:02) [snapback]944748[/snapback]

Вот начал изучать по-тихоньку Maxscript и застрял на одном месте... Подскажите плз, что нужно написать, чтобы в материал эдиторе, например, у материала с именем VRayMtl4 изменить параметр Sample Type на costum sample object? 54[1].gif

Неужели никто не знает? ohmy.gif неверю! helpsmilie.gif

Автор: DedMAXdie 25/10/2007, 22:13

Господа, как-нибудь можно реализовать в скрипте, чтобы постоянно при всяком открытии сцены выполнялась функция setProperty?

Автор: secco 14/11/2007, 13:32

скажите, а можно как то обновлять роллаут, чтоб он реагировал на внишние изменения?
напримет. у меня есть ролаут со спиннером например ObjID
и чтоб при изменении ID из другого места роллаут обновлялся автоматически, чтоб не делать доп. кнопок типа GetID..

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

Автор: 1асс 14/11/2007, 14:31

если меняется только значение в поле спиннера, то так и напиши (в колбэке или событии и т.п.):
MyRollout.myspinner.value=xxx

если нужно заменить сам роллаут, то копай в хелпе тут:
Managing Multiple Rollouts in a Scripted Utility
Rollout Floater Windows
Utility and Rollout Properties, Methods, and Event Handlers

вот еще м.б тебе пригодится Change Handlers and When Constructs

Автор: secco 14/11/2007, 14:34

ок,спс, будем искать

Автор: Atap 22/11/2007, 17:13

эт я для себя тут напишу, а то забываю - потом ищу долго

showproperties -- очень важная команда

Автор: shark 25/11/2007, 17:51

Может кто-нибудь подсказать какими командами можно изменять параметры операндов в ProBoolean т.е. мне нужен аналог строки но для ProBoolean а не для Boolean:

$.Operand_B_Transform.pos = [10.0,15.0,10.0]

Автор: di12 20/12/2007, 13:55

Извиняюсь за ПРИМИТИВНЫЙ вопрос:

Подскажите код выполняющий данную последовательность действий:
- применение к выделенному полику ID=1
- extrude by local Normal на -200
- применение ID=2


P.S. Спасибо за то что прочитали и не обматюгали.

Автор: andrew-donald 08/01/2008, 21:29

подскажите пожалуйста, мне надо по имени проверять объект из массива и если у него первая часть совпадает с нужным именем делаем уже действие. у меня есть например Branch42 Branch43 и stem мне нужно с бранчами что нить сделать
if obj.name=="Branch*" then () непомогло

Автор: 1асс 08/01/2008, 21:33

ищи в хелпе про операции со строками в частности substring

Автор: andrew-donald 08/01/2008, 21:54

спасибо. разобрался. извините, протупил, сколько раз в php юзал функции сравнения, а тут в ступор впал. еще раз спасибо smile.gif

Автор: andrew-donald 09/01/2008, 17:56

как получить ссылку на только что созданный VrayProxy ?
vrayMeshExport <node> meshFile:vray_path autoCreateProxies:true exportMultiple:false

Автор: smbv 20/02/2008, 00:08

Скачал скриптик для быстрого рендера в Вирей, очень удобный скрипт, я его запускал через MaxSript-Run
но как повесить его на кнопку? поставил его в автозагрузку, но что то не нашел его название sad.gif хотя внутри скрипта порылся, но что то не выудил.
Может быть там это не предусмотерно, но как быть? Помогите пожалуйста, кто нибудь переделайте скрипт так чтобы можно было его в Customize UI найти.
drinks.gif


 BerconPreviewRender.zip ( 5,29 килобайт ) : 229
 BerconPreviewRender.zip ( 5,29 килобайт ) : 256
 

Автор: CyberFlipper 20/02/2008, 07:24

http://3dcenter.ru/forum/index.php?showtopic=85102&pid=1013705&st=0&#entry1013705

Автор: di12 26/02/2008, 12:02

Пожалуйста дайте ответ ленивому до help-а человеку:
как закодировать копирование выбранного polygon-а _!по направлению его нормали!_???

Автор: vedmo4ka 26/02/2008, 20:35

Подскажите, пожалуйста, как применять модификаторы типа bend?есть такой фрагмент:
p=plane()
p.bend.axis=0
p.bend.angle=50
но при запуске появляется ошибка: unknown property bend

т.е. модификатор трактуется как свойство? и как это обходить?


Автор: megavitus 26/02/2008, 22:51

В этом фрагменте пропущена строчка, в которой к созданному плейну применяется модификатор, естественно макс ругается
p=plane()
addModifier p (bend())
p.bend.axis=0
p.bend.angle=50
Модификатор как свойство, это только один из нескольких способов, можно модификатор присвоить переменной, и потом обращаться через переменную:
p=plane()
addModifier p (bend())
b = p.modifiers[1]
b.axis=0
b.angle=50

Автор: vedmo4ka 27/02/2008, 12:57

Спасибо, megavitus! Совет пригодился!

Автор: vedmo4ka 27/02/2008, 13:19

А как работать со свойствами видимости объектов? Допустим, что-то простое- сделать плавно исчезающий шар?

Автор: CyberFlipper 27/02/2008, 13:23

F1
for example:

--assigns a controller:
$foo.visibility = bezier_float()
--set the current value to semi-visible:
$foo.visibility.controller.value = 0.5
--animate the value to 0 on frame 100
animate on at time 100 $foo.visibility.controller.value = 0.0

Автор: vedmo4ka 27/02/2008, 13:34

Спасибо!

Автор: andrew-donald 31/03/2008, 17:05

можно ли проверять находиться ли какой нибудь объект в заданном диапазоне по Х и по Y?

Автор: CyberFlipper 01/04/2008, 06:30

Вопроса не понял - проверять положение? Или габариты?
Положение - .pos
Габариты - свойства .min, .max. Только они неточные. На сплайнах могут врать.
Более точный способ описан в хелпе, в разделе "How do I calculate the Volume of an Object?"

Автор: andrew-donald 01/04/2008, 10:44

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

Автор: andrew-donald 02/04/2008, 15:19

извиняюсь за глупый вопрос, но как повернуть объект в нужный угол. примерно если по х он развернут на 60 градусов, а надо поставить на 0. что то уже и с хелпом и с книгой сижу, не могу найти

Автор: shark 02/04/2008, 15:40

2 andrew-donald
мне нравится этот способ - $[3][2][1].value=0.0

Автор: megavitus 02/04/2008, 15:58

andrew-donald: Ищи в хелпе eulerAngles

Автор: shark 02/04/2008, 15:59

2 megavitus
а чем мой вариант не устраивает?

Автор: megavitus 02/04/2008, 16:19

Устраивает smile.gif не видел твой ответ

Автор: andrew-donald 02/04/2008, 18:11

виноват. немного не корректно сразу сформулировал вопрос. у меня объект атачиться на другой через pos.controler attachment. при таком вращении объект выравниваеться по нормалям плоскости к которой приатачен. а я хочу выравнять объект чтобы он был ровно вверх. типа разсадка деревьев.

Автор: megavitus 02/04/2008, 18:46

andrew-donald: Если я тебя правильно понял, у тебя там "Align to Surface" галка стоит. А так вообще $.dir =[0,0,1], если без контроллера

Автор: _hidden_ 15/04/2008, 13:53

Ребята, подскажите мне пожалуйста, возможно ли в MaxScript работа с картами материалов вообще? То есть грубо говоря можно ли в MaxScript реализовать простейшие арифметические операции, ну как со слоями в фотошопе, или нужно обязательно омпилировать библиотечку? Я конечно понимаю что есть MapLayers плагин или как он там называется, но интересует возможно ли это в самом макс скрипте, и без компиляции?

Автор: megavitus 15/04/2008, 14:24

_hidden_: Возможно, если ты будешь попиксельно складывать smile.gif В свойствах bitmap для этого есть инструментарий. А вот кстати ссылка завалялась на фотошопские режемы: http://www.pegtop.net/delphi/articles/blendmodes/

Автор: OO7 02/05/2008, 12:46

Как реализовать средствами скрипта создание нового объекта (ну допустим группа из 4 боксов, соединенных в короб или штука на втором рисунке)?

[attachmentid=121688]

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

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

 

Автор: megavitus 03/05/2008, 11:36

007: Копай в сторону Scripted SimpleObject Plug-ins.
Обсуждалось http://3dcenter.ru/forum/index.php?showtopic=80430&st=0&p=946728&#entry946728

Автор: OO7 03/05/2008, 20:09

спасибо

Автор: OO7 07/05/2008, 13:03

1)
в теле обработчика "on buildMesh do" надо сделать чтобы в зависимости от содержимого чекбокса в ролауте, строилось два разных меша. истина - допустим маленький, ложь - побольше.
первый раз строится как надо, дальше никакой реакции на снятие/установки галки в чекбоксе не происходит (((

код примерно такой:

rollout params "Up" width:162 height:152
(
checkbox ud "Up/Down" ... enabled:true checked:true
)
...
on buildMesh do (
...
if ud == true then b1 = createBoxMesh (100) (100) (100) else b1 = createBoxMesh (200) (200) (200)
...
mesh = b1.mesh
)

прим. createBoxMesh - функция из примера megavitus

2)
и в догонку ))) как у созданного меша сделать шамфер? или сразу строить меш нужной формы надо? причем все так же внутри "on buildMesh do".

Автор: OO7 07/05/2008, 16:47

нашел, решил, спасибо

Автор: Joden 07/05/2008, 20:29

подскажите новичку в скриптологии : какой функцией найти в сцене объект, которому не назначен ни один из материалов ?
или даже так - найти объект, в котором может содержаться полигон, на который не назначен материал

ситуация простая - перед конвертацией модели в игровой движок её нужно приготовить, ну обресетить всё, сколлапсить стеки и пр. иначе конвертер не проглотит модель sad.gif

Автор: megavitus 08/05/2008, 12:39

Joden: Объекты без матов легко:
for obj in geometry where obj.mat==undefined do print obj
По полигонам чуть сложнее.

Автор: Joden 08/05/2008, 12:44

ну хотя бы в каком направлении двигаться ? ....... сам не могу сообразить sad.gif

Автор: OO7 12/05/2008, 18:26

Есть в модификаторе Smooth такая замечательная функция как Prevent Indirect Smoothing.
Помогает с корректным смусом в некоторых случаях.

- Можно ли как-то до нее добраться для объекта trimesh при создании своего simpleObject ?
- И как там же назначить различным полигонам различные ID ?
- И накинуть в итоге на созданное "произведение" мультсабмат ?

wink.gif

Автор: megavitus 12/05/2008, 19:20

007:
1. Точно не помню, но кажется на trimesh нельзя повесить модификатор.
2. mesh vertices:#([0,0,0],[10,0,0],[0,10,0],[10,10,0]) faces:#([1,2,3],[2,4,3]) materialIDS:#(1,2)
3. А ты пробовал, вообще мат назначается какой-либо в simpleObject? По моему это некорректно и ненужно.

Автор: OO7 12/05/2008, 19:53

QUOTE(megavitus @ 12/05/2008, 20:20) [snapback]1058488[/snapback]

007:
1. Точно не помню, но кажется на trimesh нельзя повесить модификатор.
2. mesh vertices:#([0,0,0],[10,0,0],[0,10,0],[10,10,0]) faces:#([1,2,3],[2,4,3]) materialIDS:#(1,2)
3. А ты пробовал, вообще мат назначается какой-либо в simpleObject? По моему это некорректно и ненужно.



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

решил потренироваться на твоем примере кстати, вот какие зязи можно уже делать:

http://ipicture.ru/Gallery/Viewfull/1820073.html http://ipicture.ru/Gallery/Viewfull/1820689.html

двумя кликами мышки )))

думаю приделать возможность строить радиусные элементы и различные филенки на фасадах, но пока знаний не хватат wink.gif

Автор: megavitus 13/05/2008, 12:45

007: ID еще можно так назначать:
setFaceMatID <mesh> <face_index_integer> <integer>
Sets the indexed face’s material ID.
соответственно группы сглаживания:
setFaceSmoothGroup <mesh> <face_index_integer> <smoothing_group_integer>

p.s. Prevent Indirect Smoothing не очень понял что делает

Автор: OO7 13/05/2008, 15:50

ух ты, спасибо огромное !
макскриптовский хелп полон чудесных знаний, надо только уметь их из него добыть )))

Автор: OO7 14/05/2008, 07:38

QUOTE(megavitus @ 13/05/2008, 13:45) [snapback]1058768[/snapback]

p.s. Prevent Indirect Smoothing не очень понял что делает


Алгоритм не знаю, но вот что в хелпе:

CODE
Prevent Indirect SmoothingTurn on to prevent smoothing 'leaks" when using Auto Smooth. If you apply Auto Smooth to an object, and portions of that object that should not be smoothed become smoothed, then turn on Prevent Indirect Smoothing to see if it corrects the problem.

NoteThis option has an effect only when Auto Smooth is selected. The problem it corrects is rare, and turning on Prevent Indirect Smoothing slows the Auto Smooth process. Don't use this option unless you see something wrong with your existing smoothing.


Берем обычный бокс, в поли его или в меш переводим, делаем шамфер, применяем автосмус и видим грустную картину (1 пикча), а Prevent Indirect Smoothing делает смус корректным (2 пикча). Кстати, проблема не вьюпорта и дефолтового освещения в нем, на рендере результат тот же.

http://ipicture.ru/Gallery/Viewfull/1846288.html http://ipicture.ru/Gallery/Viewfull/1846329.html

Автор: secco 14/05/2008, 19:52

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

например есть папка с превъюхами. и в ролауте отображаются они в таком виде.
в хелпе не нашел. может плохо искал
может активХ или дотнет надо курить? пните в нужную сторону , если кто в курсе

 

Автор: 1асс 14/05/2008, 23:26

можно. плохо искал. пинаю. ImgTag

Автор: OO7 29/05/2008, 10:58

2 megavitus

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

Автор: megavitus 29/05/2008, 13:04

OO7: Не уверен, но кажется нельзя, у подобъектов в контексте simpleObject, вообще судя по всему отсутствует матрица трансформации. Все происходит в локальных координатах.
Можно немного оптимизировать функцию movemesh из того примера, чтобы побыстрее работала:
fn movemesh &m p = (
meshop.moveVert m #{1..(m.numverts)} p
)--fn movemesh
Ещё можно покопать plugin geometry, там вроде можно.

Автор: OO7 30/05/2008, 19:56

можно конечно извратиться и создавать объект не в точке которую указываем мышью (gridPoint), а с абсолютными координатами [0,0,0], точнее не сам объект а его пивот. сам же объект смещать как нам надо.
и если забить на то, что пивот в итоге будет фиг знает где относительно объекта, то вполне получается )))
но это изврат (((

Автор: Atap 06/06/2008, 15:31

заметочка "для себя"
getUserPropBuffer - отличная команда

Автор: gotik(Unter) 21/06/2008, 16:55

есть ли где инфа на русском по структуре максскрипта?
а то непонимаю что я неправильно делаю.
нужно на кнопочку назначить применение linear_position (также для вращения и скайлинга) в Assing Controller.

застрял на этом:

macroScript AssignLinearControllerMRS category:"ASE_4x4Tools" ButtonText:"AssignLinearControllerMRS" toolTip:"AssignLinearControllerMRS"
(
if (selection.count == 0) then
(
messageBox "Please select one or more objects!"
)
else
(
применение linear_position какимто макаром
)
)

Автор: megavitus 23/06/2008, 10:23

2gotik(Unter):

c = linear_position()
$Box01.pos.controller = c

То-же самое для rotation и scale.

Автор: gotik(Unter) 23/06/2008, 14:40

а как написать чтоб он применял линерпоз не только на боксы, а на любой выделеный едитибол_поли

или $Box01 это общее имя для всех объектов?

Автор: CyberFlipper 23/06/2008, 14:47

условие проверки на Editable_Poly:
if classof $==Editable_Poly


соответственно, если один объект выбран
if classof $==Editable_Poly do $.pos.controller = c

Если предполагается, что должно срабатывать для всех выделенных поли - объектов, то:
for obj in selection do (if classof obj==Editable_Poly do obj.pos.controller = c)

Типо так.

Автор: gotik(Unter) 23/06/2008, 15:44

спасибо попробую
жалко в архитектуру скрипта так и не вкурил -(
ЗЫ: а проверку на любой меш (поли/едитполи/едитеболмеш/ и тп) как производить?

Автор: megavitus 23/06/2008, 16:00

А поконкретнее? Бывают, кроме перечисленных, ещё объекты с модификаторами, например экструдированный сплайн. Сформулируй точно, каким объектам ты хочешь менять контроллеры.

Автор: gotik(Unter) 23/06/2008, 16:34

все редактируемые меши без модификаторов

Форум Invision Power Board (http://nulled.cc)
© Invision Power Services (http://nulled.cc)