使用 for 循环生成随机数量的多边形及其 XYZ 值

Posted

技术标签:

【中文标题】使用 for 循环生成随机数量的多边形及其 XYZ 值【英文标题】:Generating random number of polygons and their XYZ values using for-loop 【发布时间】:2017-02-23 02:32:58 【问题描述】:

我创建了一个脚本,它生成三种不同的多边形,它们的 x y z 坐标是随机的。当前代码根据需要生成这些,但它总是每个生成 40 个。

下一步将使用整数作为random number generator 来生成每种多边形类型的随机数。这需要一个for 循环,其中包含一个if 语句、一个else-if 语句和一个else 语句。代码将完整地执行上述参数(因为我已经取消了它们),除了它只会做一种类型的多边形(环面不可触发)。

我对两件事持怀疑态度:

1:如果 int $rng=rand(1,4); 正确指定创建一个 1-4 的范围以作为 random numbers 使用。

2:如果需要一个带有if-else 语句的for 循环首先获得所有形状的随机数。

This is a desired result I'm trying to get. This is the most recently-executed result of the code.

int $num = 40 ;
int $rng = rand( 1, 4 ) ;

for ( $i = 1; $i <= $num; $i++ ) 

    if ( $rng == 1 ) 

        polySphere -r 1 -sx 20 -sy 20 -ax 0 1 0 -cuv 2 -ch 1 ;
        int $xpos = rand( -20, 100 ) ;
        int $ypos = rand( 20, 80 ) ;
        int $zpos = rand( 20, 50 ) ;
        move -r $xpos $ypos $zpos ;
        print ( $i + "sphere \n" ) ;
       

    else if ( $rng == 4 ) 

        polyTorus -r 1 -sx 20 -sy 20 -ax 0 1 0 -cuv 2 -ch 1 ;
        int $xpos = rand( -20, 100 ) ;
        int $ypos = rand( 20, 80 ) ;
        int $zpos = rand( 20, 50 ) ;
        move -r $xpos $ypos $zpos ;        
        print ($i + "torus \n");    
       

    else 

        polyCube -w 1 -h 1 -d 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1 ;
        int $xpos = rand( -20, 100 ) ;
        int $ypos = rand( 20, 80 ) ;
        int $zpos = rand( 20, 50 ) ;
        move -r $xpos $ypos $zpos ;
        print ( $i + "cube \n" ) ;
          

【问题讨论】:

【参考方案1】:

您需要将 $rng 放在 for 循环中,否则它将选择一个随机几何图形并创建 40 次,而不是每次都随机选择一个。

在这种情况下,您可以使用switch 而不是使用if else 来确定不同的情况。您也不需要在所有情况下重复获取位置和移动它们,因为它们在做同样的事情。删除它们将使脚本不那么臃肿。

这是 MEL 中的一个示例:

int $num = 40;

for ($i = 0; $i < $num; $i++) 
    int $rng = rand(0, 3); 

    float $xpos = rand(-20, 100);
    float $ypos = rand(20, 80);
    float $zpos = rand(20, 50);

    switch ($rng) 
        case 0:
            polySphere -r 1 -sx 20 -sy 20 -ax 0 1 0 -cuv 2 -ch 1;
            print ($i+1 + ": sphere \n");
            break;
        case 1:
            polyTorus -r 1 -sx 20 -sy 20 -ax 0 1 0 -cuv 2 -ch 1;
            print ($i+1 + ": torus \n");
            break;
        case 2:
            polyCube -w 1 -h 1 -d 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1;
            print ($i+1 + ": cube \n");
            break;
    

    move -r $xpos $ypos $zpos;

同样,这是 Python 中的相同代码,我建议您改用它,因为该语言更灵活,拥有更大的社区,并且更容易学习:

import random
import maya.cmds as cmds

num = 40

for i in range(40):
    rng = random.randint(0, 3)

    xpos = random.uniform(-20, 100)
    ypos = random.uniform(20, 80)
    zpos = random.uniform(20, 50)

    if rng == 0:
        cmds.polySphere(r=1, sx=20, sy=20, ax=[0, 1, 0], cuv=2, ch=1)
        print "0: sphere \n".format(i+1)
    elif rng == 1:
        cmds.polyTorus(r=1, sx=20, sy=20, ax=[0, 1, 0], cuv=2, ch=1)
        print "0: torus \n".format(i+1)
    else:
        cmds.polyCube(w=1, h=1, d=1, sx=1, sy=1, sz=1, ax=[0, 1, 0], cuv=4, ch=1)
        print "0: cube \n".format(i+1)

    cmds.move(xpos, ypos, zpos, r=True)

不要忘记缩进和格式;由于它,您的代码目前有点难以阅读:)

【讨论】:

以上是关于使用 for 循环生成随机数量的多边形及其 XYZ 值的主要内容,如果未能解决你的问题,请参考以下文章

python for 指定循环数量

在 for 循环中插入查询无法正常工作

如何在没有 for 循环的情况下生成 n 个随机数

快速生成大量随机大小的文件

(第二周)新小学四则运算

列表生成式