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

Поворот кости, но не её оси

Тема в разделе "MAXScript", создана пользователем Ловец Смыслов, 24 июл 2011.

Модераторы: Savin Denis
  1. Ловец Смыслов

    Ловец Смыслов Активный участник

    С нами с:
    02.04.2005
    Сообщения:
    75
    Симпатии:
    0
    Баллы:
    10
    Нужно сделать скрипт который бы поворачивал выделенные кости на определённый угол, но не поворачивал бы ось.
    Из разных источников мне удалось собрать несколько вариантов,
    но все они вместе с объектом поворачивают и его ось.

    Варианты:

    Код:
    $.boneEnable=false
    toolMode.coordsys #local
    maxops.pivotmode = #objectonly
    
    rotate $ (angleaxis -90 [0,0,1])
    Код:
    $.boneEnable=false
    toolMode.coordsys #local
    maxops.pivotmode = #objectonly
    
    currentMatrix = $.transform
    preRotate currentMatrix (eulertoquat (eulerAngles 0 0 -90))
    $.transform = currentMatrix
    Код:
    ------------------------------------------------------
    -- Set the given object's rotation to the given values
    ------------------------------------------------------
    
    $.boneEnable=false
    toolMode.coordsys #local
    maxops.pivotmode = #objectonly
    
    fn SetObjectRotation obj rx ry rz =
    (
    	-- Reset the object's transformation matrix so that 
    	-- it only includes position and scale information. 
    	-- Doing this clears out any previous object rotation.
    	local translateMat = transMatrix obj.transform.pos
    	local scaleMat = scaleMatrix obj.transform.scale
    	obj.transform = scaleMat * translateMat
       
    	-- Perform each axis rotation individually
    	rotate obj (angleaxis rx [1,0,0])
    	rotate obj (angleaxis ry [0,1,0])
    	rotate obj (angleaxis rz [0,0,1])
    )
    
    -- Set currently selected Object's rotation to 80 50 100
    SetObjectRotation selection[1] 0 0 -90
    Важное уточнение: после или до поворота мне все эти кости нужно уменьшить на определённое значение, например так
    Код:
    $.width = 0.125
    $.height = 0.125
    $.length = 0.125
    Пожалуйста подскажите решение.
     
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Попробуй использовать модификатор XForm. Или он не подходит для решения этой задачи?
    Код:
    m=XForm();
    m.gizmo.rotation=(eulertoquat (eulerAngles 0 0 -90)) 
    addmodifier $ m
     
  3. Ловец Смыслов

    Ловец Смыслов Активный участник

    С нами с:
    02.04.2005
    Сообщения:
    75
    Симпатии:
    0
    Баллы:
    10
    спасибо за ответ,
    но на костях не должно быть модификаторов.
    как в последствии от него избавится?
    не хочу просто чтобы с стеке у кости болтался модификатор
     
  4. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Попробуй использовать функцию RotatePivotOnly, которая находится в главе Using Node Transform Properties.
    Код:
    fn RotatePivotOnly obj rotation= ( 
    local rotValInv=inverse (rotation as quat)
    animate off in coordsys local obj.rotation*=RotValInv
    obj.objectoffsetrot*=RotValInv
    obj.objectoffsetpos*=RotValInv
    )
    
    a_z=-90
    for obj in $selection do
    (
    animate off in coordsys local rotate obj (eulerAngles 0 0 -a_z);
    RotatePivotOnly obj (eulerAngles 0 0 a_z);
    )
     
  5. Ловец Смыслов

    Ловец Смыслов Активный участник

    С нами с:
    02.04.2005
    Сообщения:
    75
    Симпатии:
    0
    Баллы:
    10
    igorznag, спасибо
    отлично работает на выбранных объектах.
    как раз начал копать в направлении углов эйлера
    я так понимаю скрипт поворачивает сначала объект, а потом поворачивает обратно его пивот.
    Сейчас буду пробывать привязывать регулировку углов к спинерам.

    немного не по теме сопутствующий вопрос:
    как таким же методом можно сделать realigntochild кости и чтобы ось оставалась на месте
    использую код:

    Код:
    $.boneEnable=true				
    for ra in selection do ra.realignBoneToChild ()
    $.boneEnable=false
    
    я так понимаю RotatePivotOnly уже не применим.
     
  6. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Попробуй использовать функцию AlignPivotTo, которая находится в этой теме:Aligning only the pivot of an object using MAXScript. Сообщение 18.
    Код:
    (
    fn AlignPivotTo Obj Trgt =
    (
    -- Get matrix from object
    if classOf Trgt != matrix3 then Trgt = Trgt.transform
    
    -- Store child transforms
    local ChldTms = in coordSys Trgt ( for Chld in Obj.children collect Chld.transform )
    
    -- Current offset transform matrix
    local TmScale = scaleMatrix Obj.objectOffsetScale
    local TmRot = Obj.objectOffsetRot as matrix3
    local TmPos = transMatrix Obj.objectOffsetPos
    local TmOffset = TmScale * TmRot * TmPos
    
    -- New offset transform matrix
    TmOffset *= obj.transform * inverse Trgt
    
    -- Apply matrix
    Obj.transform = Trgt
    
    -- Restore offsets
    Obj.objectOffsetPos = TmOffset.translation
    Obj.objectOffsetRot = TmOffset.rotation
    Obj.objectOffsetScale = TmOffset.scale
    
    -- Restore child transforms
    for i = 1 to Obj.children.count do Obj.children[i].transform = ChldTms[i] * inverse Trgt * Obj.transform
    )
    
    $.boneEnable=true 
    for ra in selection do 
    (
    t=ra.transform
    ra.realignBoneToChild(); 
    AlignPivotTo ra t
    )
    $.boneEnable=false 
    )
     
  7. Ловец Смыслов

    Ловец Смыслов Активный участник

    С нами с:
    02.04.2005
    Сообщения:
    75
    Симпатии:
    0
    Баллы:
    10
    Оно работает! Отлично! Спасибо.
    Я ещё только учусь и мне было бы доволно сложно до этого додуматься так же быстро как мне это нужно.
    После использования этого скрипта мне нужно протянуть кость то этого чайлда функцией

    Код:
    for b in selection do b.resetBoneStretch()
    правильно ли будет подставить её в конец?

    Код:
    ...
    $.boneEnable=true 
    for ra in selection do 
    ( 
    t=ra.transform 
    ra.realignBoneToChild(); 
    ra.resetBoneStretch(); --вот эта
    AlignPivotTo ra t  
    ) 
    $.boneEnable=false
    
    для меня это работает.
    но правильно ли это с технической точки зрения?
     
Модераторы: Savin Denis

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