TRIC TRAC Pouic Pencil Topper 3D Model Tutorial
Transcrição
TRIC TRAC Pouic Pencil Topper 3D Model Tutorial
TRICTRAC PouicPencilTopper 3DModelTutorial Schritt-für-Schritt-AnleitungzumModelliereneinesPouicPencilToppers. PouicisteinblauerAxolotlunddasMaskottchenvonTricTrac, demWeb-MagazinüberSpiele. https://de.trictrac.net/ ZumModellierenbenötigtmandieSoftwareOpenSCAD.Diesekannkostenlos heruntergeladenwerdenkannundistfürLinux,WindowsundMacOSXverfügbar. http://www.openscad.org/downloads.html http://www.openscad.org/documentation.html DiesesPDF,die.scad-Dateiundauchdie.stl-DateienwurdenaufThingiverse veröffentlicht. http://www.thingiverse.com/thing:1624730 VielSpaßbeimnachbauen!–Wilson,06/2016 1 GRUNDFORM 2 2 FÖRMCHEN 3 2.1 2.2 2.3 2.4 3 5 8 11 MUND AUGEN HAARE STIFT-LOCH 3 POUIC 12 4 KORREKTUR 14 5 FRISUR 16 1 Grundform UnsererstesObjektisteineKugel.DieselässtsichmitderFunktionsphere()im UrsprungdesKoordinatensystemserzeugen.DerParameterddefiniertden DurchmesserderKugel.IchhabemichfüreineGrößevon30Millimetern,also3cm entschieden.MitdemzweitenParameter$fngibtmandieAnzahlderFragmenteanaus denendieKugelaufgebautseinsoll.JehöherdieAnzahldestorunderdieKugel. sphere(d=30, $fn=60); BeigenauererBetrachtungstelltmanallerdingsfest,dassderPouicnichtrundist, sondernmehrdieFormeinerEllipsehat.AlsoskalierenwirdieKugelmitdemBefehl scale().DieFunktionerwartetalsParametereinenVektor[x,y,z].Mitdemgebenwir anaufwelcherKoordinatenachsedieKugelausdehntodergestauchtwird.DerWert1 entsprichthierbei100%.DieAngabe[1,1.2,1]bedeutetalso,dassdieKugelsichaufder X-undZ-AchsenichtverändernsollundaufderY-Achse120%großseinsoll.D.h.die BreiteunseresObjektsbeträgtnun36mm.UmdieseTransformationaufunsereKugel anzuwendenschreibenwirdenSkalierungs-BefehlvordenKugel-Befehl.Wirkönnen beliebigvieleBefehleaneinanderreihen,ausgewertetwirdimmervonrechtsnachlinks unddasSemikolonmachtdeutlichwanneineBefehlsketteendet. scale([1,1.2,1]) sphere(d=30, $fn=60); 2 2 Förmchen DamithättenwirdieGrundformdesPouicfertig.AllesWeiteresindVertiefungenin diesemObjekt,diewirerreichenindemwirdieFormenandererObjektevomPouicObjektabziehen.AlsoheißtesFörmchenbauen... 2.1 Mund WirbeginnenmitderVertiefungfürdenMund.Alsersteserzeugenwirhierfürmitder Funktioncirle()einenzweidimensionalenKreismiteinemRadiusvon30mm. circle(r=30); WaswirabereigentlichbenötigenisteinDreieck.Deshalbgebenwirmitden$fnParameteran,dassderKreisnurausdreiFragmentenbestehensoll. circle(r=30, $fn=3); UmausdemzweidimensionalenDreieckeindreidimensionalenKeilzumachen, benutzenwirdieFunktionlinear_extrude().SieerwartetalsParameterdieHöheder 3 Extrusion.DiegenaueHöhespielthierkeineRolle,derKeilsolltespäternurbreitersein alsdasPouic-Objekt. linear_extrude(height=50) DanachverschiebenwirdasKeil-Objektmitdertranslate()-Funktionim Koordinatensystem.HierfürübergebenwiralsParametereinenVektor[x,y,z],mitdem wirdieneuePositiondesObjektsbestimmenkönnen. translate([-34,0,-25]) ZuguterLetztdrehenwirdasKeil-ObjektnochumdieX-Achseindemwirdierotate()FunktionbenutzenundproAchse[x,y,z]dieGradzahlbestimmen. rotate([90,0,0]) 4 DiesesObjektistnundasErgebnisvonvieraufeinanderfolgendenBefehlen.Damitwir diesesObjektspäterwiedereinfachaufrufenkönnen,bettenwirdiegesamte BefehlsketteineineeigeneFunktioneinundgebenihr,nachdemnotwendigen SchlüsselwortmoduledenNamencreate_mouth(). DieZeilenumbrüchedienennurderbesserenLesbarkeit,dasProgrammwertetdie BefehlskettevomSemikolonausgehendvonuntennachobenaus,genausoalshätten wirdieBefehlehintereinandergeschrieben. module create_mouth() { rotate([90,0,0]) translate([-34,0,-25]) linear_extrude(height=50) circle(r=30, $fn=3); } 2.2 Augen MitdenVertiefungenfürdieAugenläuftesähnlichwiebeimMund.Wirbeginnenmit einemAugeundnutzenwiederdieFunktioncirle(),umeinenzweidimensionalenKreis miteinemRadiusvon2mmzuerzeugen. circle(r=2, $fn=60); 5 DaderPouicaberkeinerundenKnopfaugenhat,nutzenwirdiescale()-Funktion,um denKreiszueinerEllipseauszudehnen.MitdemVektor[x,y,z]gebenwiran,dassder KreissichaufderY-Achseumdaseineinhalbfacheausdehnt.DadurchbeträgtdieBreite desKreisesnun3mm. scale([1,1.5,1]) AnschließendnutzenwirdieFunktionlinear_extrude(),umeindreidimensionales Objektzuerzeugen.MitdemParameterheightgebenwirwiegewohntdieHöheder Extrusionan(10mmsindausreichend)undmitdemParameterscalekönnenwirdie obereFlächedesObjektserneutskalieren.DerWert1.5vergrößertdieobereFlächedes ObjektsumdasEineinhalbfache.DieGrößederunterenFlächebleibtunverändert. DadurcherhaltenwirkeinegradezylindrischeForm,sonderneineKegel-ähnlicheForm, diespätereinenschönen,optischenEffekterzielt. linear_extrude(height=10, scale=1.5) 6 DamitdasAugeanderrichtigenStellesitzt,drehenwiresmitderrotate()-Funktion... rotate([-25,-25,120]) ...undbewegenesmitdertranslate()-Funktion. translate([-5,-5,10]) 7 MitfünfBefehlenhabenwirnuneineFormfürdasrechteAugeerzeugtundplatziert. DamitwirdiesfürdaslinkeAugenichtwiederholenmüssenspiegelnwirdasObjekt einfachentlangderY-Achse.HierfüreignetsichdieFunktionmirror().Leiderkopiert dieStandard-FunktionabernichtdasObjekt,sondernplatziertesnurneu.Dadurch hättenwirzwareinlinkesAugeaberkeinrechtesmehr.Deshalbnutzenwirstattdessen eineeigene,generischeFunktion,diediemirror()-Funktionaufruftaberaußerdemauch dasUrsprungsobjektbeibehält.SobaldwirsieindenCodekopierthaben,könnenwirsie mitdemNamencopy_mirror()benutzen. module copy_mirror(vector=[0,1,0]) { children(); mirror(vector) children(); } AlsErgebnishabenwirnundieFormenfürdiebeidenAugen.Damitwirdiebeiden Objektespäterwiedereinfachaufrufenkönnen,bettenwirdiegesamteBefehlskette erneutineineeigeneFunktioneinundgebenihrdenNamencreate_eyes(). module create_eyes() { copy_mirror() { translate([-5,-5,10]) rotate([-25,-25,120]) linear_extrude(height=10, scale=1.5) scale([1,1.5,1]) circle(r=2, $fn=60); } } 2.3 Haare FürdieHaarebrauchenwirinsgesamtsechsVertiefungen.WirbeginnenmiteinemHaar underzeugenmitderFunktioncylinder()direkteindreidimensionalesObjekt.Mitdem ParameterdgebenwirdenDurchmesseran.Dieserist0,5mmgrößeralsdieHaare,die 8 spätereinenDurchmesservon2mmbekommenwerden.Dadurchentstehteinwenig SpielunddieHaarelassensichspäterleichtereinsetzen.MitdemParameterhgeben wirdieHöhedesZylindersan.DieHöhespieltfürdieVertiefungeigentlichkeinegroße Rolleabermansiehtdadurchbesser,obdieHaarespäterrichtigsitzen. cylinder(d=2.5, h=15, $fn=60); AnschließendbewegenwirdasObjektmitdertranslate()-Funktion... translate([0,10,10]) ...unddrehenwiresmitderrotate()-Funktion. rotate([-25,20,0]) 9 DiesedreiBefehlewiederholenwirnochzweimal,umzweiweitereHaarezuerzeugen. LediglichdieWertefürHöhe,BewegungundDrehungunterscheidensicheinwenig. DamithättenwiralledreiHaarederlinkenSeiteundspiegelndiesemitunserer copy_mirror()-Funktion,umdieseHaareauchaufderrechtenSeitezuerhalten. AuchdieseBefehlskettebettenwirwiederineineeigeneFunktioneinundnennensie create_hairs(). 10 module create_hairs() { copy_mirror() { rotate([-10,20,0]) translate([0,5,10]) cylinder(d=2.5, h=18, $fn=60); rotate([-15,20,0]) translate([0,8,10]) cylinder(d=2.5, h=21, $fn=60); rotate([-25,20,0]) translate([0,10,10]) cylinder(d=2.5, h=15, $fn=60); } } 2.4 Stift-Loch FürdenPouichabenwiralleFormenzusammenabernochkönnenwirihnnichtauf einenStiftsetzen.WasnochfehltistdasLochfürdenStift.Hierfürnutzenwirwiederdie cylinder()-Funktion.DiesmalgebenwirabernichteinenDurchmesseran,sondern zwei.MitdemParameterd1bestimmenwirdenDurchmesserderunterenFlächeund mitdemParameterd2denDurchmesserderoberenFläche.Dadurchbekommtdas ObjekteinekonischeFormundmankanndenStiftspäterindieVertiefungschiebenbis ersteckenbleibt. cylinder(d1=10, d2=7, h=20, $fn=60); UmdenZylinderindierichtigePositionzubringen,bewegenwirihninentlangderZAchsemitdertranslate()-Funktion. translate([0,0,-22]) 11 AuchdieseBefehlskettebettenwirwiederineineeigeneFunktioneinundnennensie create_pencil_hole(). module create_pencil_hole() { translate([0,0,-22]) cylinder(d1=10, d2=7, h=20, $fn=60); } 3 Pouic Nunistesendlichsoweit.WirhabendieGrundformundalleVertiefungs-Objektegebaut undkönnendieseüberdieFunktionsnamenaufrufen.Alsomachenwirdas.Das Prozentzeichenvordersphere()-Funktionbewirkt,dassdieGrundformtransparent angezeigtwird.DadurchkönnenwirbessererkennenwodieVertiefungeninder Grundformentstehenwerden. scale([1,1.2,1]) %sphere(d=30, $fn=60); create_eyes(); create_mouth(); create_hairs(); create_pencil_hole(); 12 UmnundieVertiefungeninderGrundformzuerzeugen,nutzenwirdiedifference()Funktion.MitdieserFunktionkannmaneineBoolscheOperationdurchführen,umalle Objektemiteinanderzukombinieren(KonstruktiveFestkörpergeometrie).Dabeiistdas ersteObjektdasObjektaufdemdieOperationangewendetwird,d.h.allefolgenden ObjektewerdenausdemerstenObjektherausgeschnitten.Etvoilà. difference() { scale([1,1.2,1]) sphere(d=30, $fn=60); create_mouth(); create_eyes(); create_hairs(); create_pencil_hole(); } 13 4 Korrektur BetrachtetmandenPouicvonuntenkannmangutdasLochfürdenStifterkennen. LeiderstelltmanaberaucheinProblemfest:DasObjekthatuntensogutwiekeine Grundfläche.DieistabernotwendigwennmandasObjektspätermitdemFDMVerfahrendruckenmöchte.DennwenndasObjektnichtgenugHalthatwirdeswährend desDrucksvonderDruckplattegerissen. DamitdiesnichtpassiertvergrößernwirdieGrundflächedesPouic.Hierfürerzeugen wireinenWürfelmitdercube()-Funktion.DerersteParameterbestimmtdie KantenlängefürjedeAchse[x,y,z].DerzweiteParametercentergibtan,dassdasObjekt imUrsprungdesKoordinatensystemserzeugtwerdensoll. cube([20,20,20], center=true); DanachbewegenwirdenWürfelmitdertranslate()-Funktion. translate([0,0,-23]) 14 AnschließendbettenwirdiesebeidenBefehleineineeigeneFunktionmitdemNamen create_stand()einundrufendieseFunktionzusätzlichinunsererdifference()Funktionauf.DadurchwirdaucheinTeildesWürfelsvonunsererGrundform abgeschnittenundesistausreichendGrundflächefürdenDruckentstanden. module create_stand() { translate([0,0,-23]) cube([20,20,20], center=true); } difference() { scale([1,1.2,1]) sphere(d=30, $fn=60); create_mouth(); create_eyes(); create_hairs(); create_pencil_hole(); create_stand(); } 15 5 Frisur ZuguterLetztfehlennochdieHaare.WirhattenzwarschonObjektemodelliertabersie dientennurfürdieVertiefungen.FürdieHaarediespäterindenPouicgestecktwerden existierteinezweiteDatei.DerCodeistetwasanspruchsvollerundrichtetsichan diejenigendenendasTutorialbisherzulangweiligwar. JedeseinzelneHaarkannmittelsdieserBefehlsketteerzeugtwerden:ZweiKugelnund einZylinder,diemitderunion()-Funktionmiteinanderverschmolzenwerden. union () { sphere(d=2, $fn=60); rotate([90,0,0]) cylinder(d=2, h=15, $fn=60); translate([0,-15,0]) sphere(d=2, $fn=60); } EswürdealsoausreichendieseBefehlskette6xzukopierenundjeweilslediglichdie WertefürLängeundPositionauszutauschen.DasistlegitimundführtzumErgebnis. NurleidererzeugtmandamitjedeMengeunleserlichenCode,derzu90%gleichist. DerartigeRedundanzenversuchtmaninderProgrammierungzuvermeiden.Undman erreichtdasindemmanmitVariablenundSchleifenarbeitet. AlsodefinierenwirzweiVariablen,diebeijedemHaarverwendetwerden.DieDicke desHaarsbeträgtimmer2mmundfürdieLängegebenwireineListemitWertenvon 15bis21mman. hair_diameter hair_length = 2; = [15, 15, 18, 18, 21, 21]; 16 AnschließendersetzenwirdieabsolutenWertemitVariablenaufrufen. union () { sphere(d=hair_diameter, $fn=60); rotate([90,0,0]) cylinder(d=hair_diameter, h=hair_length[i], $fn=60); translate([0,-hair_length[i],0]) sphere(d=hair_diameter, $fn=60); } NunbettenwirunsereBefehlsketteineineFor-Schleife.ImKopfderFor-Schleife definierenwireineweitereVariableiundlegenfest,dassimitdemWert0beginnt, nachjedemSchleifendurchlaufum1erhöhtwirdundmaximaldenWert5erreicht. DadurchwirdunsereBefehlskettefürdasHaar-Objekt6xdurchlaufen.Damitdiesechs HaarenichtalleaufderselbenStelleerzeugtwerden,rufenwirbeijedemDurchlauf nochdietranslate()-FunktionaufundverschiebendamitjedesHaarum10mmaufder X-Achse. for (i = [0 : 1 : len(hair_length)-1]) { translate([(i*10)+10,0,0]) union () { sphere(d=hair_diameter, $fn=60); rotate([90,0,0]) cylinder(d=hair_diameter, h=hair_length[i], $fn=60); translate([0,-hair_length[i],0]) sphere(d=hair_diameter, $fn=60); } } 17