Render.ru

Как сделать разноцветный сплайн?

Ушвуд Ushwood

Пользователь сайта
Рейтинг
2
#1
Господа, у меня возникла задача, которую я не совсем понимаю, как решить.

Задача состоит из двух частей.

Во-первых, мне нужно в 3DS MAX создать "шланг" (т.е. сплайн с круглым сечением заданной толщины) по точкам с заданными координатами. Как нарисовать сплайн вручную, я знаю, но точек очень много (несколько сотен или тысяч), и хотелось бы автоматизировать процесс.

На мой взгляд, лучше всего для этой цели воспользоваться МаксСкриптом. Я пошерстил хелп и родил следующее:


Код:
 fn drawSpline point1 point2 point3 point4 =
(
   ss = SplineShape pos:point1
   addNewSpline ss
   addKnot ss 1 #smooth #curve Point1
   addKnot ss 1 #smooth #curve Point2
   addKnot ss 1 #smooth #curve Point3
   addKnot ss 1 #smooth #curve Point4
   updateShape ss
   ss
)
newSpline = drawSpline [10,20,30] [100,200,10] [0,300,400] [-50,200,200]
(пример с четырьмя точками, но я уже убедился, что эта штука работает и с 1000.)
Уже в 3д-студии я задаю толщину шланга и его видимость.

Не уверен, что это оптимальный путь, но это ладно.

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

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

Ушвуд Ushwood

Пользователь сайта
Рейтинг
2
#2
Окей, решение я нашел. Оно, похоже, немного через задницу, но дает нужный результат.

Решение вот какое: отдельно в другой программе создается битмап с нужными цветами в нужных местах, а потом этот битмап через Материал Эдитор натягивается на готовый шланг.
 

ЛМА

Смотритель
Рейтинг
1 048
#3
А назначать каждому сегменту (линия между точками) свой отдельный ID и потом применить ко всему шлангу мультиматериал где каждому сегменту будет соответствовать свой отдельный материал не пробовали?
 

igorznag

Знаток
Рейтинг
72
#4
Попробуйте такой вариант. В новой сцене запускаем скрипт:
Код:
fn drawSpline point1 point2 point3 point4 points_count =
(
    ss = SplineShape pos:point1
    addNewSpline ss
    mm=multimaterial numsubs:(points_count-1)
    addKnot ss 1 #smooth #curve Point1
    addKnot ss 1 #smooth #curve Point2
    m=standard();m.diffuse=color 255 0 0; mm.materialList[1]=m
    addKnot ss 1 #smooth #curve Point3
    m=standard();m.diffuse=color 0 255 0; mm.materialList[2]=m
    addKnot ss 1 #smooth #curve Point4
    m=standard();m.diffuse=color 0 0 255; mm.materialList[3]=m
    updateShape ss
    ss.steps=10; ss.optimize=false; ss.adaptive=false
    ss.render_displayRenderMesh=true; ss.render_thickness=30; ss.render_sides=12
    sides_=ss.render_sides; steps_=ss.steps+1; faces_count=sides_*steps_*(points_count-1)
    converttopoly ss
    polyop.deletefaces ss #{(faces_count+1)..(polyop.getNumFaces ss)}
    for i=1 to (points_count-1) do polyop.setFaceMatID ss #{((i-1)*sides_*steps_+1)..(i*sides_*steps_)} i
    polyop.setEdgeSelection ss (polyop.getOpenEdges ss); ss.capHoles #Edge
    ss.material=mm
    ss
)
newSpline = drawSpline [10,20,30] [100,200,10] [0,300,400] [-50,200,200] 4
select newSpline;max zoomext sel; completeredraw()
1.jpg
 

Ушвуд Ushwood

Пользователь сайта
Рейтинг
2
#5
Попробуйте такой вариант. В новой сцене запускаем скрипт:
Код:
fn drawSpline point1 point2 point3 point4 points_count =
(
    ss = SplineShape pos:point1
    addNewSpline ss
    mm=multimaterial numsubs:(points_count-1)
    addKnot ss 1 #smooth #curve Point1
    addKnot ss 1 #smooth #curve Point2
    m=standard();m.diffuse=color 255 0 0; mm.materialList[1]=m
    addKnot ss 1 #smooth #curve Point3
    m=standard();m.diffuse=color 0 255 0; mm.materialList[2]=m
    addKnot ss 1 #smooth #curve Point4
    m=standard();m.diffuse=color 0 0 255; mm.materialList[3]=m
    updateShape ss
    ss.steps=10; ss.optimize=false; ss.adaptive=false
    ss.render_displayRenderMesh=true; ss.render_thickness=30; ss.render_sides=12
    sides_=ss.render_sides; steps_=ss.steps+1; faces_count=sides_*steps_*(points_count-1)
    converttopoly ss
    polyop.deletefaces ss #{(faces_count+1)..(polyop.getNumFaces ss)}
    for i=1 to (points_count-1) do polyop.setFaceMatID ss #{((i-1)*sides_*steps_+1)..(i*sides_*steps_)} i
    polyop.setEdgeSelection ss (polyop.getOpenEdges ss); ss.capHoles #Edge
    ss.material=mm
    ss
)
newSpline = drawSpline [10,20,30] [100,200,10] [0,300,400] [-50,200,200] 4
select newSpline;max zoomext sel; completeredraw()
Посмотреть вложение 269532
Большое спасибо, это то, что надо!
 
Сверху