1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "Общие вопросы", создана пользователем AlexanderZ, 21 дек 2011.

Модераторы: Артер
  1. AlexanderZ

    AlexanderZ Знаток

    С нами с:
    08.01.2004
    Сообщения:
    108
    Симпатии:
    1
    Баллы:
    48
    вчера я зажимал шифт при таскании за рычаги безье-кривой, и рычаги привязывались к вертикали-горизонтали.
    сегодня я зажимаю шифт, и рычаги разбиваются, превращая безье в безье корнер.
    страдаю. что я нажал и как мне вернуться к первоначальному состоянию?
    спасибо.
     
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.255
    Симпатии:
    172
    Баллы:
    65
    Что означает "рычаги привязывались к вертикали-горизонтали"?
    Вы работаете одновременно с рычагами одной вершины или нескольких вершин?

    Чтобы превратить вершину Bezier в Bezier Corner с помощью клавишей Shift, нужно в свитке Selection включить Alike.
    Если включить All, тогда вершина Bezier не превратиться в Bezier Corner с помощью клавишей Shift.
     
  3. AlexanderZ

    AlexanderZ Знаток

    С нами с:
    08.01.2004
    Сообщения:
    108
    Симпатии:
    1
    Баллы:
    48
    о, спасибо, уже близко, но не совсем.
    работаю с одной вершиной сплайна. таскаю "гантелю" безье. если повернуть ее почти горизонтально или вертикально зажимая шифт, она становилась жестко горизонтальной или, соответственно вертикальной. а теперь нажатие шифт стало выполнять другую функцию. "гантеля" разбивается вершиной и точка становится безье корнер.
    включение alike по Вашему совету не дает "гантеле" разбиваться, но и привязка к вертикали/горизонтали не срабатывает.
    уточню, что раньше это работало при всех отключенных привязках. я же не сошел с ума, правда? )
     
  4. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.255
    Симпатии:
    172
    Баллы:
    65
    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. Сделайте копию сцены перед тем, как использовать скрипт.
     
  5. AlexanderZ

    AlexanderZ Знаток

    С нами с:
    08.01.2004
    Сообщения:
    108
    Симпатии:
    1
    Баллы:
    48

    ничего себе
    igorznag, большое спасибо за старания.
    попробую. )
     
Модераторы: Артер

Поделиться этой страницей