0

我目前正在尝试通过一些任意矩阵来转换一些对象的枢轴。

到目前为止,我已经能够为没有应用任何非均匀比例的对象做到这一点,但是当目标对象有一些非均匀比例时它会中断。

我的印象是,要使其工作,这将需要访问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 )
)
4

1 回答 1

0

我不是 100% 确定我的问题的要点是正确的,但基本答案是“是的”,你需要一个比简单的 PRS 更复杂的转换堆栈来实现你想要的。

您希望对对象的轴心点应用变换,同时对实际对象进行反变换以将其保持在相同的世界空间中。这可以通过简单的 PRS 实现,直到您添加非均匀比例。

在应用反比例之前,您需要移除对象旋转的影响以返回正交基础。你想做的是 origPRS * newPRS * Inv(newPRS) * offsetPRS。逆分解为 inv(S) * inv(R) * inv(P) (逆序)。经过一番折腾后,您的转换堆栈变为 PRS * P * R * Inv(R) * S * R。您可以使用 scalevalue 进行操作。

但是,我强烈建议您不要这样做。它会工作一次,但是当您的艺术家尝试旋转枢轴时,您将再次破坏一切,当然您无法将任何动画应用于系统。

根据您想要做什么,解决此问题的最佳方法可能是“借用”CAT 层次结构。您可以创建 CAT 控制器(取决于您的 Max 版本,并且只能通过 MaxScript)自动补偿非均匀比例,以将您的实体保持在 orthoganol 空间中。基本上它归结为“你想要实现什么”,但它可能更容易以另一种方式解决。

于 2013-11-16T16:37:11.443 回答