进行输入和 运行 循环以创建自定义数量的对象

Make input and run loop to create custom number of objects

一段时间以来,我一直在努力学习如何为 Maya 编写代码。在这里,我正在制作一个使用缩小面、四边形网格、循环平滑的岩石生成器。现在我想做一个输入,这样用户就可以指定他们想要制作多少块石头。比如你输入5,它会产生5块石头。

但是我目前被命名所困,就像我用 rock# 创建 polyPlatonicSolid 一样,循环变得混乱并说出类似 rock# is invalid 的东西,所以我只是在寻找一个简单的解决方案。

import maya.cmds as MC
import random as RN

def rockGen():
    #GenerateBase
    rockCreation = MC.polyPlatonicSolid(name="rock", r=5)
    MC.displaySmoothness( polygonObject= 0)
    obj=MC.ls(sl=True)
    MC.polySmooth(rockCreation, divisions = 2)
    MC.polySoftEdge('rock', a=0, ch=1)

    #Evaluate face counts
    face_count = MC.polyEvaluate('rock', v=True)

    #Procedural rock creation
    for i in range(10):
        random_face = RN.randint(0, face_count)
        print random_face
        # Select faces
        targetFace = MC.select('rock.f[0:' + str(random_face)+ ']')
        # Reduce faces
        MC.polyReduce(p=20, kb=True, t=False)
        MC.polyQuad('rock', a=20)

    #Quad the rock
    MC.polySmooth('rock', ch=1, ost=0, khe=0, ps=0.1, kmb=1, bnr=1, mth=0, suv=1,
                  peh=0, ksb=1, ro=1, sdt=2, ofc=0, kt=1, ovb=1, dv=1, ofb=3, kb=1,
                  c=1, ocr=0, dpe=1, sl=1)

    #Select and rename
    MC.select('rock')

    MC.rename('inst#')

我试过这个:

numberRock=input()
for u in range (numberRock)
   rockCreation = MC.polyPlatonicSolid(name="rock#", r=5)

但在那之后我所有的 rock# 命令都传递了一个无效的对象反馈

老师提出的另一个挑战是在没有 select 命令的情况下执行此脚本,我还不知道其他方法。

为了独一无二,我已经改变了您命名岩石的方式。 即使 maya 是基于字符串的,也请尝试始终使用变量而不是 'rock'。 此外,在大多数情况下,您可以使用 cmds.ls 代替 cmds.select 来 select 您的对象。它只是一个命令,它将 return 名称字符串(如果存在),然后您可以使用它来提供 maya 中的大多数命令。

示例:

my_rocks = cmds.ls('rock*')
cmds.rename(my_rocks[0], 'anythin_you_want')

这是您修改后的代码,用于处理您的岩石块的唯一命名。 最后的建议,养成用 .format() 编写的习惯,并用 print()

加上括号
import maya.cmds as MC
import random as RN

def isUnique(name):
    if MC.ls(name):
        return False
    return True

def rockGen(name='rock'):
    #GenerateBase
    _iter = 1
    new_name = '{}_{:03d}'.format(name, _iter)

    while not isUnique(new_name):
        _iter += 1
        new_name = '{}_{:03d}'.format(name, _iter)

    rockCreation = MC.polyPlatonicSolid(name=new_name, r=5)
    MC.displaySmoothness( polygonObject= 0)
    obj=MC.ls(sl=True)
    MC.polySmooth(rockCreation, divisions = 2)
    MC.polySoftEdge(new_name, a=0, ch=1)

    #Evaluate face counts
    face_count = MC.polyEvaluate(new_name, v=True)

    #Procedural rock creation
    for i in range(10):
        random_face = RN.randint(0, face_count)
        # print(random_face)
        # Select faces
        targetFace = MC.select('{}.f[0:{}]'.format(new_name, random_face))
        # Reduce faces
        MC.polyReduce(new_name, p=20, kb=True, t=False)
        MC.polyQuad(new_name, a=20)

    #Quad the rock
    MC.polySmooth(new_name, ch=1, ost=0, khe=0, ps=0.1, kmb=1, bnr=1, mth=0, suv=1,
                  peh=0, ksb=1, ro=1, sdt=2, ofc=0, kt=1, ovb=1, dv=1, ofb=3, kb=1,
                  c=1, ocr=0, dpe=1, sl=1)

    MC.delete(new_name, ch=True)
    return new_name

所以你可以循环:

my_rocks = []
my_number = 5
for x in range(my_number):
    rock = rockGen()
    my_rocks.append(rock)
print(my_rocks)