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

时间:2016-10-13 20:03:36

标签: if-statement maya modeling autodesk mel

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

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

我对两件事情持怀疑态度:

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

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

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 个答案:

答案 0 :(得分:0)

你需要将$rng放在for循环中,否则它会选择一个随机几何体,只需创建40次而不是每次都选择一个随机数。

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

这是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)

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