« C4D スクリプトの読み込み…で検索した? | トップページ | 「c4d csc スクリプト」で検索された? »

C4D Python R12 テスト:オブジェクトから取得できる位置/スケール/角度など。

C.O.F.F.E.E.SDK R12以前の場合、BaseObjectから取得できる座標関連のメンバ関数は、

GetPosition() ローカル座標
GetRotation() ローカル角度
GetScale() ローカルスケール
GetMl() ローカルマトリクス
GetMg() グローバルマトリクス

だったかな。

R12からは、「オブジェクト相対/絶対」、「ワールド」、「座標変換を固定」と、増えたのでGetPosition()などのローカル系が変更されました。

で、C4D Pythonではどうだろう?

c4d.BaseObjectの座標関連の取得

オブジェクト相対

GetRelPos() オブジェクト相対位置
GetRelRot() オブジェクト相対角度
GetRelScale() オブジェクト相対スケール
GetRelMl() オブジェクト相対マトリクス
GetRelMln() 正規化されたオブジェクト相対マトリクス

オブジェクト絶対

GetAbsPos() オブジェクト絶対位置
GetAbsRot() オブジェクト絶対角度
GetAbsScale() オブジェクト絶対スケール

座標変換の固定

GetFrozenPos() 座標変換の固定位置
GetFrozenRot() 座標変換の固定角度
GetFrozenScale() 座標変換の固定スケール
GetFrozenMln() 正規化された座標変換の固定マトリクス

グローバルマトリクス

GetMg() グローバルマトリクス
GetMgn() 正規化されたグローバルマトリクス

親オブジェクトのグローバルマトリクス

GetUpMg() 親オブジェクトのグローバルマトリクス

では、C4D Pythonスクリプトで実際にオブジェクトから取得してみます。

Objectposrotscl_01

ヌルオブジェクトと立方体を適当に配置。

ヌルオブジェクト
座標変換を固定を設定指定なので、オブジェクト相対とオブジェクト絶対が同じです。
ヌルオブジェクトには、親が無いのでワールドも同じです。
属性マネージャの座標属性に表示されている座標はオブジェクト相対です。

Objectposrotscl_02_2

立方体には、座標変換を固定を設定してみました。
座標変換を固定を設定したので、オブジェクト相対とオブジェクト絶対が違う値になります。

Objectposrotscl_03

オブジェクトから座標などを取得してコンソールに表示するスクリプトです。

Python
"""
オブジェクトから座標/角度/スケール等を取得
2011.2.23
"""


import c4d
from c4d import utils


#マトリクスのv1/v2/v3の長さを取得
def mtvlen(mt):
    vlist = [mt.v1.GetLength(),
            mt.v2.GetLength(),
            mt.v3.GetLength()]
    return vlist


#rotから度
def RotToDeg(v):
    vlist = [utils.Deg(v.x), utils.Deg(v.y), utils.Deg(v.z)]
    return vlist



def main():
    #オブジェクト絶対
    print
    print 'オブジェクト絶対'
    print 'GetAbsPos:', op.GetAbsPos()
    print 'GetAbsScale:', op.GetAbsScale()
    print 'GetAbsRot:', op.GetAbsRot()
    print 'Abs度', RotToDeg(op.GetAbsRot())

    #座標変換を固定
    fmln = op.GetFrozenMln()
    print
    print '座標変換を固定'
    print 'GetFrozenPos:', op.GetFrozenPos()
    print 'GetFrozenScale:', op.GetFrozenScale()
    print 'GetFrozenRot:', op.GetFrozenRot()
    print 'Frozen度', RotToDeg(op.GetFrozenRot())
    print 'GetFrozenMln:', fmln
    print mtvlen(fmln)

    #オブジェクト相対
    rml = op.GetRelMl()
    rmln = op.GetRelMln()
    print
    print 'オブジェクト相対'
    print 'GetRelPos:', op.GetRelPos()
    print 'GetRelScale:', op.GetRelScale()
    print 'GetRelRot:', op.GetRelRot()
    print 'Rel度', RotToDeg(op.GetRelRot())
    print 'GetRelMl:', rml
    print mtvlen(rml)
    print 'GetRelMln:', rmln
    print mtvlen(rmln)

    #グローバルマトリクス
    mg = op.GetMg()
    mgn = op.GetMgn()
    print
    print 'グローバルマトリクス'
    print 'GetMg:', mg
    print mtvlen(mg)
    print 'GetMgn:', mgn
    print mtvlen(mgn)

    #親グローバルマトリクス
    umg = op.GetUpMg()
    print
    print '親グローバルマトリクス'
    print 'GetUpMg:', umg
    print mtvlen(umg)




if __name__=='__main__':
    main()

スクリプトの結果

ヌルオブジェクト

Objectposrotscl_04

立方体

Objectposrotscl_05

では、座標マネージャ等で表示された値とC4D Pythonで取得した値を確認します。

子オブジェクトの立方体の方を見てみます。

Objectposrotscl_06_2

座標マネージャの相対と属性マネージャの座標は同じ値を指しています。
と言う事で、属性マネージャの座標はオブジェクト相対を表示している事になります。

Objectposrotscl_07_2

RelPos/RelScale/RelRotがオブジェクト相対と同じ値を示しています。
RelMlnのv1/v2/v3ベクトルの長さに若干誤差はありますが、長さが1.0なので正規化されているのでしょうね。

オブジェクト絶対とAbs

Objectposrotscl_08_2

Objectposrotscl_09_2

間違えなく同じ値を示しています。

ワールドとグローバルマトリクス

Objectposrotscl_10_2

Objectposrotscl_11_2

グローバルマトリクスのoffsetがワールド座標と同じ値を示しているので問題ないでしょう。
角度/スケールは、多分問題なかと思うけど…
座標マネージャのスケールは0.92ですか…
コンソールに表示した長さは、1.167/1.037/0.908…

ヌルオブジェクトのスケールが、1.411
立方体のスケールが、0.92
立方体の座標変換の固定のスケールが、0.9/0.8/0.7と言う事で、全てを掛け合わせると…

1.411×0.92×0.9 = 1.168308
1.411×0.92×0.8 = 1.038496
1.411×0.92×0.7 = 0.908684

コンソールに表示されたマトリクスのベクトルの長さと一致しているので、スケールも問題無いかと…
角度も多分算出できると思うので、問題ないと思う…ごめん手抜きしました。

座標変換の固定

Objectposrotscl_13

Objectposrotscl_12

誤差はありますが、これも同じ数値を示しているので問題ありませんね。

親オブジェクトのグローバルマトリクス

Objectposrotscl_14

Objectposrotscl_15

これも多分、問題無いかと…

マトリクスからHPBを取得するには?

Python
utils.MatrixToHPB(matrix)

返ってくる値はラジアン値のベクトルと言う事を忘れずに…
この関数を使う場合は、c4d.utilsモジュールのインポートを忘れずに…

ちなみに、ラジアン値を弧度変換する関数は以下。
これもc4d.utilsモジュールです。

Python
utils.Deg(radians)

残念な事に、C4D Python SDKドキュメントには、未だに誤植がいっぱいなのだ…
その他に、C4Dとの関連情報が薄いので、C4Dの初心者には辛いものがあるね…

|

« C4D スクリプトの読み込み…で検索した? | トップページ | 「c4d csc スクリプト」で検索された? »

コメント

コメントを書く



(ウェブ上には掲載しません)




« C4D スクリプトの読み込み…で検索した? | トップページ | 「c4d csc スクリプト」で検索された? »