2

ローカル法線軸上のポイントの選択を平坦化する必要があります。法線が正しい場合、オブジェクトのどの側からポイントを選択しても、この軸は常に同じになると思いますか?

私が達成しようとしていることを視覚的に表現するために、これを変えたいと思います:

ここに画像の説明を入力

プログラムでこれに:

ここに画像の説明を入力

スケール ツールを「Normals Average」に設定し、それらを手動でスケールすると、ポイントを平面に平坦化できますが、これを計算するか、コードで行う必要があります。

polyMoveFacetコマンドを調べたところ、 localScaleZというフラグがあり、説明に「Flattening」と書かれていましたが、うまくいきませんでした。助言がありますか?

4

2 に答える 2

2

私は Maya を使用したことがなく、使用するスクリプト言語も知りません。したがって、この回答は、問題に対する数学的/幾何学的アプローチのみを扱います。コードは概念を示すために Python で書かれていますが、翻訳できるはずです。

私はコードをテストしなかったことに注意してください。しかし、うまくいけば、少なくとも問題に取り組むためのツールが得られるはずです。

from math import sqrt

def point_average(points):
    l = len(points)
    return [(p.x/l,p.y/l,p.z/l) for p in points]

def find_normal(points):
    normal = point_average([p.normal for p in points])
    normal_length = sqrt(sum(c**2 for c in normal))
    normal = [c/normal_length for c in normal]
    return normal

def find_plane(points):
    normal = find_average_normal(points)
    center = point_average(points)
    # a point and a normal are enough to uniquely identify a plane
    # we anchor the plane to the farthest point from the center
    # that should be one of the corners
    dcenter = lambda p:sqrt((p.x-center.x)**2+(p.y-center.y)**2+(p.z-center.z)**2)
    points = [(dcenter(p),p) for p in points]
    points.sort()
    anchor = points[-1][1]
    return (anchor,normal)

def project_point_onto_plane(point, plane):
    anchor,normal = plane
    # kudos to http://stackoverflow.com/questions/9605556/how-to-project-a-3d-point-to-a-3d-plane
    # for the math behind this
    v = (point.x-anchor[0], point.y-anchor[1], point.z-anchor[2])
    dist = v[0]*normal[0] + v[1]*normal[1] + v[2]*normal[2]
    projected_point = (point.x-dist*normal[0],
                       point.y-dist*normal[1],
                       point.z-dist*normal[1])
    return projected_point
于 2013-03-06T22:57:54.767 に答える
2

最も簡単なのは、手動で行っているのと同じことを使用することです。mel でそれを行うためのコードは次のようになります。

{ // protect global namespace
     setToolTo Scale;
     manipScaleContext -e -mode 9 Scale;
     $oa = `manipScaleContext -q  -orientAxes Scale`;
     $p = `manipScaleContext -q  -position Scale`;
     scale -ws -r 
           -p ($p[0]) ($p[1]) ($p[2]) 
           -oa ($oa[0]+"rad") ($oa[1]+"rad") ($oa[2]+"rad") 
            0 1 1;
}

そしてPython:

cmds.setToolTo('Scale')
cmds.manipScaleContext("Scale", e=1, mode=9)
p = cmds.manipScaleContext("Scale", q=1, p=1)
oa = cmds.manipScaleContext("Scale", q=1, oa=1) 
cmds.scale(0,1,1, 
           p=(p[0],p[1],p[2]),
           oa=("%srad"%oa[0],"%srad"%oa[1],"%srad"%oa[2]))
于 2013-03-06T18:24:40.587 に答える