3D tryckt Ping-Pong boll (3 / 5 steg)
Steg 3: Geodesic sfärer
Nu ska vi undersöka hur man dela upp en sfär i ett bestämt antal
trianglar av ungefärligt liknande form. Den metod som beskrivs här är
ofta används för att bygga månghörnigt approximationer av sfärer, som detaljerad
i handledningen OpenGL: http://www.opengl.org.ru/docs/pg/0208.html.
I vårt fall blir detta byggnaden steget att generera hål som kommer
transfrom våra regelbundna klumpa ihop sig till en geodeome-liknande.
Först börjar vi med en vanlig isocahedron , som har tjugo trekantiga ansikten, och
intressanta egenskapen att var och en av dess hörn ligger på ett klot.
Och sedan för varje triangel, vi delar upp var och en av tre kanterna på mitten, som
ger oss tre ytterligare hörn som vi använder för att dela upp denna triangeln
i fyra mindre trianglar. De tre hörnen översätts sedan utåt
så de ligger på den sfärens yta.
Isocahedron OpenJSCAD skript
funktionen Main () {
var X = 0.525731112119133606;
var Z = 0.850650808352039932;
var radie = 20;
var vdata = [
[-X, 0,0, Z], [X, 0,0, Z], [-X, 0,0, -Z], [X, 0,0, -Z],
[0,0, Z, X], [0,0, Z, -X], [0.0, -Z, X], [0.0, -Z, -X],
[Z, X, 0,0], [-Z, X, 0,0], [Z, -X, 0,0], [-Z, -X, 0,0]
]; isocahedron vertex koordinater
var tindices = [
[0, 4, 1], [0, 9, 4], [9, 5, 4], [4, 5, 8], [4, 8, 1],
[8, 10, 1], [8, 3, 10], [5, 3, 8], [5, 2, 3], [2, 7, 3],
[7, 10, 3], [7, 6, 10], [7, 11, 6], [11, 0, 6], [0, 1, 6],
[6, 1, 10], [9, 0, 11], [9, 11, 2], [9, 2, 5], [7, 2, 11]
]; isocahedron trianglar
återgå polyhedron({
poäng: vdata,
trianglar: tindices
{}) .scale ([radius, radius, radius]);
}
Därefter skriver vi indelning fonction för en enhet sfär tillnärmning:
Funktionen subdvide
/ * fn subdivide (v1, v2, v3, addPolyCb, djup)
* kort delar upp en triangel i 4 mindre
* params v1, v2, v3: triangel formhörn
* addPolyCb: motringning för lägga till polygon anmälan
* djup: antal återstående indelning iterationer
*/
funktionen dela upp (v1, v2, v3, addPolyCb, djup)
{
IF(DEPTH == 0) {
addPolyCb (v1, v2, v3);
hemkomst.
}
var v12 = v1.plus(v2).unit(); mitten av v1v2 kantar projiceras på området enhet
var v23 = v2.plus(v3).unit();
var v31 = v3.plus(v1).unit();
var newDepth = djup - 1.
Dela upp (v1, v12, v31, addPolyCb, newDepth);
Dela upp (v2 v23, v12, addPolyCb, newDepth);
Dela upp (v3, v31, v23, addPolyCb, newDepth);
Dela upp (v12, v23, v31, addPolyCb, newDepth);
}
Delfältet processen fungerar rekursivt; Start från den 20 isocahedron
ansikten, varje steg i underavdelningen multiplicerar det totala antalet ansikten med 4.
Följaktligen genererar ett djup av 1 en 80 ansikten polyeder.
Vi kan nu skapa en sfär tillnärmning genom att dela upp funktionen
iterativt över isocahedron ansikten enligt följande:
80 ansikten geodesic sfär skript
funktionen main)
{
var ballDiameter = 40;
var ballRadius = ballDiameter/2.;
var polygoner = []; lista av polygoner
addPolyCb = funktion (v1, v2, v3)
{
polygons.push (nya CSG. Polygon ([
nya CSG. Vertex (nya CSG. Vector3D(v3.x,v3.y,v3.z)),
nya CSG. Vertex (nya CSG. Vector3D(v2.x,v2.y,v2.z)),
nya CSG. Vertex (nya CSG. Vector3D(v1.x,v1.y,v1.z))
]));
}
createGeodesicSphere (addPolyCb, 1);
var unitSphereApprox = CSG.fromPolygons(polygons);
återgå unitSphereApprox.scale ([ballRadius, ballRadius, ballRadius]);
}
delar upp en enhet isocahedron n = djup gånger och begär en återuppringning för varje skapade ansikte
funktion createGeodesicSphere (addPolyCb, djup)
{
var X = 0.525731112119133606;
var Z = 0.850650808352039932;
var vdata = [
[-X, 0,0, Z], [X, 0,0, Z], [-X, 0,0, -Z], [X, 0,0, -Z],
[0,0, Z, X], [0,0, Z, -X], [0.0, -Z, X], [0.0, -Z, -X],
[Z, X, 0,0], [-Z, X, 0,0], [Z, -X, 0,0], [-Z, -X, 0,0]
];
var tindices = [
[0, 4, 1], [0, 9, 4], [9, 5, 4], [4, 5, 8], [4, 8, 1],
[8, 10, 1], [8, 3, 10], [5, 3, 8], [5, 2, 3], [2, 7, 3],
[7, 10, 3], [7, 6, 10], [7, 11, 6], [11, 0, 6], [0, 1, 6],
[6, 1, 10], [9, 0, 11], [9, 11, 2], [9, 2, 5], [7, 2, 11]
];
iterera över isocahedron trianglar
för (var jag = 0; jag < 20; i ++)
Dela upp (nya CSG. Vector3D(vdata[tindices[i][0]]),
nya CSG. Vector3D(vdata[tindices[i][1]]),
nya CSG. Vector3D(vdata[tindices[i][2]]),
addPolyCb, djup);
}
Om du vill köra det här skriptet, kopiera och klistra in koden i din favorit kod editor och spara
filen med tillägget .jscad. Sedan bara dra och släppa filen i recangular
området i det nedre vänstra hörnet i webbläsarfönstret OpenJSCAD.