adv源代码改写-对称检查工具

Arya Lv3

⏸️前言

在7月份进公司的时候写了个检查工具,已经发布有一段时间了,但是模型反映对称检查老是会检查出没问题的模型。而且有些通过了对称检查的模型,到绑定这边通过 ADV检查还是会有错误。我猜想到应该是算法不一样,于是直接把 ADV中检查对称的代码改写了一下。终于变成了一个清爽舒适,敏感肌也说好的检查工具了呢~

核心方法差不多,都是通过一个点找出它对称的点,然后和对面模型上的点做对比。我原本的方法是查出对面点坐标的位置,然后在模型上查找这个位置存不存在一个点,如果不存在,证明不对称。其中用到了字典对点和它的坐标进行转换。但当我看完adv的代码后,感觉我的代码还是太繁琐了。

正序

ADV的思路是,通过一个点找它对称的点,然后通过建立一个closestPointOnMesh类型的节点,找到模型上与它最近的那个点,然后将这个点对称回去,看它和原来那个点之间的距离是否大于0.001。如果超过这个精度的话,就判定为不对称,并把两个点都选出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
for shape in check_list:
#check if the poly is freezed
parents=shape.split("|")
parents=list(filter(None,parents))
check_shape=parents[0]
isFreReturn=False
isPiviotReturn=False
for i in range(1,len(parents)):
tempFloat=cmds.getAttr(check_shape+'.t')[0]
if tempFloat[0] != 0 or tempFloat[1] != 0 or tempFloat[2] != 0:
isFreReturn=True
tempFloat=cmds.getAttr(check_shape+'.r')[0]
if tempFloat[0] != 0 or tempFloat[1] != 0 or tempFloat[2] != 0:
isFreReturn=True
tempFloat=cmds.getAttr(check_shape+'.s')[0]
if tempFloat[0] != 1 or tempFloat[1] != 1 or tempFloat[2] != 1:
isFreReturn=True
tempFloat=cmds.getAttr(check_shape+'.rp')[0]
if tempFloat[0] != 0 or tempFloat[1] != 0 or tempFloat[2] != 0:
isPiviotReturn=True
tempFloat=cmds.getAttr(check_shape+'.sp')[0]
if tempFloat[0] != 0 or tempFloat[1] != 0 or tempFloat[2] != 0:
isPiviotReturn=True
check_shape+="|{}".format(parents[i])
if isFreReturn:
return {"state":False, "info": u"{}-请先冻结全部物体!!!".format(en_name)}
if isPiviotReturn:
return {"state":False, "info": u"{}-请先将物体中心放置在原点!!!".format(en_name)}

for shape in check_list:
#check symmetry
if cmds.objExists('closestSampler'):
cmds.delete('closestSampler')
cmds.createNode('closestPointOnMesh',n='closestSampler')
cmds.connectAttr("{}.outMesh".format(shape),'closestSampler.inMesh',f=True)
numVtxs=cmds.polyEvaluate(shape,v=True)
cmds.select(cl=True)
for i in range(numVtxs):
posA=cmds.xform("{}.vtx[{}]".format(shape,i),q=True,ws=True,t=True)
if posA[0]>0.001:
continue
cmds.setAttr('closestSampler.inPosition',posA[0]*(-1),posA[1],posA[2])
mirrorVtx_num=cmds.getAttr('closestSampler.closestVertexIndex')
posB=cmds.xform("{}.vtx[{}]".format(shape,mirrorVtx_num),q=True,ws=True,t=True)
mag=math.sqrt(math.pow(posA[0]-posB[0]*(-1),2)+math.pow(posA[1]-posB[1],2)+math.pow(posA[2]-posB[2],2))
if mag>0.001:
self.error_list.append("{}.vtx[{}]".format(shape,i))
self.error_list.append("{}.vtx[{}]".format(shape,mirrorVtx_num))
#cmds.select(["{}.vtx[{}]".format(shape,i),"{}.vtx[{}]".format(shape,mirrorVtx_num)],add=True)
cmds.delete('closestSampler')
cmds.refresh()

  • 标题: adv源代码改写-对称检查工具
  • 作者: Arya
  • 创建于 : 2023-11-25 22:00:00
  • 更新于 : 2023-12-06 18:34:16
  • 链接: https://aryagala0.github.io/2023/11/25/python项目/adv的源代码改写-对称检查/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论
此页目录
adv源代码改写-对称检查工具