[zurück]

2. Python Script

[vor]

Das Python Skript (für Cinema 4D [12]) ist sicher nicht besonders elegant geschrieben, mit der Bezeichnung der Variablen bin ich auch eher kreativ. Aber ich versuche mal den Code zu erklären.
Im ersten Schritt müssen wir ein Vieleck mit N Seiten erzeugen [5].


    Punkte = []
    N = 4                          # Anzahl Seiten des Polygons
    a = 1                          # Seitenlänge des Polygons
    Faktor = 100                   # Skalierungsfaktor
    R = a/(2*math.sin(math.pi/N))  # Umkreisradius Polygon
    O = 1                          # Orientierung der Spirale (O = 1 oder O = -1)
    for i in range(N):
        Punkte.append(c4d.Vector(Faktor*R*math.cos(O*2*math.pi*i/N), 0, Faktor*R*math.sin(O*2*math.pi*i/N)))

Die weiteren Polygone (Gesamtzahl N1) werden mit Hilfe der Funktion "Gerade" berechnet.

    def Gerade(a, b, r):
        c = b-a
        d = a + r*c
        return d

Dazu benötigen wir zwei Schleifen.


    for i in range(0, N1):
        for k in range(0, N-1):
            Punkte.append(Gerade(c4d.Vector(Punkte[i*N+k]), c4d.Vector(Punkte[i*N+k+1]), r) + c4d.Vector(0, Faktor*h, 0))
        Punkte.append(Gerade(c4d.Vector(Punkte[i*N+N-1]), c4d.Vector(Punkte[i*N+0]), r) + c4d.Vector(0, Faktor*h, 0))

Für das Beispiel N=4 und N1=3 gilt.

    i=2   8    9   10   11
    i=1   4    5    6    7
    i=0   0    1    2    3
         k=0  k=1  k=2

Spline-Spirale 1

Jetzt müssen wir nur noch die Punkte auf ein Spline übertragen.

      for i in xrange(NP):
          obj.SetPoint(i, c4d.Vector(Punkte[i]))
    # Segmente erzeugen
      obj.MakeVariableTag(c4d.Tsegment, N1)
      for i in range(0, N1):
          obj.SetSegment(i, N, True)
    # Spline schliessen
      obj[c4d.SPLINEOBJECT_CLOSED] = True

Spline-Spirale 2

Für die zweite Variante der Spirale müssen wir die Punkte anders sortieren.

      zz = 0 # Zaehler
      for i in xrange(N):
          for k in xrange(N1):
              obj.SetPoint(zz, c4d.Vector(Punkte[i+k*N]))
              zz = zz +1
    # Segmente erzeugen
      obj.MakeVariableTag(c4d.Tsegment, N)
      for i in range(0, N):
          obj.SetSegment(i, N1, True)
    # Spline schliessen
      obj[c4d.SPLINEOBJECT_CLOSED] = False

Für das Beispiel N=4 und N1=3 gilt.

    i=3    3    7   11
    i=2    2    6   10 
    i=1    1    5    9
    i=0    0    4    8
          k=0  k=1  k=2

Polygonobjekt 1

Wenn wir eine Höhe h zwischen den einzelnen Vielecken einfügen können wir auch ein 3 dimensionales Polygonobjekt erzeugen. Zuerst übergeben wir die Punkte an das Polygonobjekt.

    for i in range(NP):
        obj.SetPoint(i, c4d.Vector(Punkte[i]))

Jetzt müssen wir jeweils 4 Punkte zu einem Polygon verbinden.

    zz = 0 # Zaehler
    for i in range(0, N1-1):
        for k in range(0, N-1):
            obj.SetPolygon(zz, c4d.CPolygon(k+i*N, k+N+i*N, k+N+1+i*N, k+1+i*N))
            zz = zz + 1
        obj.SetPolygon(zz, c4d.CPolygon(N-1+i*N, 2*N-1+i*N, N+i*N, 0+i*N))
        zz = zz + 1

Für das Beispiel N=4 und N1=3 gilt.


               8    9   10   11
    i=1      4    5    6    7
    i=0    0    1    2    3
          k=0  k=1  k=2

Polygonobjekt 2

