0

基本的に、ループによって生成された一連のフラグを挿入する際にいくつかの問題があります。

def drawHelix(radius, length, coils): 
    numPoints = int(8)
    degrees = float((360 / numPoints))
    centerX = float(0)
    centerZ = float(0)
    xLoc = float(0)
    zLoc  = float(0)
    yLoc  = float(0)
    yOffset = float(((length / coils) / numPoints))
    vectorIndex = int(0)
    pointStr = ""
    knotStr = ""
    for i in range(1, (360 * coils), 20):
        t = i + degrees
        xLoc = centerX + (math.cos(t) * radius)
        zLoc = centerZ - (math.sin(t) * radius)
        pointStr = (pointStr + " p=(" + str(xLoc) + "," +  str(yLoc) + "," +  str(zLoc) + "),")
        knotStr = (knotStr + "k=(" + str(vectorIndex) + ")")
        vectorIndex = i + 1
        yLoc = yLoc + yOffset
    print pointStr        
    spiral = cmds.curve(d=float(1.0), pointStr, knotStr)
    cmds.rebuildCurve (spiral, ch=1, rpo=1, rt=0, end=1, kr=1, kcp=0, kep=0, kt=0, s=0, d=3, tol=0.001)
    return spiral

次に、これを実行します。drawHelix (2.00, 3.00, 5.00)

問題は、Mayaが「pointStr」をcurveコマンドのフラグとして認識しないことです。pointStrを印刷すると、希望どおりの結果が得られますが、実際にこれを機能させる方法に苦労しています。

4

2 に答える 2

2

Pythonインタープリターは、関数を呼び出す前に文字列を展開しません(これはを使用して実現できますがeval、これは一般的に悪い習慣と見なされます。SOに関するこの投稿を参照してください)。

キーワードの口述として引数を渡すときに機能するはずです。ここで調べてください:

したがって、代わりに:

pointStr = (pointStr + " p=(" + str(xLoc) + "," +  str(yLoc) + "," +  str(zLoc) + "),")
knotStr = (knotStr + "k=(" + str(vectorIndex) + ")")

やったほうがいい

kwargs['d'] = 1.0
kwargs['p'] = []
for i in range(1, (360 * coils), 20):
    ...
    kwargs['p'].append((xloc, yloc, zloc))
    kwargs['k'].append(vectorIndex)

spiral = cmds.curve(**kwargs) 

それとは別に、コードには他にもいくつかの問題があります。

float((360 / numPoints))Python2.xとPython3.xでは評価が異なります。これは2.xで起こることです:

In [5]: float(7 / 6)
Out[5]: 1.0

In [6]: 7. / 6
Out[6]: 1.1666666666666667

ケースで浮動小数点除算が確実に実行されるようにする場合は、を使用しますdegrees = 360. / numPoints。コードのこの行では、潜在的な影響がさらに悪化しますyOffset = float(((length / coils) / numPoints))

floatint定数は、小数点付きまたは小数点なしで記述するだけで宣言できます。float()またはへの呼び出しでそれらをラップする必要はありませんint()

于 2013-01-13T11:44:14.297 に答える
1

私はこれがあなたが念頭に置いていたものだと思います:

from maya import cmds
import math
def drawHelix(radius, length, coils): 
    numPoints = int(8)
    degrees = float((360 / numPoints))
    centerX = float(0)
    centerZ = float(0)
    xLoc = float(0)
    zLoc  = float(0)
    yLoc  = float(0)
    yOffset = float(((length / float(coils)) / float(numPoints)))
    vectorIndex = int(0)
    pointStr = []
    knotStr = []
    yLoc = 0
    for i in range(1, (360 * coils), 20):
        t = i + degrees
        xLoc = centerX + (math.cos(t) * radius)
        zLoc = centerZ - (math.sin(t) * radius)
        pointStr.append((xLoc, yLoc,zLoc))
        knotStr.append(vectorIndex)
        vectorIndex = i + 1
        yLoc = yLoc + yOffset
    print pointStr        
    spiral = cmds.curve(p= pointStr, k=knotStr,d=float(1.0))
    cmds.rebuildCurve (spiral, ch=1, rpo=1, 
                       rt=0, end=1, kr=1, kcp=0, kep=0, 
                       kt=0, s=0, d=3, tol=0.001)
    return spiral

これを行うには、はるかに優れた方法があります。これは、Mayaを使用することになっている方法であり、ノードを使用してコンテンツを構築します。だからここに行く、不必要にコメントされた冗長なバージョン:

from maya import cmds

def getHistoryShape(name):
    history = cmds.listHistory(name)
    filteredShape = cmds.ls(history, shapes=1)[0]
    return filteredShape 

def drawHelix(radius, length, coils): 
    cyl = cmds.cylinder( ch=True, radius=radius, ax=(0,1,0),
                         hr=float(length)/float(radius) )

    # build a curve on the cylinders surface
    crv = cmds.curveOnSurface(cyl[0], d=1, 
                              uv=[(0,0),(length, coils*4)],
                              k=[0,1]) 
    # make a duplicate that is visible 
    crv = cmds.duplicateCurve(ch=1, rn=0, local=1)

    # tell maya to ignore the cylinder as a piece of geometry
    shape = getHistoryShape(cyl[0])
    cmds.setAttr(shape+'.intermediateObject', 1)

    cmds.rename(cyl[0],'helix1')
    return crv  

これで、後でらせんパラメータをライブで変更できます。パラメータの半径、長さ、コイルをユーザーに公開して、アニメーション化することができます。たとえば、Mayaファクトリースクリプトを参照してください。

于 2013-01-13T12:36:11.187 に答える