제가 OpenSCAD라는 프로그램을 한번 소개했었는데요[바로가기] 그 후에 OpenSCAD 초보자들이 처음 부딪히는 문제인 다면체 그리는 법을 살짝 (정말 살짝^^) 소개했었습니다. [바로가기] 사실 OpenSCAD는 Document[바로가기]만으로도 충분히 대부분의 기능을 알 수 있는데다, 자체적으로도 또 많은 예제를 가지고 있어서 뭐 따로 학습의 용도로 언급할 만한 건 없었습니다만~~~^^. 살짝 재미있는 기능하나를 OpenSCAD 초보분들께 알려드리고자 합니다.^^ 바로 background modifier와 debug modifier입니다.^^.
difference() { // start objects cylinder (h = 4, r=1, center = true, $fn=100); // first object that will subtracted % rotate ([90,0,0]) cylinder (h = 4, r=0.3, center = true, $fn=100); // second object that will be subtracted % rotate ([0,90,0]) cylinder (h = 4, r=0.9, center = true, $fn=100); }
difference() { // start objects cylinder (h = 4, r=1, center = true, $fn=100); // first object that will subtracted # rotate ([90,0,0]) cylinder (h = 4, r=0.3, center = true, $fn=100); // second object that will be subtracted # rotate ([0,90,0]) cylinder (h = 4, r=0.9, center = true, $fn=100); }
먼저 OpenSCAD 문서에 나와있는 위의 두 코드를 보죠~ 똑 같죠^^. 단 %와 #을 쓰고 있다는 차이일 뿐이네요. %는 background modifier이고, #은 debug modifier입니다. 다른 프로그램에서는 주석으로 사용될 아이들입니다만, OpenSCAD에서는 꽤 유용한 기능으로 사용됩니다.
좌측은 첫번째 코드(%)이고, 우측은 두번째 코드(#)입니다. 보이시나요? 차이가? 네 % 기호를 쓴 background modifier는 원 사물을 건드리지 않고 참조용 도형을 그려줍니다. 그러나 debug modifier는 실제 가공되는 명령(difference)이 적용되고, 대신에 그 자리에 도형이 있었던 것만 나타내 줍니다. 실제 두번째 코드에서 # 기호를 빼고 그려보면
difference() { // start objects cylinder (h = 4, r=1, center = true, $fn=100); // first object that will subtracted rotate ([90,0,0]) cylinder (h = 4, r=0.3, center = true, $fn=100); // second object that will be subtracted rotate ([0,90,0]) cylinder (h = 4, r=0.9, center = true, $fn=100); }
위 코드가 될거고 그 그림은
이렇게 되거든요. 그러니까 빈 자리를 잘 보여주는 그림이 되는 겁니다. 실제 이 기능을 사용하면
이렇게 핀을 넣을 자리를 미리 확인해 볼 수 있습니다. 물론 Compile and Render 후에 STL 화일로 export 할때는 사라지는 거지만요^^. 아 위 그림은 delta 형 3D 프린터의 end effector의 도면입니다. 제가? 그리진 않았구요^^. kossel legacy 모델입니다. 3D 프린터 연재[바로가기]에서 소개했던 RepRap 홈페이지에 있답니다.[바로가기] 저 판의 코드도 보여 드릴까요?^^
difference() { include <configuration.scad>; separation = 37.2; // Distance between ball joint mounting faces. offset = 42; // Same as DELTA_EFFECTOR_OFFSET in Marlin. height = 8; cone_r1 = height/2; cone_r2 = 5.5; // Johann's Kossel uses M3 screws for everything, but you can // change this to 2.2 if you prefer traditional M4 screws. extruder_mount = m3_wide_radius; difference() { union() { cylinder(r=offset-8, h=height, center=true, $fn=6); for (a = [60:120:359]) rotate([0, 0, a]) { translate([0, offset, 0]) intersection() { cube([separation, 40, height], center=true); union() { for (s = [-1, 1]) scale([s, 1, 1]) { translate([separation/2-4, 0, 0]) rotate([0, 90, 0]) cylinder(r1=cone_r2, r2=cone_r1, h=8, center=true, $fn=24); translate([separation/2-4, -10, 0]) cube([40, 20, height], center=true); } } } } } for (a = [60:120:359]) rotate([0, 0, a]) { translate([0, offset, 0]) rotate([0, 90, 0]) #cylinder(r=m3_wide_radius, h=separation+1, center=true, $fn=12); translate([0, offset, 0]) rotate([90, 0, 90]) #cylinder(r=m3_nut_radius, h=separation-12, center=true, $fn=6); translate([0, offset, 0]) cylinder(r=separation/2-height, height+1, center=true); } cylinder(r=20, h=height+1, center=true, $fn=36); for (a = [0:18:359]) rotate([0, 0, a]) { translate([0, 25, 0]) cylinder(r=extruder_mount, h=2*height, center=true, $fn=12); } }
위 코드는 configuration.scad라는 화일이 있어야하는데, 그건 코드 바로 위에 링크를 건 RepRap - kossel 문서에서 찾을 수 있습니다. 뭐 아무튼 오늘은 괜찮은 기능하나 소개하고 갑니다.^^
'Robot > Robot Program - ROS' 카테고리의 다른 글
ROS를 사용할 때 자주 사용할 기초 명령 및 기능 구경하기 (2) | 2016.05.17 |
---|---|
ARDUnity를 이용하여 유니티(Unity)의 Directional Light 속성에 따라 아두이노 LED 제어하기 (6) | 2016.05.12 |
ARDUnity를 이용하여 유니티(Unity)에서 기초 UI Button으로 아두이노 LED 제어하기 (6) | 2016.05.10 |
Unity에서 Arduino 아두이노를 데리고 놀아보자 -ARDUnity- (14) | 2016.05.09 |
ROS 설치하기 (몹시 초보자용~) (18) | 2016.05.09 |
Visual C++ 2008에서 시리얼 통신 정말 간단히 하기 (6) | 2014.03.28 |
Open SCAD에서 다면체(polyhedron) 이해하기 (6) | 2014.02.17 |