之前做测量相机焦距工具的时候发现不能把焦距添加约束到物体上的点,尤其是做了abc缓存之后,由于并没有对点进行编辑,不管是在自身空间还是世界空间中,点的位置在数值上都没有变换,被约束的相机的焦点依旧保持在原地,因此对点添加普通的的约束并不能达到效果,我们需要换一种方式进行约束。
可以使用给点创建毛囊的办法,利用uv映射的点的位置始终保持不变,但是物体的世界矩阵在变化的原理,将点世界坐标的信息传递给毛囊,毛囊会一直跟着点的,此时我们只需要约束毛囊就能达到我们想要的效果了。
代码如下:
# -*- coding:utf-8 -*-
# !/usr/bin/env python27
# @Author: Mirror
# @Time: 2022-03-15
# description: 该脚本用于在选中点的位置上创建定位毛囊,该毛囊通过UV点定位,所有使用后不能调整点所在的UV
# =========================================
import maya.cmds as mc
def buildFollicle(points):
if not points:
return
if type(points).__name__ == "str":
points = [points]
for point in points:
poly_transform = mc.listRelatives(mc.listRelatives(point, p=True, s=True)[0], p=True, s=True)[0]
point_uvVertex = mc.polyListComponentConversion(point, fv=True, tuv=True)
point_uvposition = mc.polyEditUV(point_uvVertex[0], q=1)
follicle = mc.createNode("follicle", n="follicle_%s" % point.replace("[", "").replace("]", "").replace(".", "_"))
follicle_transform = mc.listRelatives(follicle, p=True)[0]
mc.connectAttr(poly_transform + ".worldMatrix[0]", follicle + ".inputWorldMatrix")
mc.connectAttr(poly_transform + ".outMesh", follicle + ".inputMesh")
mc.connectAttr(follicle + ".outTranslate", follicle_transform + ".translate")
mc.connectAttr(follicle + ".outRotate", follicle_transform + ".rotate")
mc.setAttr(follicle_transform + ".parameterU", point_uvposition[0])
mc.setAttr(follicle_transform + ".parameterV", point_uvposition[1])
if __name__ == "__main__":
vertexs = mc.ls(sl=True,fl=True)
buildFollicle(vertexs)
注意:在添加了定位的毛囊之后,不能修改UV,否则毛囊会回到原点,约束失效,需要重新创建毛囊和约束。
参考
官网中相关的介绍:https://help.autodesk.com/view/MAYAUL/2018/CHS/?guid=GUID-A0D2DD53-FE41-4244-8635-CD4651ABF97F