OpenSCAD 사용 예

드론/쿼드콥터/3D 프린팅 2016.01.06 15:56 Posted by 푸른하늘 푸른하늘이

엊그제 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


민, 푸른하늘

댓글을 달아 주세요

BLOG main image
공간정보와 인터넷지도
제 관심사는 계속 바뀝니다. 이 블로그를 유지하는 동안에도 벌써 여러번 주제가 빠뀐 것 같습니다. 돌고 돌아 이제 고향으로 돌아왔습니다. 공간정보입니다. 세계를 측정하고, 그 기준을 세우고, 데이터를 효율적으로 공유하는 것이 공간정보에서 다루는 내용입니다. 4차산업혁명이 데이터 기반이라고들 합니다. 데이터는 그냥 모아둔다고 정보가 되지 않습니다. 표준에 따른 공통 스키마를 기반으로 만들어져야 합니다. 누구나 언제든지, 쉽고 투명하게 데이터를 가져다 쓸
by 푸른하늘이
Profile for bluesky61

달력

«   2019/01   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

카테고리

전체보기 (1588)
공간정보 (238)
구글어스 (829)
사진 (103)
드론/쿼드콥터 (239)
지오캐싱 (47)
기타 (131)
  • 4,562,042
  • 0582
TNM Media textcube get rss

공간정보와 인터넷지도

푸른하늘이's Blog is powered by Tistory. / Supported by TNM Media.
Copyright by 푸른하늘이 [ http://www.ringblog.com ]. All rights reserved.

Textcube TNM Media
푸른하늘이's Blog is powered by Tistory. Designed by Qwer999. Supported by TNM Media.