드론 쿼드콥터/3D 프린팅

OpenSCAD 사용 예

하늘이푸른오늘 2016. 1. 6. 15:56

엊그제 OpenSCAD를 처음 사용해본 글을 올렸는데, 오늘은 OpenSCAD를 사용하는 방법을 간단한 예제를 통해 소개하는 글입니다.


먼저... 최종목표. 엊그제 스마트폰 뒤적거리다가 아이디어 상품이라는 글에서 아래 사진을 봤습니다. 스폰지를 꽂아두는 용도랍니다. 귀엽게 생겼죠?


그다지 복잡하지도 않고... 해서 OpenSCAD 연습할 겸 한번 만들어보기로 했습니다.



OpenSCAD는 기본적으로 간단한 도형으로부터 출발해서 합치거나 빼거나 해서 복잡한 물건을 만들어가는 개념입니다. CGS(constructive solid geometry)라고 합니다. 먼저 제가 최종적으로 만든 것부터 보여드리겠습니다. 콧수염이랑 맨 아래쪽이 그림이 이상하지만, 렌더링 문제이므로 그냥 넘어가 주세요.



이제 제일 먼저 얼굴을 만들어보겠습니다. 먼저 아래처럼 구를 두개 만듧니다.

        sphere(r=30, center=true);

        translate([0,40,0])sphere(r=10, center=true);

아래는 그 결과입니다. 위의 명령으로는 원점에 반지름이 30인 구를 만들었고, 아래는 반지름이 10인 구를 만든 다음 y 축으로 40을 이동한 겁니다. 그림 좌측 아래에 보면 x,y,z 축의 방향을 알 수 있습니다.


다음은 hull()을 이용해 이 두개의 구를 완전히 감싸는 표면(convex hull)을 만듭니다. 

    hull(){
        sphere(r=30, center=true);
        translate([0,40,0])sphere(r=10, center=true);
    }  
아래는 그 결과입니다. 얼굴 형태는 이걸로 완성



얼굴을 함수(module)로 저장해둡니다. 모두 이런식으로 모듈로 저장해두면 나중에 사용할 때 편합니다. 다른 것들도 모두 모듈로 저장해 뒀습니다.

module face(){

    hull(){

        sphere(r=30, center=true);

        translate([0,40,0])sphere(r=10, center=true);

    }  

}


다음은 모자를 만들어 보겠습니다. 아래 두 줄로 만들었습니다. 둘다 원기둥입니다. cylinder로 만들어도 되지만, 위는 먼저 원을 만들고 높이를 2만큼 올려서 앏은 원반을 만들었습니다.
    translate([0,0,-1]) linear_extrude(height=2,center=true) 
         circle(r=25);
    translate([0,0,15]) cylinder(h=30, r1=20, r2=25, center=true);
아래 원기둥은 아래쪽 반경은 20, 윗쪽 반경은 25로 해서 위가 더 넓은 모자입니다.


이번엔 귀를 만들어보겠습니다. 귀는 도넛 형태를 하나 만든 다음 가운데를 평면으로 막아주는 방법을 썼습니다.

        rotate_extrude() translate([3.1,0,0])circle(r=3);

도넛처럼 만드는 게 조금 까다로운데요, 일단 먼저 원을 그리고 x축 방향으로 이동을 시킵니다. (모든 점들이 x>0이 되어야 한답니다.) 그러면 아래와 같이 됩니다. (circle이니까 아직 두께가 없는데, openSCAD에서는 1인 것 처럼 그려줍니다.)


그 다음 rotate_extrude를 적용하면 아래와 같이 도넛 형태가 됩니다. 도자기 빚는 물레처럼 생각하면 되는데, 다만, 직접 z 축을 중심으로 회전시키는 게 아니라, y 축을 중심으로 회전을 시킨 뒤, 회전축을 z 축 방향으로 (x 축을 중심으로 90도) 회전시킨다고 생각하시면 됩니다.



그 다음 가운데 부분은 평면으로 막아주고, 이 두 개를 합집합(union)시킨 다음, scale 명령을 사용해 약간 길쭉한 형태로 만들었습니다. 여기에서 union은 따로 쓸 필요가 없답니다. 그냥 함께 있으면 기본이 union으로 처리된다네요.

     scale([1,0.7,0.8]) union() {
        rotate_extrude() translate([3.1,0,0])circle(r=3);
        cylinder(h=4.5,r=2.5,center=true);
    }
아래는 그 결과입니다.


이런 식으로 부분 부분 만들어진 것들을 적당히 회전, 평행 이동시켜 합쳐주면 됩니다. 귀는 좌측과 우측에 대칭되도록 붙여주었습니다.

face();

translate([0,30,0]) rotate([-90,0,0]) hat();

translate([-26,14,0]) rotate([0,0,62]) ear(); //left

translate([26,14,0]) rotate([0,0,-62]) ear(); //right

아래는 그 결과입니다.



다른 것들은 단순한 도형으로 구성이 가능한데, 수염은 형태가 좀 복잡할 뿐 아니라, 동그란 표면위에 붙여야 해서 좀 까다로웠습니다.
먼저 구글에서 moustache dxf로 검색을 해보니 마침 있더군요. 이 파일을 읽어 들여서 높이를 1로 만들었습니다. OpenSCAD는 현재 dxf와 stl 파일만 불러올 수 있습니다.
linear_extrude(height=1) import(file="moustache.dxf", convexity=5);


그 다음 resize()와 translate()를 사용해 이 녀석의 크기와 위치를 조정한 뒤, 얼굴면과의 차이를 구했습니다. 그 결과 아랫부분이 둥글게 되었습니다.

difference() {

            translate([-22.5,-10])resize([45,15,50])

linear_extrude(height=1) import(file="moustache.dxf", convexity=5);

            face();

}



 
그 다음 이녀석을 조금 아래로 내린 후 얼굴면과 교집합. 그래서 아래와 위가 모두 얼굴면을 따라 동그랗게 만들었습니다. 
intersection() {
        face();

        translate([0,0,-10]) difference() {
            translate([-22.5,-10])resize([45,15,50])linear_extrude(height=1)                 import(file="moustache.dxf", convexity=5);
            face();
        }
}


눈은 그냥 구(sphere)로 만들었고, 머리카락은 원기둥으로 만들었습니다. 아래쪽에 있는 스폰지 고정하는 것은 폴리곤을 그리고 offset을 적용한 뒤, mirror를 적용했는데, 자세한 건 생각합니다.


그리고 최종적으로 얼굴과 모자의 아래쪽 반쪽을 제거했습니다. 벽에 붙여야 하니까요.


아래가 최종결과입니다. OpenSCAD에는 랜더링하는 방법이 두가지가 있습니다. Preview(F5)는 빠르지만 부정확하고, Render(F6)는 느리지만, 정확합니다. 아래는 Render로 생성한 것입니다. (색을 지원하지 않는다네요) STL로 출력하기 위해서는 Render를 먼저 해야 하는 것 같습니다.



이 파일은 Thingiverse에 올려두었습니다. STL 파일도 있고, SCAD도 있으니 참고하세요.

http://www.thingiverse.com/thing:1250277


민, 푸른하늘