我目前正在尝试通过一些任意矩阵来转换一些对象的枢轴。
到目前为止,我已经能够为没有应用任何非均匀比例的对象做到这一点,但是当目标对象有一些非均匀比例时它会中断。
我的印象是,要使其工作,这将需要访问objectOffsetscalerotationpart
的 ,这在maxscript 中似乎是不可用的。
这可以使用 C++ SDK 实现,因为objectOffset比例表示为 a ScaleValue
(其中包含比例向量和四元数,请参阅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 )
)