Render.ru

edit spline непонятки с рычагами безье

Рейтинг
92
#1
вчера я зажимал шифт при таскании за рычаги безье-кривой, и рычаги привязывались к вертикали-горизонтали.
сегодня я зажимаю шифт, и рычаги разбиваются, превращая безье в безье корнер.
страдаю. что я нажал и как мне вернуться к первоначальному состоянию?
спасибо.
 

igorznag

Мастер
Рейтинг
103
#2
Что означает "рычаги привязывались к вертикали-горизонтали"?
Вы работаете одновременно с рычагами одной вершины или нескольких вершин?

Чтобы превратить вершину Bezier в Bezier Corner с помощью клавишей Shift, нужно в свитке Selection включить Alike.
Если включить All, тогда вершина Bezier не превратиться в Bezier Corner с помощью клавишей Shift.
 
Рейтинг
92
#3
о, спасибо, уже близко, но не совсем.
работаю с одной вершиной сплайна. таскаю "гантелю" безье. если повернуть ее почти горизонтально или вертикально зажимая шифт, она становилась жестко горизонтальной или, соответственно вертикальной. а теперь нажатие шифт стало выполнять другую функцию. "гантеля" разбивается вершиной и точка становится безье корнер.
включение alike по Вашему совету не дает "гантеле" разбиваться, но и привязка к вертикали/горизонтали не срабатывает.
уточню, что раньше это работало при всех отключенных привязках. я же не сошел с ума, правда? )
 

igorznag

Мастер
Рейтинг
103
#4
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. Сделайте копию сцены перед тем, как использовать скрипт.
 
Сверху