进行输入并运行循环以创建自定义数量的对象 [英] 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 您的对象.这只是一条命令,如果存在名称字符串,它将返回名称字符串,然后您可以使用它在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屋!