Maya のシミュレート 2

シンプルなモデリングツール 1

nmaya1.pyを応用して、シンプルなモデリングができるシステムに改良してみます。

作成できるノードの種類は以下の通りです。
これらのノードは、Nodebaseクラスを継承して作成してあります。

MakeTriPoly
三角ポリゴン作成ノード
ポリゴンの各頂点座標は、 (0, 0), (0, 1), (1, 0) で固定です。
MoveTriPoly
三角ポリゴンの1頂点を移動するノード
ノードを作成するときに、移動する頂点番号と相対的な移動距離を指定します。
MoveTriPoly(頂点番号, X方向の移動距離, Y方向の移動距離)
これらの、引数の値はノード作成以後に変更できません。
Shape
Meshデータを保持するシェイプノード

ノード、その他で使用できるメソッドの種類は以下の通りです。

getAttr()
アトリビュートの値を返します。
setAttr(val)
アトリビュートに値valを設定します。
connectAttr(node)
他のnodeのアトリビュートと、自分のアトリビュートをコネクトします。
自分のアトリビュートが変化すると、nodeのアトリビュートに値も同じ値になります。
save()
モデリングされたデータを標準出力へ出力します。
quit()
コマンドの実行を終了します。
  1. 以下のPythonスクリプトをnmaya2.pyというファイル名で保存します。
    import sys
    
    class ObjectSet(object):
        def __init__(self, sobjs=None):
            self.objs = []
            self.saveobjs = sobjs
    
        def setObj(self, obj):
            self.objs.append(obj)
    
        def save(self):
            if not self.saveobjs:
                return
            self.saveobjs(self.objs)
    
    
    class Point(object):
        def __init__(self, x=0, y=0):
            self.x = x
            self.y = y
    
    
    class TriPoly(object):
        def __init__(self, p1, p2, p3):
            self.p = [[p1, p2, p3]]
    
    
    class Nodebase(object):
        def __init__(self, attr=None):
            self.attr = attr
            self.observer = None
    
        def _update(self, node):
            self.setAttr(node.getAttr())
    
        def _notify_observers(self):
            if self.observer:
                self.observer._update(self)
    
        def connectAttr(self, node):
            self.observer = node
            self._notify_observers()
    
        def getAttr(self):
            return self.attr
    
        def setAttr(self, val):
            self.attr = val
            self._notify_observers()
    
    
    class MakeTriPoly(Nodebase):
        def __init__(self):
            tp = TriPoly(Point(0, 0), Point(0, 1), Point(1, 0))
            super(MakeTriPoly, self).__init__(tp)
    
    
    class MoveTriPoly(Nodebase):
        def __init__(self, n, x, y):
            self.num = n
            self.x = x
            self.y = y
            super(MoveTriPoly, self).__init__()
    
        def _update(self, node):
            tp = node.getAttr()
            f = tp.p[0]
            f[self.num].x += self.x
            f[self.num].y += self.y
            self.setAttr(tp)
    
    
    class Shape(Nodebase):
        objset = None
        def __init__(self):
            if self.objset:
                self.objset.setObj(self)
            super(Shape, self).__init__()
    
    
    def saveAllObjs(objs):
        n = 0
        for o in objs:
            print 'g tri' + str(n)
            fs = o.getAttr()
            for p in fs.p:
                print 'vn 0 1 0'
                print 'v ',p[0].x, ' 0 ',p[0].y
                print 'v ',p[1].x, ' 0 ',p[1].y
                print 'v ',p[2].x, ' 0 ',p[2].y
                print 'f ' + str(3*n+1) + '//' + str(n+1) + ' ' + str(3*n+2) + '//' + str(n+1) + ' ' + str(3*n+3) + '//' + str(n+1)
            n += 1
    
    Shape.objset = ObjectSet(saveAllObjs)
    
    
    def save():
        Shape.objset.save()
    
    
    def quit():
        sys.exit(0)
    
    
    execfile(sys.argv[1])
    
  2. 以下のPythonスクリプトを作成し、spoly1.pyというファイル名で保存します。
    m1 = MakeTriPoly()
    s1 = Shape()
    m1.connectAttr(s1)
    save()
    quit()
    
  3. シェル上で、以下のコマンドを実行します。
    % python nmaya2.py spoly1.py > spoly1.obj
  4. Maya上で、 ファイル → インポート によって spoly1.obj を読み込みます。
    三角ポリゴンが表示されます。

他のサンプルスクリプト

参考


Prev | Next
Home | Contents
Mail