Bài tập python rigging cartoon eye bằng Maya P2
1. Tạo Curve và add các locator đã tạo ở phần trước vào để curve điều khiển được joints
Cách làm đơn giản có thể tham khảo link:
http://vyanimation.blogspot.com/2017/05/cach-gan-vat-vao-uong-curve.html
Tạo đường curve có số lượng điểm đúng bằng số lượng locator đã tạo
2.Chọn tất cả locator mí trên và chạy lệnh sau:
from maya import cmds , OpenMaya
sel = cmds.ls(sl =1)
crv = "curveShape1"
for s in sel :
pos = cmds.xform(s ,q = 1 , ws = 1 , t = 1)
u = getUParam(pos , crv)
name = s.replace("_LOC" , "_PCI")
#print name
pci = cmds.createNode("pointOnCurveInfo" , n = name)
cmds.connectAttr(crv + '.worldSpace' , pci + '.inputCurve')
cmds.setAttr( pci + '.parameter', u )
cmds.connectAttr( pci + '.position' , s + '.t')
Nhưng trước khi chạy lệnh nhớ chạy lệnh getUParam, nếu không sẽ bị báo lỗi getUParam:
from maya import cmds , OpenMaya
def getUParam( pnt = [], crv = None):
point = OpenMaya.MPoint(pnt[0],pnt[1],pnt[2])
curveFn = OpenMaya.MFnNurbsCurve(getDagPath(crv))
paramUtill=OpenMaya.MScriptUtil()
paramPtr=paramUtill.asDoublePtr()
isOnCurve = curveFn.isPointOnCurve(point)
if isOnCurve == True:
curveFn.getParamAtPoint(point , paramPtr,0.001,OpenMaya.MSpace.kObject )
else :
point = curveFn.closestPoint(point,paramPtr,0.001,OpenMaya.MSpace.kObject)
curveFn.getParamAtPoint(point , paramPtr,0.001,OpenMaya.MSpace.kObject )
param = paramUtill.getDouble(paramPtr)
return param
def getDagPath( objectName):
if isinstance(objectName, list)==True:
oNodeList=[]
for o in objectName:
selectionList = OpenMaya.MSelectionList()
selectionList.add(o)
oNode = OpenMaya.MDagPath()
selectionList.getDagPath(0, oNode)
oNodeList.append(oNode)
return oNodeList
else:
selectionList = OpenMaya.MSelectionList()
selectionList.add(objectName)
oNode = OpenMaya.MDagPath()
selectionList.getDagPath(0, oNode)
return oNode
Làm tương tự cho mi mắt dưới.
Tiếp theo tạo thêm 2 đường curve đơn giản gồm 7 điểm cho mi trên và dưới. 2 đường này dùng gắn control điều khiển 2 đường curve1 và curve2.
Dùng lệnh Create Deformers > Wire Tool, để kết nối 2 đường curve này với nhau
Link gốc:
https://www.youtube.com/watch?v=5X4GXHunqIY
https://www.youtube.com/watch?v=_G9Ln_cpTc4
Cách làm đơn giản có thể tham khảo link:
http://vyanimation.blogspot.com/2017/05/cach-gan-vat-vao-uong-curve.html
Tạo đường curve có số lượng điểm đúng bằng số lượng locator đã tạo
2.Chọn tất cả locator mí trên và chạy lệnh sau:
from maya import cmds , OpenMaya
sel = cmds.ls(sl =1)
crv = "curveShape1"
for s in sel :
pos = cmds.xform(s ,q = 1 , ws = 1 , t = 1)
u = getUParam(pos , crv)
name = s.replace("_LOC" , "_PCI")
#print name
pci = cmds.createNode("pointOnCurveInfo" , n = name)
cmds.connectAttr(crv + '.worldSpace' , pci + '.inputCurve')
cmds.setAttr( pci + '.parameter', u )
cmds.connectAttr( pci + '.position' , s + '.t')
Nhưng trước khi chạy lệnh nhớ chạy lệnh getUParam, nếu không sẽ bị báo lỗi getUParam:
from maya import cmds , OpenMaya
def getUParam( pnt = [], crv = None):
point = OpenMaya.MPoint(pnt[0],pnt[1],pnt[2])
curveFn = OpenMaya.MFnNurbsCurve(getDagPath(crv))
paramUtill=OpenMaya.MScriptUtil()
paramPtr=paramUtill.asDoublePtr()
isOnCurve = curveFn.isPointOnCurve(point)
if isOnCurve == True:
curveFn.getParamAtPoint(point , paramPtr,0.001,OpenMaya.MSpace.kObject )
else :
point = curveFn.closestPoint(point,paramPtr,0.001,OpenMaya.MSpace.kObject)
curveFn.getParamAtPoint(point , paramPtr,0.001,OpenMaya.MSpace.kObject )
param = paramUtill.getDouble(paramPtr)
return param
def getDagPath( objectName):
if isinstance(objectName, list)==True:
oNodeList=[]
for o in objectName:
selectionList = OpenMaya.MSelectionList()
selectionList.add(o)
oNode = OpenMaya.MDagPath()
selectionList.getDagPath(0, oNode)
oNodeList.append(oNode)
return oNodeList
else:
selectionList = OpenMaya.MSelectionList()
selectionList.add(objectName)
oNode = OpenMaya.MDagPath()
selectionList.getDagPath(0, oNode)
return oNode
Làm tương tự cho mi mắt dưới.
Tiếp theo tạo thêm 2 đường curve đơn giản gồm 7 điểm cho mi trên và dưới. 2 đường này dùng gắn control điều khiển 2 đường curve1 và curve2.
Dùng lệnh Create Deformers > Wire Tool, để kết nối 2 đường curve này với nhau
Link gốc:
https://www.youtube.com/watch?v=5X4GXHunqIY
https://www.youtube.com/watch?v=_G9Ln_cpTc4
Nhận xét
Đăng nhận xét