Ich habe ein Skript geschrieben, um ein sphärisches Gitter gemäß der angegebenen Anzahl zu erstellen und dort 3D-Objekte anzuordnen. Ich werde die Methode aufschreiben.
[Eingang] Name: obj, Datenzugriff: Elementzugriff, Typhinweis: GeometryBase, desc: Zu arrangierende Objekte name: num, Datenzugriff: Elementzugriff, Typhinweis: int, desc: Anzahl der Gitter Name: rad, Datenzugriff: Elementzugriff, Typhinweis: float, desc: Kugelradius [Ausgabe] name: objs, desc: Objekte, die auf einer Kugel angeordnet sind name: pts, dec: sphärisch angeordnete Punkte
import ghpythonlib.components as ghcomp
import Rhino
import math
objList = []
ptList = []
for i in range(num):
#In einer Kugelform anordnen
y = i * 2 / num - 1 + (1 / num)
r = math.sqrt(1 - y * y)
phi = i * math.pi * (3 - math.sqrt(5));
x = math.cos(phi) * r;
z = math.sin(phi) * r;
#Nach Radius skalieren
x = x * rad;
y = y * rad;
z = z * rad;
position = Rhino.Geometry.Point3d(x, y, z);
ptList.append(position)
#Objekte platzieren
clone = obj.Duplicate()
center = clone.GetBoundingBox(True).Center
dir = Rhino.Geometry.Vector3d(position) - Rhino.Geometry.Vector3d(center)
dir.Unitize()
clone = ghcomp.OrientDirection(clone,center,Rhino.Geometry.Vector3d(0,0,1),position,dir)[0]
objList.append(clone)
objs = objList
pts = ptList
import ghpythonlib.components as ghcomp
import Rhino
import math
objList = []
ptList = []
...
Importieren Sie die diesmal verwendete Bibliothek und erstellen Sie zwei leere Listen.
...
for i in range(num):
#In einer Kugelform anordnen
y = i * 2 / num - 1 + (1 / num)
r = math.sqrt(1 - y * y)
phi = i * math.pi * (3 - math.sqrt(5));
x = math.cos(phi) * r;
z = math.sin(phi) * r;
...
Der Hauptteil ist dieser Teil, in dem die Basis des sphärischen Gitters gebildet wird.
...
#Nach Radius skalieren
x = x * rad;
y = y * rad;
z = z * rad;
position = Rhino.Geometry.Point3d(x, y, z);
ptList.append(position)
Die Basis wird entsprechend der Größe des Radius skaliert. Danach habe ich die Punkte, die ich gemacht habe, in ptList eingefügt.
...
#Objekte platzieren
clone = obj.Duplicate()
center = clone.GetBoundingBox(True).Center
dir = Rhino.Geometry.Vector3d(position) - Rhino.Geometry.Vector3d(center)
dir.Unitize()
clone = ghcomp.OrientDirection(clone,center,Rhino.Geometry.Vector3d(0,0,1),position,dir)[0]
objList.append(clone)
...
Ich habe das Basisobjekt dupliziert und die GH-Komponente Orient Direction verwendet, um es an den Punkten im Raster auszurichten, die ich gerade erstellt habe. Fügen Sie schließlich das duplizierte Objekt zur Liste hinzu.
...
objs = objList
pts = ptList
Schließlich wird die Liste ausgegeben.
Recommended Posts