0

現在、オブジェクトのピボットを任意のマトリックスで変換しようとしています。

これまでのところ、不均一なスケールが適用されていないオブジェクトに対してそれを行うことができましたが、ターゲット オブジェクトに不均一なスケールがあると機能しなくなります。

これが機能するには、これが objectOffset の にアクセスする必要があるという印象を受けましたが、これscalerotationpartmaxscriptでは利用できないようです。

これは、 objectOffsetスケールがScaleValue(スケール ベクトルとクォータニオンを含む、SDK docsを参照) として表現されるため、C++ 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 です。Inverse は inv(S) * inv(R) * inv(P) (逆順) に分解されます。少しジャグリングした後、変換スタックは PRS * P * R * Inv(R) * S * R になります。これは scalevalue で行うことができます。

ただし、これを行うことは強くお勧めしません。一度は機能しますが、アーティストがピボットを回転させようとすると、またすべてが壊れてしまいます。もちろん、システムにアニメーションを適用することはできません。

やりたいことによっては、これにアプローチする最善の方法は、CAT 階層を「借りる」ことかもしれません。不均一なスケールを自動的に補正してエンティティをオルソガノール空間に保つ CAT コントローラを作成できます (Max のバージョンによって異なりますが、MaxScript を使用する場合のみ)。基本的には「何を達成しようとしているのか」に要約されますが、おそらく別の方法で解決する方が簡単です。

于 2013-11-16T16:37:11.443 に答える