AlexanderZ
Я не знаю, если есть такая возможность в 3ds max.
Но что-то похожее можно сделать с помощью MaxScript.
Я написал простой скрипт. Попробуйте его использовать:
1. В новой сцене создаем один сплайн (используя вид Top, Front, Left).
2. Выделяем одну вершину Bezier. Сплайн должен быть без модификаторов.
3. Устанавливаем "гантели" почти горизонтально (вертикально).
4. Запускаем скрипт. В новом окне нажимаем кнопку "Align ...".
Код:
fn getNearestVector vec =
(
k=1;a=[1,0,0]
if(abs vec.x>=abs vec.y and abs vec.x>=abs vec.z)then
(if(vec.x<0)then k=-1;a=[1,0,0])
if(abs vec.y>=abs vec.x and abs vec.y>=abs vec.z)then
(if(vec.y<0)then k=-1;a=[0,1,0])
if(abs vec.z>=abs vec.x and abs vec.z>=abs vec.y)then
(if(vec.z<0)then k=-1;a=[0,0,1])
temp=k*a*length(vec); return temp;
)
rollout igorznag_align_spline_handles "Align spline bezier handles" width:220 height:70
(
button btn_align "Align handles to World axis" pos:[10,10] width:200 height:50
on btn_align pressed do
(
undo on
(
if($selection.count==1)then
(
obj=$selection[1]
if(obj!=undefined)then
(
if(classof obj==line or classof obj==SplineShape)then
(
splines_count=numSplines obj; splines_vertices_selection=#()
for i=1 to splines_count do
(spline_vertices_selection=getKnotSelection obj i;
for j=1 to spline_vertices_selection.count do
(
append splines_vertices_selection #(i,spline_vertices_selection[j])
)
)
if(splines_vertices_selection.count==1)then
(
line_number=splines_vertices_selection[1][1]
knot_number=splines_vertices_selection[1][2]
vertex_type=getKnotType obj line_number knot_number
if(vertex_type==#bezier)then
(
porigin_temp=getKnotPoint obj line_number knot_number
pin_temp=getInVec obj line_number knot_number
pout_temp=getOutVec obj line_number knot_number
if(length(pin_temp-porigin_temp)<0.000001)then
(
vout=getNearestVector (pout_temp-porigin_temp);
vout=vout+porigin_temp;setOutVec obj line_number knot_number vout;
)
else if(length(pout_temp-porigin_temp)<0.000001)then
(
vin=getNearestVector (pin_temp-porigin_temp);
vin=vin+porigin_temp; setInVec obj line_number knot_number vin;
)
else
(
vin=getNearestVector (pin_temp-porigin_temp); vout=normalize(-vin)*(length (pout_temp-porigin_temp))
vin=vin+porigin_temp;vout=vout+porigin_temp;
setInVec obj line_number knot_number vin;
setOutVec obj line_number knot_number vout;
)
updateShape obj; redrawViews();
)
)
)
)
)
)
)
)
createdialog igorznag_align_spline_handles
Чтобы запустить скрипт нужно:
1. Создаем текстовый файл (NotePad) и копируем код (текст) скрипта.
2. Сохраняем текстовый файл с названием "test.ms"
3. В главное меню MaxScript выбираем пункт Run Script. Выбираем файл "test.ms"
P.S. Сделайте копию сцены перед тем, как использовать скрипт.