Python 创建一个面数与UV平铺相同的平面(每个UV平铺1个面,具有相同的U/V比)。 例如:如果边界框覆盖了瓷砖(0,0)到(5,3),则创建一个6x4平面 缩放/定位平面的UV以适合UV栅格(1个面正好覆盖1个UV瓷砖) 确定平面UV壳和其他网格UV壳之间的重叠

Python 创建一个面数与UV平铺相同的平面(每个UV平铺1个面,具有相同的U/V比)。 例如:如果边界框覆盖了瓷砖(0,0)到(5,3),则创建一个6x4平面 缩放/定位平面的UV以适合UV栅格(1个面正好覆盖1个UV瓷砖) 确定平面UV壳和其他网格UV壳之间的重叠,python,maya,uv-mapping,maya-api,Python,Maya,Uv Mapping,Maya Api,这可能不是最好的方法,但它避免了必须确定UV壳边界和计算UV栅格之间的交点(由Maya处理) 它处理具体情况: 被视为重叠的瓷砖: UV点完全包围在瓷砖内 UV指向瓷砖的所有外部,但将其嵌入 UV只与瓷砖相交 瓷砖未被视为重叠: 瓷砖周围的UV点,但没有覆盖或相交 UV位于平铺边界上 一些限制: 代码将在Maya中执行(在Maya 2020.2中测试) 紫外线瓷砖的尺寸被认为是(1,1)。如果需要更细的粒度(例如:0.1),则必须更改代码(但主方法可以保持) 将修改场景(创建临

这可能不是最好的方法,但它避免了必须确定UV壳边界和计算UV栅格之间的交点(由Maya处理)

它处理具体情况:

  • 被视为重叠的瓷砖:
    • UV点完全包围在瓷砖内
    • UV指向瓷砖的所有外部,但将其嵌入
    • UV只与瓷砖相交
  • 瓷砖未被视为重叠:
    • 瓷砖周围的UV点,但没有覆盖或相交
    • UV位于平铺边界上
一些限制:

  • 代码将在Maya中执行(在Maya 2020.2中测试)
  • 紫外线瓷砖的尺寸被认为是(1,1)。如果需要更细的粒度(例如:0.1),则必须更改代码(但主方法可以保持)
  • 将修改场景(创建临时平面几何体)。最后会进行清洁,但这可能是不可接受的
  • 该代码在极端情况下没有经过充分测试,因此可能不应按原样使用
  • 代码没有经过优化,可以重写
导入数学
def GetBoundingBoxTileRange(网格):
''确定UV壳的全局边界框。
一个BBox吞噬全部。
'''
((minX,maxX),(minY,maxY))=cmds.polyEvaluate(meshes,boundingBox2d=True)
minU=int(数学楼层(minX))
maxU=int(数学地板(maxX))
minV=int(数学楼层(minY))
maxV=int(数学楼层(maxY))
返回((分钟,分钟,(最大,最大))
def createOverlapPlane(最小值、最小值、最大值、最大值):
''创建一个覆盖UV栅格的平面
每个瓷砖1个面,精确覆盖UV网格
'''
#创建一个面数与UV平铺数相同的平面
#“+1”包括上限
sizeX=最大-分钟+1
sizeY=maxV-minV+1
平面trsf,平面节点=cmds.polyPlane(宽度=1,
高度=1,
细分sx=sizeX,
细分sy=sizeY,
createUVs=2)
#缩放/定位平面的UV以适合/覆盖栅格
#“+2”包括最后一个索引和上限
计数=0
对于范围内的指数xV(最小值、最大值+2):
对于范围内的索引(分钟,最大+2):
uv=“%s.map[%d]”%(平面,计数)
cmds.polyEditUV(uv,relative=False,uValue=indexU,vValue=indexV)
计数+=1
返回平面
def getOverlappedTiles(网格):
''确定所提供网格的UV壳重叠的UV瓷砖。
'''
#保存场景状态
cmds.undoInfo(openChunk=True)
#获取UV壳的全局边界框
((最小值,最小值),(最大值,最大值))=GetBoundingBoxTileRange(选择)
#创建覆盖UV栅格的平面(每个瓷砖1个面)
平面\u trsf=createOverlapPlane(最小、最小、最大、最大)
#确定平面UV壳和其他网格UV壳之间的非重叠面
mesh_faces=cmds.polyListComponentConversion(网格,tf=True)
plane\u faces=cmds.polyListComponentConversion(plane\u trsf,tf=True)
非重叠=cmds.polyUVOverlap(网格面+平面面,noc=1)
#测定紫外线瓷砖
瓷砖=[]
对于范围内的指数xV(最小值、最大值+1):
对于范围内的索引(最小值,最大值+1):
瓷砖。附加((indexU,indexV))
#展平列表以分隔每个元素
非重叠列表=cmds.ls(非重叠,展平=1)
plane\u faces\u list=cmds.ls(plane\u faces,展平=1)
#获得重叠的UV瓷砖
重叠的瓷砖=瓷砖[:]
对于非重叠列表中的面:
#TODO:应该找到更快的方法
索引=平面面列表。索引(面)
重叠的\u平铺。删除(平铺[索引])
#恢复场景状态
cmds.undoInfo(closeChunk=True)
cmds.undo()
返回重叠块
用法示例:

#获取所需的网格
#(此处以选择为例)
mesh=cmds.ls(sl=1)
#获取重叠的UV瓷砖
重叠的_tiles=getOverlappedTiles(网格)
打印“重叠瓷砖:”,重叠瓷砖

好主意!我找到了
maya.cmds.polyUVCoverage
,它给了我一个基于您的版本的松散模型,而不需要中间网格。