Раз уж появилась традиция создавать такие темы, создадим её и тут, а то всякие шарики да стекляшки уже заезжены до дыр, а столь важный аспект Макса, как Скриптинг, особого интереса у населения не вызывает. Надо это упущение исправлять
Вообщем, предлагаю здесь высказыать различные идеи, бредовые и не очень, а также методы их реализации. Новичкоф не обижать! RTFM - тоже дело нелёгкое и не сразу всем даётся
Ну и для начала выложу своё сегодняшнее творение - творение, которое появилось на свет после нескольких лет повторения одной и той же процедуры. Обычная ситуация - нам надо простому плоскому объекту назначить материал с текстурой. После создания материала и выбора битмапки, нам надо, чтобы текстура легла в соответствии со своими пропорциями, а не растягивалась по размеру объекта. Для этого, мы идём в UVW Map, и там жмём Bitmap Fit, там открывается окно выбора файла, там мы ищем этот файл, и хорошо если мы в редакторе материалов, при выборе битмапки воспользовались максовской листалкой, тогда она битмапка сразу видна в окне Bitmap Fit, а если мы битмапку закинули драг-н-дропом, например из ACDSee, то листать придётся с чёрт знает какого места. Вощем целая история. Ну вот, этот скрипт ставит большую и жирную точку в этом занятии, он автоматически ставит размер гизмы равный размеру битмапки. Всё бы замечательно, но мне хотелось бы добавить ещё одну функцию - чтобы он анализировал, по какой из осей объект шире всего, и применял UVWMap на эту ось. Я хотел считать размеры объекта командами $.min и $.max, но столкнулся с каким-то непредсказуемым поведением - они как-то странно ведут себя в локальных коорднатах (или я чего проглядел): по идее in coordsys local $.min должен показывать минимальное значение боундинг бокса, независимо от угла наклона объекта, однако стоит только чуть повернуть объект, как он выдаёт какие-то немыслимые значения.
Вот и скрипт. Самое разумное ему место - в менюхе Utilities в Редакторе материалов
Сделал проверку габаритов. Теперь плоскость гизмы параллельна оси самого большого габарита объекта, но стандартными средствами макса мне сделать это не удалось, поэтому нужны http://scriptspot.com/Main_Extensions.asp?BrowseType=Complete&Sort=Name
Тема интересная, но глядя на подобные форумы понимаешь, что максскрипт мало кого интересует по разным соображениям ,а жаль, можно значительно упростить себе жизнь. Вообщем развивать тему надо. Рано или поздно допишу скрипт который ищет нужный битмап по всем материалам, и ещё умеет искать объект с нужным ID, если кого заинтересует то выкину, говорите. Нужно конечно это гейм девелоперам в первую очередь
По-моему гей мекерам в первую очередь нужны скрипты, переводящие модели и анимации во внешние, открытые файлы.
Именно этим я щаз и занимаюсь.
Нас тут четверо собралось, игру делать будем. Вот я и взялся за это дело.
а кто-нить знает как скриптом нажать утилитку reset xform, я так понял можно воспользоваться $.transform но вот пока не понял как
или я всё таки не туда двигаюсь ?
Desead, вот тебе улучшенный ResetXform, который сохраняет информацию о вращении, то бишь обнуляет только масштаб.
http://scriptspot.com/download.asp?ID=1937
Или просто напиши ResetXForm $ , но это только для макса 6
А у меня появился ламерский вопрос: Как можно назначить одному Эррею в качестве цвета другой Эррей.
Например у меня есть:
to COOPER: благодарю за помощь, вечером погляжу как там с цветом обстоят дела, чего если получится, то напишу
Ещё вопрос, совсем простенький
Есть две Point3... Как из них получить Matrix3? Пдразумевается что Scale будет равным 1
edit: Свою ошибку понял, конечно сморозил полную херню, нужна ещё одна Point3. Будем копать дальше..
У меня другая идея...
Как насчет продолжить доброе дело мешьтулз??
У меня есть идеи инструменов, которых мне не хватает...
например все наверно знаете Grow и Shrink?!
И наверно знаете Ring и Loop?!
так вот.. очень часто мне надо Совмещенная команда.. т.е. чтобы Ring не окутывал кольцем всю модель а выделял лишь ближайшие 2е грани...
Смогете?..
а то у меня всейчас времени нету разбираться и вспоминать максскрипт..
to COOPER: ну вот, тебе уже ответили, а я ещё даже не посмотрел :-)
по поводу выделений loop тоже вопрос у меня есть. Кто нибудь занет сам алгоритм по которому происходит выделение, на глаз понятно что там последовательные рёбра. Есть некоторые мысли но чтобы не изобретать с нуля велосипед, лучше его апгрейдить так сказать.
to Shiva: а мештулз автор больше не изменяет ??? я как то не задавался просто этим вопросом. Я давно пытался поглядеть алгоритм с помощью которого он реализует свои функции, но либо мне в тот момент знаний скрипта не хватало, либо моего образования, вообщем я понял только поверхностно. И с твоим выделением тоже разберёмся :-) мне 2 дня осталось до сдачи этапа, и постараюсь тебе помочь, если никто другой не опередит конечно.
А можно-ли каким-нибудь образом сохранить материалы нескольких объектов для того чтобы назначить их им же в дальнейшем? Ну наподобие вот того примера с цветами.
Что за фигня? Или где я туплю?
Пишу функцию, которая бы реагировала на смену выделения на уровне подобъекта. Пользуюсь Change Handler'ом. Функция:
спасиб, я уже понял что материалы - это дохлый номер. тогда остаётся только Vertex Colors..
Ого! Круто! Работает Но ринг это хорошо, а вот если бы ещё в ширину росло (луп) это былоб вообще замечательно!
Кстати модификатор Едит Поли наконец-то БУДЕТ в 7 максе
о, мастера, помогите тёмному! как заставить макс реагировать на выделение на уровне подобъекта! например при выделении фейса выполнять команду!
попробую поковырять PainterInterface
to pepper
Ура! У меня получилось!!!! Я сделал ПОЛИГОНАЛЬНУЮ СИСТЕМУ КООРДИНАТ! Причем, независимую от класса объекта - будь то Меш, Поли, Примитив и даже Нурбс. При старте она запросит сначала выделить объет, а затем выделить на нём Полигон. И всё! готова новая система координат Ну и намучался же я с этим Painterinterface На данный момент, это самое сложное из всего что я сделал за время изучения Максскрипта, а изучаю я его меньше недели
Вот сие творение, прошу любить и жаловать, а также не возмущаться в случае багов, а докладывать сюда
http://alexcooper.nm.ru/stuff/Cooper-PolyCoordinateSystem.zip
Апдейт - теперь, после создания системы координат, возвращает на тот уровень выделения, на котором был до начала функции
ну вы ребяты монcтры просто какие то. я тоже скриптом балуюсь помаленьку, по надобности...
кстати, объясните алгоритм Loop select и ring select
to pepper: посмотрел скрипт, всё просто и понятно, и чего спрашивается я не стал использовать готовое решение - ring, а написал его заново, не понятно.
кстати здесь :
$.EditablePoly.ConvertSelection subobjectLevel #Face
subobjectLevel = 4
$.EditablePoly.ConvertSelection subobjectLevel #Edge
subobjectLevel = 2
можно было и не ходить по уровням, убрать их вообще и во второй строчке написать $.EditablePoly.ConvertSelection #face #Edge
ну это я так, мысли вслух :-)))
тут поступило предложение дополнить всё это дело ещё и лупом, и подобным шринком...забацаем ! :-)
to pepper:
дальше буду делать как ты, через стандартные средства, так меньше работы получается :-)
здорово! приятно видеть мастеров за работой %) уже добавил оба скрипта в набор полезных тулзов. Pepper, вставь в начало кода disablesceneredraw() а перед update $ enablesceneredraw()
луп я уже смотрю готов, эх неуспел я, ну да это и хорошо, остался подобный шринк сделать.
pepper и Desead - молодцы!
Только хорошо бы все скрипты доводить до полезной завершенности.
Loop я так понял тоже работет только в одну сторону?!..
Давайте все таки соберем этот набор из Selection Tool в нечто полноценное и отдадим народу в пользование. )
Сам с удовольствием буду пользоваться.
я это вижу как 4е инструмента - 4е иконки на тулзбаре..
иконки могу нарисовать..
1) Grow Ring
2) Shrink Ring
3) Grow Loop
4) Shrink Loop
Но не забывайте, это инструмет, а инструмент должен быть быстрым и надежным!
Если он будет тормозить работу или глючить - толку тогда от него?..
Вспоминаю (да именно вспоминаю) CleanCut... замечательный удобный инструмент... если бы не вылетал раз в 5 минут!!
Странно что у тебя с клинкатом проблемы - у меня все путем, не знаю даже как без него сейчас было бы
имеется ввиду что неплохо бы иметь возможность как увеличивать выделение, так и уменьшать его
Именнно! )
каждый из них должен выполнять свою аналогию..
1) Grow Ring - выделение увеличиваеться по кольцу <IIII>
2) Shrink Ring - выделение уменьшаеться по кольцу >IIII<
3) Увеличиваетьяс по "Смежным"??? <---->
4) уменьшаетсья по смежным. >----<
А я вроде уже сделал.
С шринк лупом проблем почти нет.
А вот шринк ринг не работает только если веделенны ВСЕ грани рига(от одного края объекта до другого).....короче, тестим!
Если всё устроит, то заверну все скрипты, чтобы можно было хоткеи назначить
2 pepper: ...качаем, тестим, щас чё нить скажу :-)))
слегка глянул, при не 4 угольных полигонах работает loop странно, остальное пока не глядел :-)
пока не забыл, есть пару вопросов к общественности интересующейся скриптами :
1. на discreet есть документ - maxscript referense version four от января 2001 г, кто-нить встречал версию поновее ?
2. кто-нить знает насколько аккуратно скрипт работает с оперативной памятью, а то возникает ощущение что он всё очень сильно засоряет и за собой не убирает
3. кто-нить делал аналог майковского append polygon- а то строить полигоны по вертексам достало, по рёбрам быстрее.
4. в unwrap есть 2 очень полезные тулзы - stitch selected и pack uvs, но как и многое в максе до ума не доведённые. Кто нибудь их переделывал ? а то мне сейчас предстоит это делать. Проблема в следующем: при упаковке остаётся много свободного места, наверняка можно использовать более продуктивный алгоритм сортировки, а при склеивании(stitch) макс масштабирует только ребро, а не весь элемент - но ведь это же глупо, намного быстрей можно было раскладывать всё при наличии нормального ститча.
Опять же эти инструменты в первую очередь необходимы гейм разработчикам.
уххх... ну вроде всё, надеюсь хоть кто-то с чем-нить сталивался
ага, посмотрим как вы shrink победите
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: а почему ты думаешь что со шринком могут быть проблемы?
это вроде обычный алгоритм поиска решений
Алгоритм едж шринка:
1.выделенные ребра преобразуем в полигоны
2.создаем массивчик в который записываем полигоны, пренадлежащие данному еджу
Если выделенны 2 соседних еджа, то полигон в таком массиве встретится 2 раза.
Если полигон встречается 1 раз, то он являлется "крайним"(из которого мы получим крайние еджи))
Теперь непонятный кусок:
3.елси полигоны совпадют(их может быть >2) удаляем их из массива
(т.к. нам нужны полигоны, которые встречаются 1 раз)
так изложите алгоритм шринка на человеческом языке
to pepper: сам код то ясен, и про индексы полигонов 1 и 2 тоже понятно, мне именно алгоритм не понятен используемый тобой, без привязки к конкретному языку.
to 111: Конкретно алгоритм шринка, в моём понимании, я опишу тебе в понедельник, когда всё допишу и выложу.
Алгоритм такой:
Каждому еджу соответствует только 2 полигона.
(на рисунке стрелками показано соответствие эджа полигону)
Эти полигоны записываем в массив. Если их >2(на рисунке указано число повторений полигона в массиве), значит выделены соседние эджи.
Если полигон в массиве встречается один раз, значит он крайний и эдж его тоже крайний.
ммм.. а мне показалось что ты только для бордюров его используешь, понятно, в принципе я также размышляю :-)
to pepper:
вообщем мы немного по разному представляем себе алгоритм работы шринка и поэтому скрипты работают по разному. Я исходил из следующих соображений: от выделенных рёбер нужно получить такое выделение, которе при использовании ринга на 1 ребро(ну то что мы раньше написали) даст начальное выделение. хотя мне кажется в некоторых моментах ты не до конца прав
вообщем скрипт вот:
-----------------------
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: Алгоритм шринка в моём понимании(тот который в максе а не тот который используется скриптом) независимо от подуровня, переводим выделение в рёбра, и если ребро является бордюром то соотвествующее ему начальное выделение удаляем, повторяем для всех рёбер. вот и всё
2 Desead:
никто не заби(ы)л! все с интересом наблюдают, что же будет дальше!
3 pepper:
а я вот тут тоже без дела не сидел, и написал скрипт, который, внимание, конвертирует выделение ЭДЖЕЙ на уровне ЭДИТАБЛЕ ПОЛИ в ВЕРТЕКСЫ в ОКНЕ УНВРАП ЕДИТОРА! Так как в УНВРАП эдиторе нету Эджлупов и Рингов, вы выделяете на уровне едитабле поли с помощью эджей, а этот скрипт переносит это выделение на вертексы прямо в УНВРАП Эдитор! Чёрт, вот это было сложно %) Чуть репа не лопнула, оказывается у геометрического вертекса и у текстурного вертекса номера совсем разные, но номера ФЕЙСОВ всегда одинаковые, и благодаря этому можно вычислить какой геометрический вертекс соответствует текстурному!
Скрипт вроде работает, НО! Он работает по немного упрощенной схеме, поэтому он быстрый, но иногда может неправильно выделять КРАЙНИЙ ВЕРТЕКС! Как правило всего лишь один вертекс может быть выделен неправильно. Я думаю сделать более точную версию, но она будет медленнее... Поживем увидим, а пока:
полезный стрипт
щас я его заверну в MCR, и он станет ещё полезнее..
мастера, объясните, что за баг: после всех операций, проведенных скриптом, он как то отрицательно реагирует на команду $.unwrap_uvw.unwrap.edit(), и окошко, не успев открыться, сразу же закрывается... Я решил продублировать команду, вроде помогло.., но пока буду это место иметь ввиду.. И ещё, чем отличается команда $.unwrap_uvw.unwrap.edit() от $.unwrap_uvw.edit() ? Обе действуют одинаково
Умные вы парни, факт. А вот научить Макс чертить и печатать по автокадовски - слабо
вот первый кандидат на бетатестирование очень неплохо сидит в Кваде, и не появляется пока не соблюдены условия: должен быть выделен объект, он должен быть Едитабл Поли, и находиться вы должны на уровне Еджей. У меня он прошёл успешное тестирование, как на примитивах, так и на тяжеленных сетках, изуродованных всякими оптимайзами, но всякое бывает.
to COOPER: то что в анврапе нельзя выделять как в поли это бесит, но опять же есть стандартные средства для этого (COOPER только не кидай в меня камнями, я уже на второй твой скрипт так говорю :-)) )
я поступаю так выделяю в поли что мне надо, потом конвертю в поли и сверху анврап, и всё это выделение там, либо можно выделение передать через 2 подряд меш/поли селект. Но скриптом конечно быстрее, так что штука полезная, бесспорно.
ну а чем отличаются команды unwrapa пока не знаю, так как только сейчас впервые стараюсь начать писать скрипт для этого самого анврапа., потом если столкнусь скажу
кстати COOPER у тебя ася не пашет я так понял ?
насчёт камней, нет проблем, как я уже говорил, кому-то он пригодится, кому-то нет. кстати, взялся я за его написание по просьбе одного хорошего друга. я как полный дуралей, думал что всё просто - перекинул индексы геометрических вертексов в вертексы УВВ, проверил на примитиве, всё заработало, и я успокоился. а потом друг мне грит - мол так и так, он у тебя полную фигню выделяет.. и тут я понял, насколько всё сложно ) и закончить скрипт уже был вопрос принципа.
а стандартными средставми я щас попробовал, чего-то у меня не получилось. дело в том, что в Анврапе всё-же принято работать с вертексами, а выделять проще Эджами (лупами), вот я и взялся за написание.
ася работает, и практически всегда включена, просто я в инвизе. так что стучи, но сначала назовись, а то не открою
с вертексами это как то жутко медленно, я уж и не помню когда вообще переходил на этот режим, всё поликами и эджами, так быстрее. Кстати я вертексами только свариваю, больше вообще ничего не делаю на этом уровне.
про стандартные средства: попробовал я сейчас тоже и обратил внимание что то про что я написал работает только на поликах, а с эджами нет, а я как-то и не задумывался даже об этом. :-)))
ну тогда в конце можно будет добавить вариант с эджами и поли
наверное вы все знаете но всё же, на всякий случай
если лениво ошибки ловить
silentErrors:TRUE
или что наверное более правильно
try
(
)
catch
(
)
оп! я вроде делал через трай... видать когда копировал код в макроскрипт, эту часть упустил.. а что, глючит? где именно?
так, совсем я засиделся, уже гоню малость.. ведь точно помню что писал $.modifiers[#unwrap_uvw].unwrap.edit () ДВА раза, и сохранял, а сюда выложил нефиксенную! Извиняюсь, если кому то причинил неудобства, вот фиксенная, и через Try
ёёёё!! только что узнал что в UVW Unwrap Editor'e ЕСТЬ ЭДЖЛУП!!!
Вот эта команда! Быстро засовывайте её в менюхи!
$.unwrap_uvw.uvEdgeSelect()
Млять, сколько ещё я буду находить недокументированные возможности в Максе ?!?
п.с., но всё-равно, с теми штуками, что тут были сделаны Desead'om и Pepper'ом выделять всёже удобнее через EPoly а потом кидать в Unwrap
да COOPER ты прав, скрипты открывают глаза на макс, много становится более понятно и логично, а также не возникает вопросов почему именно так, но иногда возникает вопрос а почему именно это не доступно всем, и почему это программеры дискрит решили что некоторые функции всем юзать не обязательно...вообщем пошёл пробовать эдж-луп в анврапе :-)
...работает, хотя по имени и нескажешь что это луп, полезная вещь, спасиб.
Хм, COOPER, а можешь подробно описать Как ее туда запихнуть? (
В listener, но при открытом окне UVW Editora, ну и естественно при имеющемся выделении Эджей
Не, ты не понял.. ты говорил - забиндить кудысь..
было бы удобно его запихнуть вот в Квадру по кравой кнопке. (см. рис)
или к примеру добавить в UVWTools (script) но это уже посложнее наверно.
Кстате UVWTools это та фигня справа с кучей всякой полезности для анврапа.
нашел на scriptspot.com
аа, ну просто эту команду оформляешь как макроскрипт (*.mcr), кладешь в УИ\Макроскриптс, затем идешь в настройку Квадов, справа выбираешь Unwrap UVW Quad и перетаскиваешь туда этот скрипт
Ага.. спасибо.. я так и подумал, н опотом обратил внимание что в скриптах еще делают проверку, типа чтоб он не запускался при неправильных условиях... )
2pepper: дошли у меня руки до твоих скриптов.
Прикольно.
Почти то что надо. Почти.
Только что ганял скрипт - LoopShrink...
выцепил Глюк..
вот в такой ситуации как на картинке LoopShrink уже ничего не делает.
в чем прикол.. в том что ты проверяешь наличие Любых смежных граней, а не только по Loop... в чем прико лупа.. он работает ТОлько в случае если из одной точки выходят 4е грани.. тут и просто определить какая из них являеться Продолжением, а какие две являються Пересекающими.
Но!!
Этот скрипт который у тебя получился Тоже ОЧЕНЬ полезен..
Я бы его назвал Shrink Free Edge.
Ща буду дальше его гонять..
(скоро выпустим коллекцию скриптов от 3д центра )
ХаХаХа!!
С RingShring таже фигня но наоборот... он оставляет Разомкнутые грани. т.е. как бы в противоположность претидущемю.
Супер!!
У нас уже есть 2а дополняющих скрипта!
И не одного того что задумывалось с начала ))))
Надо придумать понятное название Этому скрипту.. тоже полезен будет.
Сейчас попробую разтолковать как Правильно...
(блин.. чувствую надо самому учить скрипт)
В случае с Лупами надо сначала сделать проверку (1):
есть выделенная грань, у которой есть два конца (vetrex)...
скрипт Отдельно работает с КАЖДЫМ вертексом.
с начала к пример у левым (как на картинке)
в идеале из этого вертекса долно исходить ЕЩЕ 3 грани! не больше и не меньше! (итого на 1 вертекс 4 грани)
тут не трудно определить что нам нужна Одна (голубая), остальные игнорируються как "пересекающие".
именно ЕЕ (голубую) мы выделяем в случае с Grow и именно по ней мы ориентируемся в случае с Shrink! (т.е. если она не выделена то мы убираем выделение и с нашей красной грани)
Остальные просто игнорируються!!!
НО, если в случае с GROW это условие с (1 vertex - 4 edge) Должно выолняться (иначе Grow не должен происходить) то в случае с Shrink - Если их НЕ четыре то учитываються Все.. т.е. надо чтоб на всех небыло выделения только тогда убераеться выделение с красной грани.
Потом также процедура происходит и с Правым (вторым вертексом) (если конечно к этому времени наша красная грань не потеряла и так выделения.)
Я ПРИДУМАЛ.. все просто!!!
GrowRing:
1) к выделеннию примени Grow
2) запомни какие грани выделелись.
3) отмени Grow
4) Примени Ring
5) через булиановскую опирацию AND сравни Запомненной и текущее выделение.
Все! )))
Остальное по томуже принципу
2Shiva: переделал скрипт луп шринка. Если подойтет - свисни.
Отлично. Работает...
Кстате Cooper сделал ShrinkRing по моему алгоритму... )
тоже отлично работает...
но тоже Очень медленно..
он сейчас работает над увеличением скорости... успешно причем..
смысл в том чтобы откинуть изночално ненужные еджи... %)
... стой, какой shrink ring? я не делал никакого shrink ring
чё то как я и говорил в начале ,скриптами под макс народ либо не интересуется либо не знает, никто даже ничего не спрашивает. Как подвигать чайник, например, скриптом, или ещё чё нить :-)))
2 Shiva, вообщем ломал я голову над скоростью и пришёл к неутешительному выводу что если писать руками некоторые стандартные вещи то скорости это не даст. у меня соображений пока нет никаких. получается на тяжёлой модели скорость с ~80 до ~60 сек уменьшил за счёт скрытия ненужных фэйсов, и всё, дальше наверное тупик, если на С не переходить конечно, но это глупо для такой тривиальной задачи.
и то и другое.. и не интересуются и не знают.
никому не охота самому что-то придумывать, все ищут волшебный плаг, который все сделает за них.
Насчет скрипта - не волнуйся, мало кто моделит поликами Тяжелые модели. если не трудно - приведи его в божеский вид, и соберем наконец это Selection Tools from 3Dcenter
ЭЭЭЭ.... я понимаю, наболело.. но харе офтопить.
у меня иконки уже готовы, хочу скрипты финальные увидеть, готовые к инсталяции в тулбар. 8D
Ну ладно ладно У меня есть мега-предложение. А давайте-ка сделаем нормальный Chamfer Чтобы не гладкий срез был, а скруглённый с заданным радиусом и количеством сегментов. Я наверное раз сто слышал от совершенно разных людей такое пожелание и сам с ними целиком согласен
Мой план таков (хотя он безусловно может быть неверным изначально):
Сначала выделяем нужные эджи (рис 1) и делаем обычный чамфер (рис 2)
затем находим промежуточные эджи, возникшие после чамфера (рис 3) и конектим их с заданным количеством конектов (рис 4). и наконец самое интересное - выделяем новые вертексы, и сдвигаем их согласно какой-нибудь супер-мега-формуле, чтобы они образовывали дугу.
Хоть на первый взгляд это и кажется фантастикой, я сам дошёл аж до пятого пункта, и при этом в конце у меня имелось сохранённое выделение граничных эджей, полученных после чамфера (рис 2), затем имеются номера промежуточных эджей (рис 3) и номера соответствующих этим эджам вертексов. То есть мы знаем что "в эдже номер 9, полученном после чамфера используются вертексы номер 4 и 13" а потом, когда этот эдж разобъется на много новых эджей, мы наверное как нибудь можем использовать полезно эту информацию о старых вертексах.
При всём этом багаже я думаю реально найти для какого "старого" промежуточного эжа (точнее лупа из нескольких новых эджей) соответсвуют новые вертексы, полученные после коннекта (рис 5) и затем уже их сдвинуть по формуле, формирующей дугу %) Но на этом, увы, мои знания заканчиваются.
Есть ещё извращенческий вариант - использовать Arc Shape и Bevel Profile. Сначала рисуется арка между вертексами (как - не имею ни малейшего представления ) Затем из эджа объекта делается сплайн, и ко всему этому хозяйству применяется Bevel Profile. Последнего даже настраивать не надо, главное сместить Пивот арки в её основание, то есть в самый низ
интересно послушать мнения мастеров по поводу этого бреда.
Что интересно - я нашёл нечто похожее в CSPolyTools. Там есть функция Push, которая выдавливает вертексы вдоль их нормалей (точнее нормалей смежных фейсов). В принципе функция давно устарела, так как такое можно сделать просто переключив координатную систему на Локальную, но нам это может пригодиться. Ещё, там же есть функия Spherify, которая сдвигает выделенные вертексы относительно заданной точки, таким образом что они сформировывают сферу. Так что, почти всё есть для нормального чамфера, осталось только всё это собрать воедино
2 Shiva: вот финальная версия, постараюсь послезавтра на её основе луп сварганить
у файлика меняем раширение на mcr, а то сюда нельзя такие заливать
2 C00PER: думай прощще.. Чамфер это Актуально.. даже Очень.. я прост не хотел еще и этим вас грузить )))
и так... есть РАДИУС и есть кол-во сегментов...
все просто - применяем Обычный чамфер столько раз, сколько сегментов у нас надо /2 и радиус тоже уменьшаем у каждого следующего толи в 2а толи в 4е раза..
ерунда хочу нормальный чамфер
Слушай COOPER, а в натуре чего голову ломать, я так с тобой пообщался, потом пошёл взял 2 справочника по вышке и тригонометрии, посмотрел так уныло на функции косинусов и арккосинусов, совсем натроение упало. Лучше наверное несколько чемферов по умному оформить в скрипт, в конце концов это макс а не автокад, и всё, вот будет и скругление, косяк конечно в том что таким образом кол-во ребёр может быть только чётным.
блин, пока я писал, уже твая ерунда появилась :-)))
Desead, вспомни что я говорил в начале нашего разговора - всё будет не так просто. А ты - "это же элементарно, простая матиматика" Выходит я был прав А несколько чамферов получаются неровно! Как бы ты не старался побдирать значения
Согласен с Шивой, че марочится с дугой, если результат будет такой же как если бы чамферили находя промежуточное расстояние. Проблема в том как это расстояние найти
вы конечно будете плеваться, но:
aa = 10
for i=1 to 3 do
(
aa = aa / 2
print aa
$.edgeChamfer = aa
$.EditablePoly.buttonOp #Chamfer
)
но вопрос с коефициентом не отпадает ((.. он должен быть гдето 2.2хххх
2 COOPER: конечно только математика :-) здесь больше ничего и не надо. Я подхожу не только со стороны сложности скрипта, а ещё и со стороны трудозатрат. Допусти я только час убил чтобы вспомнить, найти и вновь понять что такое арккосинус, так как понятное дело что в повседневке это мне не надо.
Я согласен что приятнее работать с чемфером который, ты знаешь, создаёт скос по идеально правильной и математически точно васчитанной дуге, но какой от этого прок ???, я думаю никакого.
Только не подумай что я отказываюсь писать этот скрпит, мы уже договорились с тобой что сделаем - значит сделаем ! сейчас вот Shive лооп только отдам и всё ,сразу за чемфер :-)))
Если и делать "нормальный Chamfer", то только с возможностью
задания профиля скругления.
Алгоритм простой:нарезаем(cut) n-прямых,параллельных выбранной и
расставляем(move) их согласно профилю.
Профиль будем задавать через Curve Control.
слушай, а это идея... в Softimage XSI есть даже возможность выбора сплайнового объекта в качестве профиля для среза
вот давайте только без сплайного профиля :-))))))))
а что за зверь такой - curve control ???
щас погляжу справку
А в чем собственно проблема? Исходя из предыдущей картинки выставить точки по ровной дуге не представляет никакой сложности. Каждая следующая точка встает сюда:
x = r*cos(a);
y = r*sin(a);
/*
Это относительно СК, которая имеет ноль относительно мира в иксе крайней из гоизонтальных точек и в игрике крайней из вертикальных. Перевести потом значения из этой СК в любую другую тоже не представляет никаких трудностей.
*/
Теперь r - это радиус вашей дуги, а "a" это угол, который образуется в результате проведения луча от начала координат в очередную точку, т.е.:
a = 90 - arctg(d/h), для "горизонтальных" точек и
a = arctg(d/h), для "вертикальных".
d - это расстояние между очередной точкой и предыдущей (если она первая, то d = 0);
h - расстояние от начала нашей СК до первой точки.
Считаем всего две координаты, т.к. в данном случае мы работаем в плоскости боковой грани, а если хотите зачамферить все грани по периметру, то там то же самое, но работаете в плоскости которая как бы входит в угол под 45 градусов - но все равно плоскость.
Удачи!
ага, вот я примерно о том же, чистая математика, правда в скрипте чуть сложнее будет, так как нужно ещё и плоскость найти которая делит пополам два фейса использующие это ребро, и уже в её координатах всё это ваять, и там ещё некоторые моменты возникают связанные именно с реализацией на конкретном языке
:-)))
Ну вот наконец я и доделал этот луп тоже....вообщем мне даже самому понравилось, поставил оба скрипта себе в квад, нихай работают коли написаны :-))), для желающих скачиваем по ссылочке, и все дружно хлопаем в ладоши Shive который заставил всё это дело написать, а сейчас ещё и красиво оформит всё это дело с кнопочками да пимпочками
ps и конечно не забываем сменить расширение у файла с тхт на mcr
пиво в студию
COOPER а ты был прав по поводу такого чемфера, народ просто с ума сходит от того что в максе нельзя сделать нормально скругление еджей. Я тут совершенно случайно просто наткнулся сразу на несколько таких топиков !!! ,даже и не думал что это кому то надо !
Млин, я тожа от этого с ума схожу
Я, например, как только увидел в Рино их замечательную фаску, так сразу и влюбился (в хорошем смысле)
Млин, я тожа от этого с ума схожу
Я, например, как только увидел в Рино их замечательную фаску, так сразу и влюбился (в хорошем смысле)
И таааааак... Вот так вот оно выглядит у меня.
ОГРОМНОЕ спасибо Desead и Pepper за скрипты.
Забирайте. инструкция по установке внутри.
О всех багах, прозьбах и предложениях пишите здесь. )
спасибо ребята, офигенную работу проделали!!!
2Shiva: обьясни мне непонятливому для чего нужны эти кнопки?(см.рис)
сколько уже с meshtools'ом работаю, но так до сих пор и не понял истинного их назначения
если не трудно покажи на примерах
ну первый вращает эйдж (выбери один ейдж и понажимай кнопку)
а второе - это типа Релакс.. выбираешь группу вертексов, жмешь на кнопку, потом тыкаешь кудато в экран и водишь в разные стороны выбирая степень сглаживания сетки..
тот что вращает эдж у меня его сразу же "убивает", стирает тоесть
и часто ли ты это вращение используешь? не легче ли побыстрому ремувить эдж, а затем его создать с помощью того же коннекта точек?
Чесно - вообще не пользуюсь. Скажем так.. я не пользуюсь бОльшей частью Мештулзов.. может просто потому что незнаю где и как их удобно использовать.
не, вращение это тема ,я его даже на отдельный кей вынес.
ГЫЫЫ! быстренько идём на скриптспот, и в поиске пишем ChamferMadness
) Воистину существует какая-то телепатическая связь
но это просто обычный чемфер, с используемым индексом 2.62, это не честное скругление :-))))))))))))))))
дык и я о чём! самое интересное - если учесть что на написание этого скрипта у него ушло какое то время, плюс какое-то время он болтался в отстойнике скриптспота, прежде чем его выложили, из этого можно сделать вывод, что автор занялся написанием скрипта в тот же момент когда я предложил эту идею может он к нам наведывался?
ситуация следующая
нужна кнопка, при нажатии на которую соединялись бы полигоны(см. рис.)
или в максе есть такая функция?
p.s: знаю что в полимагусе есть что то подобное, но там соединение эджей, к тому же не очень стабильное
есть данная штука в максе, connect называется, расположена там же где булеан, но не очень гибкая и в некоторых случаях говорят странная. Хотя данная операция на самом деле нужна частенько, стоит подумать о её написании
Да ты чего, друг! В Meshtools'ах такое с рождения присутствует )
polyOp.getVertsUsingEdge $ эдж
а вообще полазий по главе Editable_Poly Methods. Там много интересного
хм...
я был тоже приятно удивлен, заметив что это есть в meshtools'е под названием connect
ещё сильнее я удивился когда узрел этот коннект в действии по создании дырки в кубе, вот так, одним нажатием
а я то извращался
в хелпе по макскрипту, что идёт с максом
п.с. А конект тот немного недоделан. В XSI к примеру можно так конектить любое количество поликов, а тут только 2. Еслиб я понял принцип его работы, может бы доделал, но разбираться в чужом скрипте ещё сложнее чем писать его самому
п.п.с. Хех. Что-то мне кажется что МОЖНО сделать конект для любого количества полигонов, или точнее для двух групп с любым количеством, но чтоб в каждой группе количество было одинаково.... попробую поразмыслить об этом на досуге, хотя у меня такая большая очередь стоит недописанных скриптов
а я вот смысл коонекта тоже не могу сформулировать ,как же блин это ??? :-))
ПОВЕЛИТЕЛИ СКРИПТОВ, а что вы всё по моделингу да по моделингу, может кто поможет мне? Как написать такой скрипт: чтобы менялась прозрачность отдельных партиклов в зависимости от скорости, т.е. чем выше скорость частицы, тем непрозрачнее частица.
PS: ну отттттчень надо!! PLZ
PS: если не трудно, выложите прямо сам скрипт.
а я тока моделингом и занимаюсь потому всё в основном понему и пишу и по материалам, вот щас за анврап ещё взялся
а тебе помочь сможет следующая строчка, но это для superspay, для других не смотрел, но думаю так же
if $.speed > X then $.visibility = Y
где
X - скорость при которой меняется порог видимости
Y - необходимая прозрачность при заданном пороге скорости
соответсвтенно работает только когда твой патикл выделен
прошу прощения за тупой вопрос, но куда это всё писать?
я работаю в максе 5 и этот скрипт нужен для следующего: я сделал в realflow атмосферу(воздух, который должен быть невидимый) и запустил пулю через него, получилось, что пуля режет воздух. Этот скрипт должен скрывать частицы пока они не отразились от пули. Я бы рад всё это сделать в ParticleFlow, но там так реально не получится. А может есть конвертилка частиц realflow в particleflow?(тогда сразу отпадёт вопрос)
вот оказывается как матрицы рождаются :-))), я с патиклами вообще не работаю, поэтому здесь помочь не смогу. А ты уверен что в particle flow реально не получиться ,вроде говорят мощная система.
а скрипты запускать так: жмёш ф11, в появивишимся окне ctrl+n, и пишешь что надо, для запуска на выполнение жмёш ctrl+e
1) Desead, спсиб, но ведь скрипту, на скока я знаю, надо както указать к чему применяться, или мне надо выделить партиклы? ОК, ща попробую..
2) в particle flow реально не получиться, т.к. тама у меня до сих пор не получилось сделать соударение частиц друг с другом..
ну да, забыл написать что объект должен быть выделен, знак доллара обозначает выделенный объект
..не работает, т.е. работает, но частицы становятся полностью прозрачными и зависимости нет..
..что я делаю: выделяю емитер, F11, new script, ctrl+v(if $.speed > 0 then $.visibility = 1), ctrl+e..
!!..замечу, что двигаются только партиклы, а не емитер..!!
PS..наверное у меня руки кривые..
кхе-кхе, вернемся к нашим баранам...а точнее к чамферу...
до чего я дошел см. картинку
т.е выделенный эдж можно заменить набором эджей, пущенных по созданному(вами) сплайну.
Сейчас у меня возникли две очень маленькие проблемы. Если мы их решим - будет, на мой взгляд, очень полезный скрипт.
1. Как видно на картинке выделенный сплайн направлен в сторону "от" куба. Для выбранных мной еджей полигоны построились в правильном направлении. А вот если бы, я выбрал противоположный едж куба, то полигоны все-равно строились бы в таком же напрвлении. Т.е. "не в ту сторону".
Кто может подсказать, как можно сделать align сплайна к ребру куба.(желательно скрипт)
2.полигоны я создаю функцией polyop.createPolygon,для которой очень важен порядок вертексов(по и против часовой стрелки). Как узнать порядок вертексов:когда они в соответствии с обходом по часовой стрелки а когда нет
ого! вот так неожиданность! удивил, действительно удивил!
аналог рельсов для поликов было бы очень полезно иметь.
Вот надумал разбираться с максовским скриптом. Пока назрел такой вопрос, думаю не сложный:
как узнать координату точки (через скрипт), зная её номер?
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
ну то что существует разница между $ и 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. Что говорит о том, что это совершенно разные методы выбирания объектов, но вот почему второе и третье дают такую разницу, непонятно, ведь это одно и тоже. но оказывается, не совсем. спасибо, будем иметь ввиду, что всегда лучше назначать команды в переменные, нежели выполнять команды в командах вот жаль что по чамферу помочь не могу %(
ыыы! а ты попробуй вот так:
ts1 = timestamp()
b=$
for i=1 to 5000000 do b
ts2=timestamp()
format "time=%" ((ts2-ts1) / 1000.0)
получишь время самого быстрого из тех примеров! во дела
pepper Спасибо за подсказку. Посмотрел - все ништяк
и еще вопросец: можно ли с помощью скрипта узнать какие точки принадлежат полигону?
p.s. когда надоем с вопросами, скажите...
чё то давно я сюда не заглядывал :-)
Пеппер реально ПЕРЕЦ !!!!!!! :-))) молодца
постараюсь помочь тебе с разворотом сплайна относительно выделенного ребра !
2 Pepper: можно вычислить матрицу3 на основе ребра и напр. первой точки сплайна. (по трем точкам) и относительно этой СК вычисляй все нужн. тебе координаты. Если я правильно тебя понял:-)
Реально круто!!! Поздновато я сюда поселился... Сэньк за скрипты. Поставил - Реально, мужики!!!! :beer:
А как сделать, чтоб не ругался, когда ничего не выделено?
Я тут про вращение скрипт налабал под 7й Макс, но вроде должен идти под ранние версии. Там топик мой висит еще. Как вам кажется, пригодный скрипт?
Короче нашел я как добавлять ролауты...
addRollout итп.
Но в окне они почемуто не хотят лепиться. появляются только под окошком МаксСкрипт в последней закладке...
вроде и с английским нормально, но не могу я найти как их запихнуть в окно.
пишу
utitlity buck "Buck's"
(
.....
on buck open do
(
addRollout rot
)
)--конец utility
createdialog тыры-пыры
создает окно, а ролаут создается только в последней закладке
В указателе: Rollout Floaters as Extended viewports
Все, разобрался, спасибо!
О блин, шикарная ветка У меня идейка пару недель назад сформировалась, сделать скрипт, похожий на скрипт пепера, но только для бевела - бевел по сплайну, может уже есть где?
2 Buck:
c роллаутами тока вручную пожалуйста не парься, зачем ? ведь есть визуальный макс скрипт где всё это вписывается автоматом и само !
2 Desead
конечно! я с визуала и начинал скрипт изучать...
Я с мах скриптом работую недавно.
может кто знает как с его помошью создавать линии.
хелп знает
почитай главу "How do I create a line between two points?"
Хелп, как правило, вообще все знает, так что сначала к нему, а потом уже сюда, не раньше.
Простые вопросы.
короче, что хочу:
1) как сделать, чтобы при однократном "нажатии на кнопку" выполнялась одна команда, а при провторном на нее же - другая? например, нужно сделать кнопки управления вьюпортами таким образом, чтобы при первом нажатии, напр., кнопки "Top" выполнялось max vpt top, а при повторном - на нее же - max zoomext sel all. Я сначала сделал запуск обеих команд с одного нажатия Тор, но это оказалось не всегда удобно.Хочется знать, как запустить именно так, как написано выше.
2)еще вот: из-за частого использования SelectionFilters пришлось вынести их на кнопки, ( выпадающие списки не люблю - промахиваюсь. Это оказалось лехко, но захотелось для большего удобства вот чего:есть, напр., кнопки, задающие фильтры (Geometry, Lights etc - кроме кнопки ALL.) - КАК сделать, чтобы при нажатии на одну из этих кнопок она оставалась в положении "On", а при "выключении" все сбрасывалось в положение "All"? Типа переключателя? Знаю только, что надо использовать выражение On IsChecked, но шняга выходит.
..все ети траблы из разряда несмертельных, просто любопытно, но если кто нить найдет время объяснить, буду оч. благодарен.
В общем, помогите инвалиду
ну что, никто..??
Какая жаль
1)
Спасибо, Куп, как всегда, выручаешь.
А с терпением, да, нелады.. не в курсе. как пофиксить?
2 secco: возможно для обоих вопросв: заведи глобальную переменную типа bool и проверяй ее при нажатии.
Не люблю я глобальные переменные, некрасиво это и не использую. Даже не скажу будет ли это правильно. Но в теории должно сработать.
а про второй пункт, наверное путано написал,
Короче:
Есть кнопка Geometry, на ней висит команда setSelectFilter 2.
Нажмаешь ее - она остается вкл.(как привязки. например) - нажмаешь ее еще раз - она отжимается, и фильтры переходят в положение all, т.е. выполняется команда setSelectFilter 1.
Так понятней?
Сомневаюсь.)
В любом случае спасибо.
to -=VG=-
а чем плохи глобальные переменные?
Хотя я все равно не пойму.
Братцы, помните об такой подлянке.
пишу листенеру
2 Cooper:
Можно спросить по поводу скрипта кот. соединяет 2 точки на сплайнах? Я когда начинаю править их - у меня при преобразовании каждой точки в Bezier Corner не получается редактировать созданные линии. На них появляется что-то вроде управляющей точки с крестиком на конце, а дальше что делать не знаю
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
при желании можно добавить чтобы сразу были безьер-корнерами.
Суть в том что величины выводятся в листенер с недостаточной точностью.
Если флоат-величина хранится в переменной, потом ты её вывел в листенер, то не факт, что то, что тебе покажет листенер будет равно тому что хранится в переменной.
Мало того, что они будут не совсем равны, так и все стандартные максскриптовские сравнивалки (типа файндИтем) тоже скажут что они не равны!!!!
нда. а вот и мой пример - простейший Mousetool
Я совсем не разбираюсь в Maxscript, да и в 3ds max собственно тоже, поэтому такой вопрос. Мне нужно чтобы студенту в обучающей программе по инженерной графике предоставлялась возможность в отдельном окне ввести координаты точки, а потом учитывая эти координаты происходило следующие: появлялись три плоскости проекции в объеме и в этом же объеме точка с этими координатами, потом появлялись ее проекции на эти плоскости, потом сама точка исчезала, плоскости разворачивались и клались как-бы на чертежный лист, потом между проекциями нашей точки проводились линии связи.
Все должно быть анимировано, чтобы человек понял что при развороте плоскостей на чертежный лист координаты точки соохраняются( все это похоже на то когда кубическую коробку из под телевизора рвешь по граням и раскладываешь на полу). Анимацию сделать несложно , но как сделать , чтобы координаты в отдельном окне студент с клавы вводил я не знаю. Вообщем подскажите хотя бы сложно это в 3ds max или нет. Заранее спасибо....
делаешь думи к которому привязана анимация. и всё. пусть вводит координаты думи - она туда и передвинется.
а вообще скриптом ооой как много чего сделать можно.
dummy - объект пустышка. просто объект которого не видно. спецом для таких случаев, когда надо что-то как-то хитро залинковать.
книшки любые хорошие (я не знаю конкретно)
максскрипт почти эксклюзивно по хелпу и по примерам других скриптов.
Подучиваю С++
Провёл експеримент, на сколько максскрипт медленней математику считает.
В С++ и в Максскрипте запускал в цикле одинаковые математические выражение с флоат величинами.
Получилось что в С++ они щитались в 166 раз быстрее. Вот так.
Есть ощущение, что в случае заковыристых долгих операций с использованием большого кол-ва памяти, это отношение должно неподетски возрасти. (ну там фрагментирование оперативной памяти и прочии неподвластные земному уму штучки)
всего то 166 раз? маловата что-то
Можно ли с помощью скрипта управлять перемещение по сцене как в каком нибудь шутере при помощи курсора и мышки, а то со стандартным управлением я запарился уже. Кстати эта функция была неплохо реализована в вобщем то, отстойной проге 3d canvas. Если это есть скажите где взять такой скрипт
3ds max 7
Врядли кто-нибудь будет писать скрипт на функцию, уже реализованную в 7 Максе (если до этого конечно не написали), так, что, думаю, тебе легче достать 7й макс.
И всё таки если есть у кого то такой скрипт дайте знать
http://www.scriptspot.com/download.asp?ID=2100 - разве что в этом наборе.
Да.. моя мечта чтобы сделали транслятор Maxscript -> C++ (в качестве скомпиленого и готового к употреблению плага)..
Т.е. Написал ты скрипт- модификатор, а с помощью транслятора - перевёл его в *.dlm.
Для скорости естественно..
было б крута
Приветы.
Я в MAXScripte полный ламер.
С синтаксисом языка ваще не знаком.
Опишите пожалуййста как в сцене создать примитив.
И как вообще запускать скрипт?
2 Bolat
Для начала начни читать хелп по MAXScript - по мере понимания принципов работы со скриптом, ставь конкретные задачи, и ищи пути их решения с помощью MaxScript используя тот-же хелп..
Там кстати и примеров много..
примитив создать? легко - box()
2 C00PER
не каждый примитив= вох %)
но и далеко не каждый бокс - примитив
G_M
Я читаю англиский хелп - ниче понять не могу.
в хелпе ж есть чуть ли не раздел примеров - how to называется кажется
Cистаксис языка построен на тех-же принципах что и C++
В разы проще естественно..
Не знаю я как можно непонимать мануала - учитывая, что дискриты обычно много времени тратят на доступность и понятность..
Вот кстати есть немножечко для начала:
http://paulneale.com/tutorials/GCDSigNotes/GDCMaxScriptClass2005.htm
а в помощь начинающему как в мс зделать проверку
ну типа есть chetbox если он включен рендерим такуюта камеру ,если нет то мы ее пропускаем тут програмерский народ говорит что есть такая функ.if но как её реализовать не представлаю даже смутно (Новичок)....:)помогите плизззз
очень надо зарание спасибо!
Подскажите малограмотному. Как редактировать флоат-величину побитно?
(это чтоб неймед селекшены сохранять через УВВ)
Как я понимаю специальных средств в максскрипте для этого не предусмотрено. (поправте, коль ошибаюсь). Тобишь нельзя обратиться к биту флоат переменной. Но должна быть закономерность по которой человеческие числа переводятся в биты флоата. Знает её кто-нибудь?
Можно, канешна, просто топорно представлять обе части переменной как сумму степеней двойки. Но так у меня получается что теряются несколько бит. И ваще, хочется сделать паелегантней.
Вот мои изыскания:
Я так понимаю в флоате должно быть 32 бита.
максимальное значение флоата: 3.40282e+038
Если это переписать так : 340282e+032 получается 6 бит на експоненту (вместе с её знаком) и 15 бит на основную чать, плюс её знак, того 22 бита. Где-то ещё 10 бит. Листенер не отображает несколько десятичных знаков, но всё равно все биты найти мне не удалось.
Величины:
340282.001e+032
и
340282.005e+032
максскрипт воспринимает как разные.
А вот
340282.001e+032
и
340282.004e+032
как одинаковые.
То есть в дробной части явно меньше 10 бит.
А как обе части флоат величины по-умному называются?
Привет 3D программерам. Вопрос - как прочитать информацию о материалах, а точнее о всех цветах диффуза на всех объектах во всей сцене? А потом полученную инфу обработать. Нужно одномерный массив составлять?
Вопрос номер 2 - как получить значения RGB выделенного объекта с произвольным именем? Спасибо!
Мда..... Спасибо ВСЕМ что ответили....
Даже и не знаю спрашивать или не спрашивать.......
вобщем такая делема - описываю функцию в начале скрипта, в функции ссылаюсь на роллаут.лайбл.текст - при выполнении функции выдаёт ошибку что мол не могу найти такой лейбл! ПЕРЕМЕЩАЮ функцию в конец скрипта (полсе инициализации этого лейбла) - но возникла следующая проблема - переменная (описываемая в функции) вызывается из тела скрипта - пишет что не может найти переменную, так как она ещё не определена..... что делать?
поставь скобочки () в начале и в конце скрипта и заведи локальные переменные для имен функции или ролоута. Пользуйся. Или хелп про локальные и гловальные переменные почитай.
P.S. по предудущим вопросам все есть в хелпе.
arr=for i in objects collect i.material.diffuse - если все материал у кажного объекта один. Или нужно смотреть на тип материала и ..... Здесь довольно много примеров с материалами было.
ECXIMER
Скачай мой конвертер и посмотри, там очень много полезной информации для тебя будет.
Вооот, Другое дело! Спасиб!
ЗЫ В первый и второй я сам уже допёр.... через Купера Спасибо ему!
Я в максе уже месяц,но к моему позору я не знаю че такое макскрипт и че он ткого делает? обьясните,а?
У меня прогресс сёдня узнал что если нажать Ctrl+D в листенере, он очистится.
Если вдруг кто-то ещё не знает - ЗНАЙТЕ!!!!!!!
Есть и еще куча очень полезных комбинаций.
Например выделить весь текст между скобками Ctrl+B кажись.
ВСЕМ УЧИТЬ КЛАВИАТУРНЫЕ СОКРАЩЕНИЯ
2Antosha Marchenko
ctrl+D не работает в 7м максе, моэет это ты про 8?
21асс
какие ещё полезные комбинации кроме Ctrl+B?
Это для Едитора:
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.
vopros nachinayushego: u menya yes mesh. ya xochu rozrezat dva rebra etogo mesha i soedinit rebrom. kak eto sdelat?
У меня возник вопрос: при создании нового скрипта, к примеру:
(
k=10
)
print k
дожно выводится сообщение "10", у меня же ВСЕ сообщения выводятся по 2 (!!) раза. Что делать? Причем это не только в этом скрипте, а во всех!!
это если из листенера, а как нормально через ран запустишь - то по одному разу будет писать.
пишу участок скрипта, где обьект по передвижению ползунка поворачивается вдоль оси, а потом по кнопке 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 назад не возвращается, обьект хоть и сбрасывает поворот, но следующее действие начинает от предыдущего угла поворота. Как это можно исправить?
Здравствуйте,
В процессе освоения максскрипта у меня возникла проблема.
Написал скрипт для анализа координат вертексов в поли.
строка:
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]
у меня когда-то тоже была подобная проблема - так и не решил... просто сделать пришлось через копчик...
в твоем скрипте у меня все работает, но я за место b[a] вставил цифры (что тебя за массивы я не знаю), у меня есть подозрения что эти значения всетки отличаются, но на очень мало значение, оно даже не выводиться на печать, но это только моё предположение...
Svetozar как ты оказался прав, разрази меня гром!
2-е суток я этот баг убивал. Оказалось надо было просто ceil*1000 сделать этим значениям. Кто бы мог подумать, что в максе координаты 2 точек на одной оси могут отличаться на 0.00001 единицу даже если бокс только нарисован!
И эта сволочь (макс) же не выдает этого!
От радости забыл поблагодарить
Спасибо за совет!
пожалуйста :о)
почему то, когда у меня была такая проблема - я не догадался... %(
помозжите, делаю анимацию
с помосчью 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 должно считаться в другую сторону, то есть наубывание
не подскажете , уважаемые. можно ли сделать так , чтоб роллаут выскакивал по хоткею . например, прямо возле курсора мыши? есть ли это в хелпе, есл можно? я чет не нашел, там много про мышь, может пропустил
спасибо, Влад, уже разрулил, делал также, через mouse.pos со смещением , дешево и сердито
Уважаемые не подскажете как заставить работать скрипт вот основные строки
все бы так отвечали сами на свои вопросы %)
у меня вопрос,
если я юзаю какую нить команду(например)
getRefCoordSys()
она мне возварщают тип выбаннй координатной системы
есил мне надо чтоб при выбранной системе системе View команда выводила мне не #hybrid, а именно словво View?
тоже. например , при $.constrainType (в поли)
чтоб возвращало не циферки, а нужные мне слова, Edge или Face например
еще вопрос, плиз
если я юзаю команду
snapmode.type
мне выводит Undefined -- но тока до тех пор, пока не поменяешь тип привязки. на любой, хотя на тот же, что и был
как избавиться от этого? не менять/возвращать же ее принудително, тока чтоб не видеть этого Undefined //
EDIT - в 9ке ксати, этого бага нет
и еще - можно ли получить значние плолжения Angle Snap(on--off)?
чет в хелпе тишина, видимо можно тока вкл - выкл,,или как?
скриптоманы.. подскажите че тут не так?
вот запускаю скрипт- он пашет потом выдает
смотрю где он спотыкается
-- 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 скрипт предназначен для импорта из ДАТ файла в макс
а никто не скажет, как получить номер материал ID
чет в хелпе не могу найти
оживим темку
ожень нужно узнать+) как макс определяет копии объектов в сцене, в частности как можно найти все копии при выделении одного из этих объектов
Поковыряй, там видно как:
[attachmentid=101928]
Оно уже делает то, что ты просишь.
Выделяешь объект и запускаешь скрипт из мекнюшки.
Положи в стартап скриптов и ищи в Customize Ui- CFScripts. Назначь на кнопку или тулбар.
Или выковыряй кусок кода - как хочешь.
Только не копии, а инстансы. Копии независимы по определению.
2 CyberFlipper,вай вай спасибо
надеюсь что то что нужно+)
ЗЫ:что за голова хотел спросить про инстансы, а написал про копии+)
не понимаю, зачем писать скрипт для выделения инстансов, когда макс сам по себе это умеет:
нажимаем кнопку Select by Name, ставим галку select Dependents, и ещё раз тыкаем на имя объекта
megavitus пробовал и так, но видать руки у меня кривые
to CyberFlipper:
да я тоже грешеным делом писал тока у меня осталось make instanсe/unique, а выделялку прибил как только узнал что можно и так.
подскажите код, чтобы скрипт выполнялся применительно к instance объектам (не всем инстансам в сцене, понятное дело, а к тем которые являются инстами друг друга) только один раз
а то классическая ламерская ошибка - сколько среди выбранных объектов инстансов, столько раз применительно к нему выполняется функция (в моем случае добавляется модификатор)
и еще, как фильтровать объекты по названию (не classOf а именно названию) модификатора, допустим верхнего в стеке, по идее должно быть как то так
if $.modifiers[1].name == "foo" do (foo)
но не пашет
Простой вариант: modPanel.addModToSelection (Uvwmap ()) ui:on
Интерфейс ModPanel сам сообразит, какому объекту что и как добавлять
Могу предложить сложный, если нужно
не, не пашет, через modPanel модификатор добавляется ко всем объектам сразу, а нормально запустить for цикл через нее нельзя (или я не знаю как)
т.е.
for o in $ do (modPanel.addModToSelection (Uvwmap ()) ui:on)
просто добавит ко всем объектам модификатор столько раз, сколько выбрано объектов, потому что в modPanel.addModToSelection нельзя поставить переменную "о", после modPanel.addModToSelection может идти только модификатор
давай сложный способ
Можно и так:
2CyberFlipper, что то не пашет, у тебя самого он работает? у меня он создает один общий модификатор на все выделенные объекты
for obj in selection where obj.modifiers["UVW Mapping"]==undefined do AddModifier obj (Uvwmap())
если на объекте (среди выделенных) нет модифера UVWMap (во всем стеке!!!) - то этa строчка скрипта добавит его. А при инстансах он добавит в первый инстанс, а потом на следующих пропустит
Ну да, один на все. А нужно было другое? Тогда я недопонял...
-=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()) работает норм
deleteModifier <node> <modifier_or_index> в этой команде подразумевается, что ты будешь удалять модификатор (если не по индексу удалять хочешь), который присутствует в стеке (настроенный и т.п., т.е. именно ссылка на модфикатор стека), а
deleteModifier $ (Bend()) - тут получается, что эта команда будет искать в стеке модификатор, который ты только что в этой - же команде и создал, т.е. новый, и которого в стеке естественно нет
посему должно работать например так:
deleteModifier $ $.modifiers["Bend"]
-=VG=-, понятно, спс еще раз
Вот начал изучать по-тихоньку Maxscript и застрял на одном месте... Подскажите плз, что нужно написать, чтобы в материал эдиторе, например, у материала с именем VRayMtl4 изменить параметр Sample Type на costum sample object?
Господа, как-нибудь можно реализовать в скрипте, чтобы постоянно при всяком открытии сцены выполнялась функция setProperty?
скажите, а можно как то обновлять роллаут, чтоб он реагировал на внишние изменения?
напримет. у меня есть ролаут со спиннером например ObjID
и чтоб при изменении ID из другого места роллаут обновлялся автоматически, чтоб не делать доп. кнопок типа GetID..
или так, чтоб роллаут даже реагировал на выделение
объекта или на смену подобъектов, как в орифлейме..
кто знает плз, скажите, в каком напривлении копать, тут колбек нужен или че?
если меняется только значение в поле спиннера, то так и напиши (в колбэке или событии и т.п.):
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
ок,спс, будем искать
эт я для себя тут напишу, а то забываю - потом ищу долго
showproperties -- очень важная команда
Может кто-нибудь подсказать какими командами можно изменять параметры операндов в ProBoolean т.е. мне нужен аналог строки но для ProBoolean а не для Boolean:
$.Operand_B_Transform.pos = [10.0,15.0,10.0]
Извиняюсь за ПРИМИТИВНЫЙ вопрос:
Подскажите код выполняющий данную последовательность действий:
- применение к выделенному полику ID=1
- extrude by local Normal на -200
- применение ID=2
P.S. Спасибо за то что прочитали и не обматюгали.
подскажите пожалуйста, мне надо по имени проверять объект из массива и если у него первая часть совпадает с нужным именем делаем уже действие. у меня есть например Branch42 Branch43 и stem мне нужно с бранчами что нить сделать
if obj.name=="Branch*" then () непомогло
ищи в хелпе про операции со строками в частности substring
спасибо. разобрался. извините, протупил, сколько раз в php юзал функции сравнения, а тут в ступор впал. еще раз спасибо
как получить ссылку на только что созданный VrayProxy ?
vrayMeshExport <node> meshFile:vray_path autoCreateProxies:true exportMultiple:false
Скачал скриптик для быстрого рендера в Вирей, очень удобный скрипт, я его запускал через MaxSript-Run
но как повесить его на кнопку? поставил его в автозагрузку, но что то не нашел его название хотя внутри скрипта порылся, но что то не выудил.
Может быть там это не предусмотерно, но как быть? Помогите пожалуйста, кто нибудь переделайте скрипт так чтобы можно было его в Customize UI найти.
http://3dcenter.ru/forum/index.php?showtopic=85102&pid=1013705&st=0entry1013705
Пожалуйста дайте ответ ленивому до help-а человеку:
как закодировать копирование выбранного polygon-а _!по направлению его нормали!_???
Подскажите, пожалуйста, как применять модификаторы типа bend?есть такой фрагмент:
p=plane()
p.bend.axis=0
p.bend.angle=50
но при запуске появляется ошибка: unknown property bend
т.е. модификатор трактуется как свойство? и как это обходить?
В этом фрагменте пропущена строчка, в которой к созданному плейну применяется модификатор, естественно макс ругается
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
Спасибо, megavitus! Совет пригодился!
А как работать со свойствами видимости объектов? Допустим, что-то простое- сделать плавно исчезающий шар?
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
Спасибо!
можно ли проверять находиться ли какой нибудь объект в заданном диапазоне по Х и по Y?
Вопроса не понял - проверять положение? Или габариты?
Положение - .pos
Габариты - свойства .min, .max. Только они неточные. На сплайнах могут врать.
Более точный способ описан в хелпе, в разделе "How do I calculate the Volume of an Object?"
не. нужно выяснить есть ли в данном диапазоне, лопустим х: -10, 10 у: -10, 10 какие либо объекты, это хочу сделать с такой целью, рассаживание деревьев как по скатеру, только чтобы не пересекались и не стояли слишком близко друг с другом.
извиняюсь за глупый вопрос, но как повернуть объект в нужный угол. примерно если по х он развернут на 60 градусов, а надо поставить на 0. что то уже и с хелпом и с книгой сижу, не могу найти
2 andrew-donald
мне нравится этот способ - $[3][2][1].value=0.0
andrew-donald: Ищи в хелпе eulerAngles
2 megavitus
а чем мой вариант не устраивает?
Устраивает не видел твой ответ
виноват. немного не корректно сразу сформулировал вопрос. у меня объект атачиться на другой через pos.controler attachment. при таком вращении объект выравниваеться по нормалям плоскости к которой приатачен. а я хочу выравнять объект чтобы он был ровно вверх. типа разсадка деревьев.
andrew-donald: Если я тебя правильно понял, у тебя там "Align to Surface" галка стоит. А так вообще $.dir =[0,0,1], если без контроллера
Ребята, подскажите мне пожалуйста, возможно ли в MaxScript работа с картами материалов вообще? То есть грубо говоря можно ли в MaxScript реализовать простейшие арифметические операции, ну как со слоями в фотошопе, или нужно обязательно омпилировать библиотечку? Я конечно понимаю что есть MapLayers плагин или как он там называется, но интересует возможно ли это в самом макс скрипте, и без компиляции?
_hidden_: Возможно, если ты будешь попиксельно складывать В свойствах bitmap для этого есть инструментарий. А вот кстати ссылка завалялась на фотошопские режемы: http://www.pegtop.net/delphi/articles/blendmodes/
Как реализовать средствами скрипта создание нового объекта (ну допустим группа из 4 боксов, соединенных в короб или штука на втором рисунке)?
[attachmentid=121688]
Чтоб потом создавать новые подобные объекты или редактировать свойства уже созданных (причем не просто габаритные размеры или координаты, но и для второго примера например - глубину выдавливания полигонов, добавление или нет фаски на выдавливаемые грани и т.п.).
Готовое решение не нужно, хотелось бы понять в каком направление копать, может подобный вопрос для начинающих изучение максскрипта где-то уже обсуждался?
007: Копай в сторону Scripted SimpleObject Plug-ins.
Обсуждалось http://3dcenter.ru/forum/index.php?showtopic=80430&st=0&p=946728entry946728
спасибо
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".
нашел, решил, спасибо
подскажите новичку в скриптологии : какой функцией найти в сцене объект, которому не назначен ни один из материалов ?
или даже так - найти объект, в котором может содержаться полигон, на который не назначен материал
ситуация простая - перед конвертацией модели в игровой движок её нужно приготовить, ну обресетить всё, сколлапсить стеки и пр. иначе конвертер не проглотит модель
Joden: Объекты без матов легко:
for obj in geometry where obj.mat==undefined do print obj
По полигонам чуть сложнее.
ну хотя бы в каком направлении двигаться ? ....... сам не могу сообразить
Есть в модификаторе Smooth такая замечательная функция как Prevent Indirect Smoothing.
Помогает с корректным смусом в некоторых случаях.
- Можно ли как-то до нее добраться для объекта trimesh при создании своего simpleObject ?
- И как там же назначить различным полигонам различные ID ?
- И накинуть в итоге на созданное "произведение" мультсабмат ?
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? По моему это некорректно и ненужно.
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 не очень понял что делает
ух ты, спасибо огромное !
макскриптовский хелп полон чудесных знаний, надо только уметь их из него добыть )))
никто не знает. можно такое окно сделать в максскрипт, интересуют именно тумбнайлы.
например есть папка с превъюхами. и в ролауте отображаются они в таком виде.
в хелпе не нашел. может плохо искал
может активХ или дотнет надо курить? пните в нужную сторону , если кто в курсе
можно. плохо искал. пинаю. ImgTag
2 megavitus
а можно как-то в теле on buildmesh установить для объекта точные координаты (мировые), а
не просто подвигать его туда-сюда с помощью передвижения всех его точек ?
OO7: Не уверен, но кажется нельзя, у подобъектов в контексте simpleObject, вообще судя по всему отсутствует матрица трансформации. Все происходит в локальных координатах.
Можно немного оптимизировать функцию movemesh из того примера, чтобы побыстрее работала:
fn movemesh &m p = (
meshop.moveVert m #{1..(m.numverts)} p
)--fn movemesh
Ещё можно покопать plugin geometry, там вроде можно.
можно конечно извратиться и создавать объект не в точке которую указываем мышью (gridPoint), а с абсолютными координатами [0,0,0], точнее не сам объект а его пивот. сам же объект смещать как нам надо.
и если забить на то, что пивот в итоге будет фиг знает где относительно объекта, то вполне получается )))
но это изврат (((
заметочка "для себя"
getUserPropBuffer - отличная команда
есть ли где инфа на русском по структуре максскрипта?
а то непонимаю что я неправильно делаю.
нужно на кнопочку назначить применение 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 какимто макаром
)
)
2gotik(Unter):
c = linear_position()
$Box01.pos.controller = c
То-же самое для rotation и scale.
а как написать чтоб он применял линерпоз не только на боксы, а на любой выделеный едитибол_поли
или $Box01 это общее имя для всех объектов?
условие проверки на 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)
Типо так.
спасибо попробую
жалко в архитектуру скрипта так и не вкурил -(
ЗЫ: а проверку на любой меш (поли/едитполи/едитеболмеш/ и тп) как производить?
А поконкретнее? Бывают, кроме перечисленных, ещё объекты с модификаторами, например экструдированный сплайн. Сформулируй точно, каким объектам ты хочешь менять контроллеры.
все редактируемые меши без модификаторов
Форум Invision Power Board (http://nulled.cc)
© Invision Power Services (http://nulled.cc)