我目前正試圖通過一些任意矩陣轉換某個對象的透視。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)
)
另外 - 不要忘記,如果您在C++中爲obj-offset創建了旋轉縮放比例,則藝術家無法將其移除。 – FrozenKiwi
感謝您的洞察力,我在嘗試編寫一些樞軸對齊時遇到了這種情況,這種對齊方式在具有不均勻比例的對象上失敗。基本上我採取了安全路線並在這些應用了ResetXForm。我只是試圖檢查maxscript是否比C++更不具有操作obj-offset的表現力。 – rotoglup