Maya のシミュレート 3

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

上のnmaya2.pyから、アトリビュートをいくつでも追加できるように改良してみます。

作成できるノードの種類と、アトリビュートは以下の通りです。

MakeTriPoly
三角ポリゴン作成ノード
out
Meshのデータを出力するアトリビュート
ポリゴンの各頂点座標は、 (0, 0), (0, 1), (1, 0) で固定です。
MoveTriPoly
Meshデータの1頂点を移動するノード
num
移動するポリゴン頂点の番号
mx
X方向の移動距離
my
Y方向の移動距離
in
Meshデータを入力するアトリビュート
out
Meshデータを出力するアトリビュート
Shape
Meshデータを保持するシェイプノード
in
ポリゴンのデータを入力するアトリビュート
  1. 以下のPythonスクリプトをnmaya3.pyというファイル名で保存します。
    import sys
    import copy
    
    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={}):
            self.attr = copy.copy(attr)
            self.observer = {}
    
        def _update(self, node, src, dest):
            self.setAttr(dest, node.getAttr(src))
            self._compute()
    
        def _notify_observers(self, src):
            if self.observer.has_key(src):
                node, dest = self.observer[src]
                node._update(self, src, dest)
    
        def _compute(self):
            pass
    
        def connectAttr(self, src, node, dest):
            self.observer[src] = [node, dest]
            self._notify_observers(src)
    
        def getAttr(self, aname):
            return self.attr[aname]
    
        def setAttr(self, aname, val):
            self.attr[aname] = val
            self._notify_observers(aname)
    
        def addAttr(self, aname, default=0.0):
            self.attr[aname] = default
    
    
    class MakeTriPoly(Nodebase):
        def __init__(self):
            tp = TriPoly(Point(0, 0), Point(0, 1), Point(1, 0))
            attr = {'out': tp}
            super(MakeTriPoly, self).__init__(attr)
    
    
    class MoveTriPoly(Nodebase):
        def __init__(self, n=0, x=0.0, y=0.0):
            attr = {'in': None, 'out': None, 'num': n, 'mx': x, 'my': y}
            super(MoveTriPoly, self).__init__(attr)
    
        def _compute(self):
            tp = self.getAttr('in')
            f = tp.p[0]
            num = self.getAttr('num')
            f[num].x += self.getAttr('mx')
            f[num].y += self.getAttr('my')
            self.setAttr('out', tp)
    
    
    class Shape(Nodebase):
        objset = None
    
        def __init__(self):
            if self.objset:
                self.objset.setObj(self)
            attr = {'in': None, 'out': None}
            super(Shape, self).__init__(attr)
    
        def _compute(self):
            tp = self.getAttr('in')
            self.setAttr('out', tp)
    
    
    def saveAllObjs(objs):
        n = 0
        for o in objs:
            print 'g tri' + str(n)
            fs = o.getAttr('out')
            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])
    

サンプルスクリプト

練習問題

注意

これらのサンプルスクリプトでは、以下のような問題点・改良点があります。

参考


Prev | Next
Home | Contents
Mail