""" Polygonspirale 19.04.2021 www.3d-meier.de """ import c4d import math # Variablen und Konstanten Titel = 'Polygonspirale' # Name N = 4 # Anzahl Punkte Polygon N1 = 25 # Anzahl Polygone NP = N * N1 # Gesamtzahl Punkte Spline r = 0.15 # Faktor Spirale h = 0.0 # Höhe einer Pyramidenstufe O = 1 # Orientierung der Spirale (O = 1 oder O = -1) Radius = 1 # Radius der Eckpunktkugeln a = 1 # Kantenlänge Faktor = 100 # Skalierungsfaktor # Geradengleichung def Gerade(a, b, r): c = b-a d = a + r*c return d # Variante 1 Punkte = [] R = a/(2*math.sin(math.pi/N)) # Umkreisradius Polygon 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))) 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)) # Variante 2 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)) #************************************************************************ def CreateNullobjekt1(): obj = c4d.BaseObject(c4d.Onull) obj.SetName(Titel) obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateNullobjekt2(): obj = c4d.BaseObject(c4d.Onull) obj.SetName('Punkte') obj.Message(c4d.MSG_UPDATE) obj[c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 1 obj[c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 1 return obj #************************************************************************ def CreateNullobjekt3(): obj = c4d.BaseObject(c4d.Onull) obj.SetName('Splines') obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateNullobjekt4(): obj = c4d.BaseObject(c4d.Onull) obj.SetName('Polygonobjekte') obj.Message(c4d.MSG_UPDATE) obj[c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 1 obj[c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 1 return obj #************************************************************************ def CreateNullobjekt5(): obj = c4d.BaseObject(c4d.Onull) obj.SetName('Polygonobjekt 2') obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateSplineSpirale1(): obj = c4d.BaseObject(c4d.Ospline) obj.SetName("Spline-Spirale 1") obj.ResizeObject(NP) # Punkte übergeben for i in range(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 obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateSplineSpirale2(): obj = c4d.BaseObject(c4d.Ospline) obj.SetName("Spline-Spirale 2") obj.ResizeObject(NP) zz = 0 # Zaehler for i in range(N): for k in range(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 # Splinetyp setzen # obj[c4d.SPLINEOBJECT_TYPE] = c4d.SPLINEOBJECT_TYPE_BEZIER obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateSpline1(): obj = c4d.BaseObject(c4d.Ospline) obj.SetName("Spline-1") obj.ResizeObject(2*NP) # Punkte übergeben for i in range(2*NP): obj.SetPoint(i, c4d.Vector(Punkte1[i])) # Segmente erzeugen obj.MakeVariableTag(c4d.Tsegment, 2*N1) for i in range(0, 2*N1): obj.SetSegment(i, N, True) # Spline schliessen obj[c4d.SPLINEOBJECT_CLOSED] = True obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreateSpline2(): obj = c4d.BaseObject(c4d.Ospline) obj.SetName("Spline-2") obj.ResizeObject(2*NP) zz = 0 for i in range(N): for j in range(2*N1): obj.SetPoint(zz, c4d.Vector(Punkte1[i+j*N])) zz = zz +1 # Segmente erzeugen obj.MakeVariableTag(c4d.Tsegment, N*N1) for i in range(0, N*N1): obj.SetSegment(i, 2, True) # Spline schliessen obj[c4d.SPLINEOBJECT_CLOSED] = False obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreatePolygonobjekt1(): obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(NP, N*(N1-1)) obj.SetName('Polygonobjekt 1') # Punkte uebergeben for i in range(NP): obj.SetPoint(i, c4d.Vector(Punkte[i])) # Vierecke setzen 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 obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreatePolygonobjekt2(): obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(NP*2, N*N1+N*(N1-1)) obj.SetName('Polygonobjekt 2') # Punkte uebergeben for i in range(2*NP): obj.SetPoint(i, c4d.Vector(Punkte1[i])) # Vierecke setzen 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 # Dreiecke setzen 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 obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreatePolygonobjekt3(): obj = c4d.BaseObject(c4d.Opolygon) # Anzahl Polygone berechnen if (N1-1) % 2 == 0: NPoly = N*((N1-1)/2) else: NPoly = N*((N1)/2) obj.ResizeObject(NP, NPoly) obj.SetName('Polygonobjekt 3') # Punkte uebergeben for i in range(NP): obj.SetPoint(i, c4d.Vector(Punkte[i])) # Vierecke setzen 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 obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreatePolygonobjekt4(): obj = c4d.BaseObject(c4d.Opolygon) if (N1-1) % 2 == 0: NPoly = N*((N1-1)/2) else: NPoly = N*((N1/2)-1) obj.ResizeObject(NP, NPoly) obj.SetName('Polygonobjekt 4') # Punkte uebergeben for i in range(NP): obj.SetPoint(i, c4d.Vector(Punkte[i])) # Vierecke setzen 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 obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def CreatePolygonobjekt5(): obj = c4d.BaseObject(c4d.Opolygon) obj.ResizeObject(2*N1-1, N1-1) obj.SetName('Polygonobjekt 5') # 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)) obj.Message(c4d.MSG_UPDATE) return obj #************************************************************************ def main(): nullobj1 = CreateNullobjekt1() nullobj2 = CreateNullobjekt2() # Punkte nullobj3 = CreateNullobjekt3() # Splines nullobj4 = CreateNullobjekt4() # Polygonobjekte nullobj5 = CreateNullobjekt5() # Splines für Polygonobjekt 2 splobj1 = CreateSplineSpirale1() splobj2 = CreateSplineSpirale2() splobj3 = CreateSpline1() splobj4 = CreateSpline2() plyobj1 = CreatePolygonobjekt1() plyobj2 = CreatePolygonobjekt2() plyobj3 = CreatePolygonobjekt3() plyobj4 = CreatePolygonobjekt4() plyobj5 = CreatePolygonobjekt5() doc.InsertObject(nullobj1, None, None, True) doc.InsertObject(nullobj5, nullobj3, None, True) doc.InsertObject(nullobj4, nullobj1, None, True) doc.InsertObject(nullobj3, nullobj1, None, True) doc.InsertObject(nullobj2, nullobj1, None, True) doc.InsertObject(splobj4, nullobj5, None, True) doc.InsertObject(splobj3, nullobj5, None, True) doc.InsertObject(splobj2, nullobj3, None, True) doc.InsertObject(splobj1, nullobj3, None, True) doc.InsertObject(plyobj5, nullobj4, None, True) doc.InsertObject(plyobj4, nullobj4, None, True) doc.InsertObject(plyobj3, nullobj4, None, True) doc.InsertObject(plyobj2, nullobj4, None, True) doc.InsertObject(plyobj1, nullobj4, None, True) # Kugeln auf Punkte setzen for i in range(0, NP): obj = c4d.BaseObject(c4d.Osphere) obj[c4d.PRIM_SPHERE_RAD] = Radius obj.SetName(str(i)) x = Punkte[i][0] y = Punkte[i][1] z = Punkte[i][2] obj.SetAbsPos(c4d.Vector(x, y, z)) doc.InsertObject(obj, nullobj2, None, True) c4d.EventAdd() if __name__=='__main__': main()