Für diese Variante müssen wir die Anzahl der Punkte verdoppeln. Jedes Vieleck wird zweimal kopiert und einmal mit einer Höhe h versehen.

    Punkte1 = []
    for i in range(N1):
        for k in range(N):
            Punkte1.append(c4d.Vector(Punkte[k+i*N]))
        for k in range(N):
            Punkte1.append(c4d.Vector(Punkte[k+i*N]) + c4d.Vector(0, Faktor*h, 0))

Das Polygonobjekt besteht aus Dreiecken und Vierecken, wenden wir uns erst den Vierecken zu.

    zz = 0
    for i in range(0, N1):
        for k in range(0, N-1):
            obj.SetPolygon(zz, c4d.CPolygon(k+i*2*N, k+N+i*2*N, k+N+1+i*2*N, k+1+i*2*N))
            zz = zz + 1
        obj.SetPolygon(zz, c4d.CPolygon(N-1+i*2*N, 2*N-1+i*2*N, N+i*2*N, 0+i*2*N))
        zz = zz + 1

Für das Beispiel N=4 und N1=3 gilt.

                20   21   22   23
    i=2         16   17   18   19
             12   13   14   15
    i=1       8    9   10   11
           4    5    6    7
    i=0    0    1    2    3
          k=0  k=1  k=2

Für die Dreiecke gilt.

    for i in range(0, N1-1):
        for k in range(0, N-1):
            obj.SetPolygon(zz, c4d.CPolygon(k+2*N+i*2*N, k+2*N+1+i*2*N, k+N+1+i*2*N, k+N+1+i*2*N))
            zz = zz + 1
        obj.SetPolygon(zz, c4d.CPolygon(3*N-1+i*2*N, 2*N+i*2*N, N+i*2*N, N+i*2*N))
        zz = zz + 1

Polygonobjekt 3 und 4

Mit Hilfe der Polygonobjekte 3 und 4 lassen sich die Dreiecke der Spirale abwechselnd unterschiedlich einfärben.

    zz = 0 # Zaehler
    for i in range(0, N1-1,2):
        for k in range(0, N-1):
            obj.SetPolygon(zz, c4d.CPolygon((i+1)*N+k, (i+1)*N+k+1, i*N+k+1, i*N+k+1))
            zz = zz + 1
        obj.SetPolygon(zz, c4d.CPolygon((i+2)*N-1, (i+1)*N, i*N, i*N))
        zz = zz + 1

und

    zz = 0 # Zaehler
    for i in range(1, N1-1,2):
        for k in range(0, N-1):
            obj.SetPolygon(zz, c4d.CPolygon((i+1)*N+k, (i+1)*N+k+1, i*N+k+1, i*N+k+1))
            zz = zz + 1
        obj.SetPolygon(zz, c4d.CPolygon((i+2)*N-1, (i+1)*N, i*N, i*N))
        zz = zz + 1

Für das Beispiel N=4 und N1=4 gilt.

    k=3   7  4  0    11  8  4    15 12  8
    k=2   6  7  3    10 11  7    14 15 11
    k=1   5  6  2     9 10  6    13 14 10
    k=0   4  5  1     8  9  5    12 13  9
            i=0         i=1         i=2

Polygonobjekt 5

Für den einzelnen Arme der Spirale wurden nur die dafür nötigen Punkte übertragen.

  # Punkte uebergeben
    zz = 0
    for i in range(1,N1):
        obj.SetPoint(zz, c4d.Vector(Punkte[i*N]))
        zz = zz + 1
        obj.SetPoint(zz, c4d.Vector(Punkte[1+(i-1)*N]))
        zz = zz + 1
    obj.SetPoint(zz, c4d.Vector(Punkte[(N1-1)*N+1]))
  # Dreiecke setzen
    for i in range(0, N1-2):
        obj.SetPolygon(i, c4d.CPolygon(i*2, i*2+3, i*2+1, i*2+1))
    obj.SetPolygon(N1-2, c4d.CPolygon((N1-2)*2, (N1-2)*2+2, (N1-2)*2+1, (N1-2)*2+1))


[zurück] [Inhaltsverzeichnis] [vor]