2013-11-15 70 views
0

我目前正試圖通過一些任意矩陣轉換某個對象的透視。Maxscript訪問完整對象偏移轉換(非統一比例)

到目前爲止,我已經能夠在沒有應用任何非均勻尺度的情況下完成它,但是當目標對象具有一些不均勻尺度時,它會中斷。

我有,這個工作,這將需要訪問objectOffset,這似乎是MAXScript中unavalaible的scalerotationpart的印象。

這將使用C++ SDK是可行作爲objectOffset尺度被表示爲ScaleValue(其含有比例矢量和一個四元數,見SDK docs)。

我錯過了一些明顯的東西嗎?還是我必須製作一些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

我不是100%肯定我明白了你的問題的要點權,但基本的答案是肯定',你需要一個更復雜的轉換堆棧來實現你想要的而不是簡單的PRS。

您想將變換應用於對象的軸心點,同時對實際對象進行反變換以將其保持在同一世界空間中。這可以通過簡單的PRS直到你添加不一致的比例。

在應用計數器刻度之前,您需要刪除對象旋轉的效果以恢復到正交基。你想要做的是origPRS * newPRS * Inv(newPRS)* offsetPRS。逆分解爲inv(S)* inv(R)* inv(P)(逆序)。經過一番雜耍之後,你的變換堆棧變成了PRS * P * R * Inv(R)* S * R.你可以用來做一個縮放值。

但是,我強烈建議您不要這樣做。它會工作一次,但是當你的藝術家嘗試旋轉關鍵點時,你會再次打破一切,當然你不能將任何動畫應用到系統。

根據你想要做什麼,解決這個問題的最好方法可能是「借用」CAT層次結構。您可以創建CAT控制器(取決於您的Max版本,並且只能通過MaxScript),這些控制器會自動補償不均勻的比例尺,從而使您的實體保持正交空間。基本上歸結爲'你想達到什麼',但它可能更容易以另一種方式解決它。

+0

另外 - 不要忘記,如果您在C++中爲obj-offset創建了旋轉縮放比例,則藝術家無法將其移除。 – FrozenKiwi

+0

感謝您的洞察力,我在嘗試編寫一些樞軸對齊時遇到了這種情況,這種對齊方式在具有不均勻比例的對象上失敗。基本上我採取了安全路線並在這些應用了ResetXForm。我只是試圖檢查maxscript是否比C++更不具有操作obj-offset的表現力。 – rotoglup