« C4D Python R12 テスト:ポイントオブジェクトのポイントを選択してみる。 | トップページ | C4D で水を作りたい? »

C4D Python R12 テスト:スプラインオブジェクトのポイント位置を変更する。

今回は、スプラインのポイント位置を直線に配置してみます。
スプラインのセグメントは、考慮していません。

スクリプトマネージャを使います。

この様なスプラインを作成しました。

Py_pointmodify_01

ローカル座標のX軸に30の間隔でポイントを並べます。

Python C.O.F.F.E.E.
"""
スプラインオブジェクトのポイントの変更
2011.2.7
"""


import c4d


def PointModify(obj):
    if not isinstance(obj, c4d.SplineObject):
        return
    pts = obj.GetAllPoints()
    for c in xrange(op.GetPointCount()):
        pts[c].x = c*30.0
        pts[c].y = 0.0
        pts[c].z = 0.0
    obj.SetAllPoints(pts)
    obj[c4d.SPLINEOBJECT_TYPE] = c4d.SPLINEOBJECT_TYPE_LINEAR
    obj.Message(c4d.MSG_UPDATE)


if __name__=='__main__':
    PointModify(op)
    c4d.EventAdd()
/*
スプラインオブジェクトのポイントの変更
2011.2.7
*/



PointModify(obj)
{
  if(!instanceof(obj , SplineObject))return;
  var pts = obj->GetPoints();
  var c;
  for(c = 0 ; c < obj->GetPointCount() ; c++){
    pts[c].x = c*30.0;
    pts[c].y = 0.0;
    pts[c].z = 0.0;
  }
  obj->SetPoints(pts);
  obj#SPLINEOBJECT_TYPE = SPLINEOBJECT_TYPE_LINEAR;
  obj->Message(MSG_UPDATE);
}


main(doc , op)
{
  PointModify(op);
}

結果は、こんな具合です。

Py_pointmodify_02

ローカルX軸に並べた後、スプラインタイプを線形へ変更し直線補間とします。

前回の2つの例とほぼ同じ作りなので、共通の部分の説明は省略。

ポイントオブジェクトのポイントの取得は、PointObjectのGetAllPoints()メソッドで全てのポイントのリストを取得します。

ベクトル(座標)は、

変数名.x
変数名.y
変数名.z

で、それぞれの成分へアクセスする事ができます。
次の様にベクトルへアクセスする事もできます。

Python C.O.F.F.E.E.
    for c in xrange(op.GetPointCount()):
        pts[c] = c4d.Vector(c*30.0 , 0.0 , 0.0)
  for(c = 0 ; c < obj->GetPointCount() ; c++){
    pts[c] = vector(c*30.0 , 0.0 , 0.0);
  }

ポイント座標の変更後、ポイントオブジェクトへのポイントリストの適用はPointObjectのSetAllPoints()で行います。

PointObjectのGetAllPoint()メソッドとSetAllPoints()メソッドを使い、ポイントリストを取得し、変更後リストを適用しましたが、ポイントを1つづつ取得し修正を加え適用する事も可能です。

Python C.O.F.F.E.E.
"""
スプラインオブジェクトのy成分を0.0へ
"""


def PointModify(obj):
    if not isinstance(obj, c4d.SplineObject):
        return
    for c in xrange(op.GetPointCount()):
        pt = obj.GetPoint(c)
        pt.y = 0.0
        obj.SetPoint(c, pt)

    obj[c4d.SPLINEOBJECT_TYPE] = c4d.SPLINEOBJECT_TYPE_LINEAR
    obj.Message(c4d.MSG_UPDATE)
/*
スプラインオブジェクトのy成分を0.0へ
*/


PointModify(obj)
{
  if(!instanceof(obj , SplineObject))return;
  var c;
  var pt;
  for(c = 0 ; c < obj->GetPointCount() ; c++){
    pt = obj->GetPoint(c);
    pt.y = 0.0;
    obj->SetPoint(c , pt);
  }

  obj#SPLINEOBJECT_TYPE = SPLINEOBJECT_TYPE_LINEAR;
  obj->Message(MSG_UPDATE);
}

forループの中でPointObjectのGetPoint()メソッドでポイント番号を指定しポイントを取得。
座標を変更してSetPoint()メソッドにポイント番号と変更した座標を渡して適用します。

この方がポイントリストを取得しない分、メモリーの消費が無いかもしれない。

スプラインオブジェクトのタイプは以下の通りです。

SPLINEOBJECT_TYPE_LINEAR 線形
SPLINEOBJECT_TYPE_CUBIC 3次
SPLINEOBJECT_TYPE_AKIMA アキマ
SPLINEOBJECT_TYPE_BSPLINE Bスプライン
SPLINEOBJECT_TYPE_BEZIER ベジエ

変更したオブジェクトの更新をBaseList2DのMessage()メソッドで行います。

最後にイベントをEventAdd()で追加しC4Dを更新します。

今回は、Pythonのみの説明でした。

|

« C4D Python R12 テスト:ポイントオブジェクトのポイントを選択してみる。 | トップページ | C4D で水を作りたい? »

コメント

コメントを書く



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




« C4D Python R12 テスト:ポイントオブジェクトのポイントを選択してみる。 | トップページ | C4D で水を作りたい? »