我正在尝试通过一些任意矩阵来转换某个对象的轴。
到目前为止,我已经能够对没有应用任何非均匀比例的物体进行此操作,但是当目标物体具有一些非均匀比例时,它会中断。
我的印象是,为了实现这一目标,需要访问 objectOffset 的scalerotationpart
,这似乎在maxscript中无法使用。
这可以使用C ++ SDK,因为 objectOffset 比例表示为ScaleValue
(包含比例向量和四元数,请参阅SDK docs)。< / p>
我错过了一些明显的东西吗?或者我是否必须制作一些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 :(得分:0)
我不是100%肯定我已经得到了你的问题的要点,但基本答案是'是',你需要一个更复杂的变换堆栈来实现你想要的而不是一个简单的PRS。
您希望将变换应用于对象的轴心点,同时反转换实际对象以使其保持在同一个世界空间中。这可以通过简单的PRS直到您添加非均匀比例。
在应用反比例之前,您需要删除对象旋转的效果以恢复正交基础。你有点想做的是origPRS * newPRS * Inv(newPRS)* offsetPRS。 Inverse分解为inv(S)* inv(R)* inv(P)(逆序)。经过一些杂耍后,您的变换堆栈变为PRS * P * R * Inv(R)* S * R.您可以使用scalevalue。
但是,我强烈反对你这样做。它会工作一次,但是当你的艺术家尝试旋转枢轴时,你会再次破坏一切,当然你也无法将任何动画应用到系统中。
根据您的目的,最好的方法是“借用”CAT层次结构。您可以创建CAT控制器(取决于您的Max版本,并且仅通过MaxScript)自动补偿非均匀比例,以使您的实体保持在正交空间中。基本上它归结为“你想要实现的目标”,但它可能更容易以另一种方式解决它。