2013-11-15 3 views
0

현재 임의의 행렬로 객체의 피벗을 변환하려고합니다.전체 객체 오프셋 변환에 대한 Maxscript 액세스 (비 균일 스케일)

지금까지는 비 균일 스케일을 적용하지 않고 객체에 대해 수행 할 수 있었지만 대상 객체에 일정하지 않은 비늘이있는 경우 중단됩니다.

나는이 작업을 위해, 이것은 scalerotationpart MAXScript를에 unavalaible 것 같다 objectOffset,의에 액세스 할 필요가, 인상을 가지고있다. objectOffset 규모가 ScaleValue로 표현 된 바와 같이

은 (a 규모 벡터 및 쿼터니언 포함 SDK docs 참조)가 C++ SDK를 사용하여 행할 수있다.

나는 분명한 뭔가를 놓치고 있습니까? 아니면 작동하도록 maxscript 플러그인 확장을 만들어야합니까?

감사합니다,

내 출발점이었다 다음과 같은 기능 :

fn AlignPivotTo Obj Trgt = 
(
    -- http://forums.cgsociety.org/archive/index.php/t-636495.html 
    --This fails miserably for any objects having a negative or non-uniform scale, but it seems to work well in any other case I have tested: 

    -- 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 
    local deltaTransform = obj.transform * inverse Trgt 
    TmOffset *= deltaTransform 

    -- Apply matrix 
    Obj.transform = Trgt 

    -- Restore offsets 
    Obj.objectOffsetPos = TmOffset.translationPart * inverse TmOffset.scalerotationpart 
    Obj.objectOffsetRot = TmOffset.rotationPart * invers eTmOffset.scalerotationpart 
    Obj.objectOffsetScale = TmOffset.scalePart 

    -- Restore child transforms 
    for i = 1 to Obj.children.count do (Obj.children[i].transform = ChldTms[i] * inverse Trgt * Obj.transform) 
) 

답변

0

I 아니에요 100 % 내가 바로 당신의 질문의 요점을 가지고 있지만, 기본적인 대답은 '예'입니다 확인 ', 간단한 PRS보다 원하는 것을 얻기 위해보다 복잡한 변환 스택이 필요합니다.

실제 세계를 동일하게 유지하기 위해 실제 객체를 반 변환하는 동안 객체의 피벗 점에 변환을 적용하려고합니다. 균일하지 않은 스케일을 추가 할 때까지 간단한 PRS로 가능합니다.

카운터 스케일을 적용하려면 먼저 직각으로 되돌리려면 객체 회전의 효과를 제거해야합니다. 당신이하고 싶은 것은 origPRS * newPRS * Inv (newPRS) * offsetPRS입니다. Inverse는 inv (S) * inv (R) * inv (P) (역순)로 분해됩니다. 당신의 변형 스택을 저글링 한 후 PRS * P * R * Inv (R) * S * R이됩니다. 수 있습니다.은 스케일 값으로합니다.

그러나이 작업을 수행하지 않는 것이 좋습니다. 한번은 작동하지만 아티스트가 피벗 회전을 시도 할 때 모든 것을 다시 깨뜨릴 것이며 물론 모든 애니메이션을 시스템에 적용 할 수는 없습니다.

당신이하고 싶은 것에 따라, 이것에 접근하는 가장 좋은 방법은 CAT 계층을 '빌리는 것'일 것입니다. 직각 좌표계에서 엔티티를 유지하기 위해 비 균일 스케일을 자동으로 보정하는 CAT 컨트롤러를 만들 수 있습니다 (Max 버전에 따라 MaxScript를 통해서만 가능). 근본적으로 그것은 '무엇을 성취하려고 하는가'에 달려 있지만 아마도 다른 방식으로 그것을 해결하는 것이 더 쉬울 것입니다.

+0

또한 obj-offset에 대해 C++에서 회전 된 스케일을 만드는 경우 아티스트가이를 제거 할 수 없음을 잊지 마십시오. – FrozenKiwi

+0

통찰력을 가져 주셔서 감사 드리며, 일정하지 않은 비늘이있는 객체에서 실패한 피벗 정렬을 스크립트로 작성하는 동안이 문제가 발생했습니다. 기본적으로 안전한 경로를 가져 와서 ResetXForm을 적용했습니다. 난 maxscript obj - 오프셋 조작 C++보다 덜 표현 있는지 확인하려고 해요. – rotoglup