一半君的总结纸

听话只听一半君

#36 如何保证多边形面是平的 (4个vertices都在同一个平面上)?

当挤出或创建polygon的时候,在菜单里把这个选项勾上 ‘Polygons -> Tool Options -> Keep New Faces Planar’ .

建模的时候可能出现三角面(triangles) ,三角面了的矩形( Triangulate quads,其实还是三角面拼成的) 还有多边形( n−gons). 显然三角面(Triangles)本身就是平的(废话,显然是平的).

如果你想用代码把面拉平,那么可以选择不平的一些面,然后运行下面的proc:

global proc planarizeFacets()
{
  string $facets[] = `filterExpand -sm 34`;

  if ( size( $facets ) )
  {
    polyMoveFacet -localScaleZ 0.0 $facets;
  }
}

注意: 上面的代码并不能保证所有的平面都是平的,因为当你运行的时候,如果两个面都不平,当他作用在其中一个面上的时候,他将移动这个面上的4个点,但是当他作用在相邻的另一个面上的时候,他又会移动另一个面的4个点,此时可能刚才第一个面又不平了.

Tuesday, December 05, 2000

加强版:

上面的方法如果对多个平面,只运行一次,显然是拉不平的

flatten1

如果你非要坚持上面的方法也不是不可以,你可以很脑残的运行很多次,这样他总会平的 (显然你完后得把那一堆polyMoveFace节点删掉)

flatten2

def planarizeFacets():
    sel = pm.ls(sl=True)
    sel = pm.filterExpand(ex=True, sm=34)
    if sel:
        pm.polyMoveFacet(sel,lsz=0)

for _ in range(50):
    planarizeFacets()

如果你想把一堆面拉平(而不是上面的把单独的每个面拉平),如下图所示

flatten3

flatten4

搜到个stackoverflow的脑残办法,其实就是把手动操作翻译成代码而已。

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]))

“高科技”方法:

Maya Bonus Tools 里从2013开始有个Flatten Components tool, 显然这个是插件(plugin),以后有时间要去看下是怎么写的.

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: