首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >玛雅的ShrinkWrap变形器

玛雅的ShrinkWrap变形器
EN

Stack Overflow用户
提问于 2021-06-21 01:06:01
回答 2查看 145关注 0票数 3

我正在尝试对两个3D模型执行ShrinkWrap变形器,以便稍后能够执行从一个模型到另一个模型的变形。当我应用我做过的函数时,当我操纵偏移值或目标通胀时,它没有给我第二个模型相同的形状,它给了我一个不完整的不同形状,这是代码:

代码语言:javascript
复制
import maya.cmds as cmds 

def matchCurveShapes_andShrinkWrap(firstModel, secondModel):      
    myDict={
         ".boundingBoxCenter":1,
         ".axisReference":0 ,
         ".alongX":1,
         ".alongY":1,
         ".alongZ":1,
         ".offset":0,
         ".targetInflation":0,
         ".falloffIterations":1
     } 
    cmds.delete(firstModel, ch=1)
    getShrink=cmds.deformer(firstModel, type="shrinkWrap")
    cmds.connectAttr(secondModel+".worldMesh[0]", getShrink[0]+".targetGeom", f=1)

    for key, value in myDict.items():
        cmds.setAttr(getShrink[0]+key, value)
                 
matchCurveShapes_andShrinkWrap('pCylinder1', 'pCube3') 
EN

回答 2

Stack Overflow用户

发布于 2021-06-22 22:12:31

我可以给你我的一段代码来创建一个shrinkWrap,我没有maya所以不能真正检查你的代码:

代码语言:javascript
复制
def getTargetMesh(targetTrans=str):

    sh = cmds.ls(targetTrans, dag=True, shapes=True)
    # Find if at least one of them is an allowable target type
    for s in sh:
        io = cmds.getAttr(s+".io")
        if io:
            continue

        mtype = cmds.nodeType(s)
        if mtype == "mesh":
            return s
    return None

def shrinkWrap(mesh, target, **kwargs):

    targetMesh = getTargetMesh(target) # find a not intermediate shape

    # Find all the surf transforms that have been selected
    surf = cmds.listRelatives(mesh, path=True)

    surface = surf[0]
    
    # SET A BUNCH OF ATTRIBUTES WITH KWARGS or with default value    
    projection = kwargs.get('projection') or 0
    closestIfNoIntersection = kwargs.get('closestIfNoIntersection') or 0
    reverse = kwargs.get('reverse') or 0
    bidirectional = kwargs.get('bidirectional') or 0
    boundingBoxCenter = kwargs.get('boundingBoxCenter') or 1
    axisReference = kwargs.get('axisReference') or 0
    alongX = kwargs.get('alongX') or 0
    alongY = kwargs.get('alongY') or 0
    alongZ = kwargs.get('alongZ') or 0
    offset = kwargs.get('offset') or 0
    targetInflation = kwargs.get('targetInflation') or 0

    shrinkwrapNode = cmds.deformer(surface, type='shrinkWrap')[0]

    cmds.setAttr(shrinkwrapNode + ".projection", projection)
    cmds.setAttr(shrinkwrapNode + ".closestIfNoIntersection", closestIfNoIntersection)
    cmds.setAttr(shrinkwrapNode + ".reverse", reverse)
    cmds.setAttr(shrinkwrapNode + ".bidirectional", bidirectional)
    cmds.setAttr(shrinkwrapNode + ".boundingBoxCenter", boundingBoxCenter)
    cmds.setAttr(shrinkwrapNode + ".axisReference", axisReference)
    cmds.setAttr(shrinkwrapNode + ".alongX", alongX)
    cmds.setAttr(shrinkwrapNode + ".alongY", alongY)
    cmds.setAttr(shrinkwrapNode + ".alongZ", alongZ)
    cmds.setAttr(shrinkwrapNode + ".offset", offset)
    cmds.setAttr(shrinkwrapNode + ".targetInflation", targetInflation)

    # Add the target object
    #
    cmds.connectAttr(targetMesh + ".w", shrinkwrapNode + ".tgt")
    # connect up the smooth target attributes
    # so the smoothed target follows the target shape's settings
    #
    cmds.connectAttr(targetMesh + ".co", shrinkwrapNode + ".co")
    cmds.connectAttr(targetMesh + ".suv", shrinkwrapNode + ".suv")
    cmds.connectAttr(targetMesh + ".kb", shrinkwrapNode + ".kb")
    cmds.connectAttr(targetMesh + ".bnr", shrinkwrapNode + ".bnr")
    cmds.connectAttr(targetMesh + ".khe", shrinkwrapNode + ".khe")
    cmds.connectAttr(targetMesh + ".peh", shrinkwrapNode + ".peh")
    cmds.connectAttr(targetMesh + ".kmb", shrinkwrapNode + ".kmb")

    cmds.select(clear=True)
    return shrinkwrapNode

下面是一个函数,我使用它来输出一个只有四边形的球体

代码语言:javascript
复制
def createSquareSphere(res=4):
    cub = cmds.polyCube(n = 'qSphere#')
    v = round(sqrt(pow(4, res)))*2
    sph = cmds.polySphere(n = 'proj_tmp', sa=v, sh=v)
    cmds.polySmooth(cub, dv = 4, mth = 0, sdt = 2, ovb = 1, ofb = 3, ofc = 0, ost = 0, ocr = 0, bnr = 1,
                    c = 1, kb = 1, ksb = 1, khe = 0, kt = 1, kmb = 1, suv = 1, peh = 0, sl = 1,
                    dpe = 1, ps = 0.1, ro = 1, ch = 1)
    shWrp = shrinkWrap(cub[0], sph[0], projection = 3, reverse = 1)
    cmds.delete(cub, ch = True)
    cmds.delete(sph)
    return cub[0]
票数 2
EN

Stack Overflow用户

发布于 2021-11-24 08:30:10

我为了自己的目的整理了DrWeeny的优秀答案,我想我也可以把它贴出来。

代码语言:javascript
复制
import maya.cmds as cmds

def create_shrink_wrap(mesh, target, **kwargs):
    """
    Check available kwargs with parameters below.
    """
    parameters = [
        ("projection", 2),
        ("closestIfNoIntersection", 1),
        ("reverse", 0),
        ("bidirectional", 1),
        ("boundingBoxCenter", 1),
        ("axisReference", 1),
        ("alongX", 0),
        ("alongY", 0),
        ("alongZ", 1),
        ("offset", 0),
        ("targetInflation", 0),
        ("targetSmoothLevel", 0),
        ("falloff", 0),
        ("falloffIterations", 1),
        ("shapePreservationEnable", 0),
        ("shapePreservationSteps", 1)
    ]

    target_shapes = cmds.listRelatives(target, f=True, shapes=True, type="mesh", ni=True)
    if not target_shapes:
        raise ValueError("The target supplied is not a mesh")
    target_shape = target_shapes[0]

    shrink_wrap = cmds.deformer(mesh, type="shrinkWrap")[0]

    for parameter, default in parameters:
        cmds.setAttr(
            shrink_wrap + "." + parameter,
            kwargs.get(parameter, default))

    connections = [
        ("worldMesh", "targetGeom"),
        ("continuity", "continuity"),
        ("smoothUVs", "smoothUVs"),
        ("keepBorder", "keepBorder"),
        ("boundaryRule", "boundaryRule"),
        ("keepHardEdge", "keepHardEdge"),
        ("propagateEdgeHardness", "propagateEdgeHardness"),
        ("keepMapBorders", "keepMapBorders")
    ]

    for out_plug, in_plug in connections:
        cmds.connectAttr(
            target_shape + "." + out_plug,
            shrink_wrap + "." + in_plug)

    return shrink_wrap
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68058222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档