进行输入并运行循环以创建自定义数量的对象 [英] Make input and run loop to create custom number of objects

查看:79
本文介绍了进行输入并运行循环以创建自定义数量的对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

一段时间以来,我一直在尝试学习如何为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 您的对象.这只是一条命令,如果存在名称字符串,它将返回名称字符串,然后您可以使用它在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)

I have been trying to learn how to code for Maya for a while. And here I am making a rock generator using reduce face, quad-mesh, smooth in a loop. Now I would like to make an input so user can specify how many rock they want to make. Like if you input 5, it would make 5 rocks.

However I am currently stuck with the naming, like if I created the polyPlatonicSolid with rock#, the loop got confused and said something like rock# is invalid, so I am just looking for a simple solution for that.

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#')

I tried this:

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

But after that all my rock# command just deliver an invalid object feedback

One other challenge that was given by the teacher is that doing this script without the select command and I don't know the other way to do that yet.

解决方案

I have change the way you are naming your rock in order to be unique. Even if maya is based string, try to always use variable instead of 'rock'. Also instead of cmds.select, you can in most of the cases use cmds.ls to select your object. It is just a command that will return the name string if it exists, then you can use this to feed most of the commands in maya.

example :

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

here is your modified code that handle unique naming for your piece of rocks. Last advice, take the habit to write with .format() and also put parenthesis with 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

so with this you can loop :

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

这篇关于进行输入并运行循环以创建自定义数量的对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