Facebook Twitter YouTube
Home Modelagem 3D Modelagem 3D paramétrica com software livre
formats

Modelagem 3D paramétrica com software livre

Publicado em 27 de janeiro de 2012

Dentre os softwares livres para modelagem 3D, o mais frequentemente citado costuma ser o Blender. De fato, o Blender pode ser utilizado na criação de modelos 3D para posterior impressão. Entretanto, para o projeto de peças técnicas existem algumas ferramentas mais específicas do que o Blender, dentres as quais está o OpenSCAD, programa que será abordado neste post.

O OpenSCAD é um software livre de CAD (Computer Aided Design) onde os modelos 3D são definidos algoritmicamente. A modelagem é feita por meio da escrita de um script que quando executado resulta no modelo 3D desejado. Uma das vantagens dessa abordagem, que pode às vezes parecer um pouco estranha aos não-programadores, é poder criar modelos paramétricos, ou seja, onde determinadas dimensões do objeto podem ser alterados a posteriori, por meio da seleção de diferentes valores de parâmetros, sem precisar re-modelar tudo do zero.

Outra vantagem dessa abordagem de modelagem por meio de scripts é que práticas de reuso de código (muito comuns no desenvolvimento de software) podem ser empregadas também no trabalho de modelagem 3D. Pode-se encontrar diversos scripts OpenSCAD no site Thingiverse, por exemplo. A partir destes scripts podemos facilmente criar objetos derivados, sem precisarmos nos preocupar em re-modelar os objetos nos quais nos inspiramos.

Pode-se também criar scripts que sejam capazes de gerar toda uma gama de modelos 3D. Um exemplo bacana disso são as famosa peças de LEGO. Enquanto alguém poderia criar o modelo da peça de 2×4 pinos usando o blender, caso se deseje imprimir uma peça de tamanho diferente, por exemplo uma peça de 6×2 pinos, seria necessário criar um outro modelo no blender. Ou seja, teríamos um arquivo de modelo 3D para cada configuração possível de número de pinos em uma peça de LEGO. Entretanto, utilizando o OpenSCAD, podemos criar um único script que seja capaz de gerar todos os tijolinhos de LEGO. Segue abaixo uma implementação dessa idéia.

Durante a Campus Party 2012 organizaremos oficinas de modelagem com OpenSCAD para as pessoas interessadas em aprender mais sobre o assunto.

// Modelo paramétrico de tijolos de LEGO
// Data: 12 de Novembro de 2011
// Criado por Felipe Corrêa da Silva Sanches
// <fsanches@metamaquina.com.br>
// Lançado ao domínio público

lego_unit = 60;
lego_height = 60;
lego_button_radius = 18;
lego_wall_width = lego_unit/2 - lego_button_radius;
lego_button_height = 2*lego_wall_width;
base_pin_radius = lego_wall_width;
base_circle_radius = (lego_unit*sqrt(2) - 2*lego_button_radius)/2;

module lego_brick(brick_length=4, brick_width=2){

union(){
	difference(){
		cube([lego_unit*brick_length, lego_unit*brick_width, lego_height]);

		translate([lego_wall_width, lego_wall_width, -lego_wall_width])
		  cube([lego_unit*brick_length - 2*lego_wall_width,
                        lego_unit*brick_width - 2*lego_wall_width,
                        lego_height]);
	}

	//buttons
	for (i = [0:brick_length-1]) {
		for (j = [0:brick_width-1]) {
			translate([lego_unit/2+i*lego_unit, lego_unit/2+j*lego_unit,lego_height+1])
                        cylinder(r=lego_button_radius,
                                 h=lego_button_height-2,center=true);
		}
	}

	if (brick_width==1){
		if (brick_length>1){
			//base pins
			for (i = [1:brick_length-1]) {
				translate([i*lego_unit, lego_unit/2, lego_height/2])
                                cylinder(r=base_pin_radius,
                                         h=lego_height, center=true);
			}
		}

		if (brick_length > 3){
			for (i = [1:(brick_length/2-1)]) {
				translate([i*2*lego_unit, lego_unit/2, lego_height/2+lego_wall_width/4])
                                cube([lego_wall_width, lego_unit,lego_height-lego_wall_width/2], center=true);
			}
		}
	} else {
		difference(){
			union(){
				//body of the base circles
				for (i = [1:brick_length-1]) {
					translate([i*lego_unit, lego_unit, lego_height/2])
					difference(){
						cylinder(r=base_circle_radius, h=lego_height, center=true);
					}
				}

				//inner walls
				if (brick_length > 3){
					for (i=[1:(brick_length/2-1)]) {
					  translate([i*2*lego_unit, lego_unit, lego_height/2+lego_wall_width/2])
                                          cube([lego_wall_width/4, 2*lego_unit,lego_height-lego_wall_width],
                                               center=true);
					}
				}
			}
			
			//holes of the base circles
			for (i = [1:brick_length-1]) {
				translate([i*lego_unit, lego_unit, lego_height/2])
				cylinder(r=lego_button_radius, h=lego_height+1, center=true);
			}

		}

	}
}

}

//Para gerar o modelo da peça
// de 2x2 pinos:
lego_brick(2,2);

//Para gerar o modelo da peça
// de 4x2 pinos:
//lego_brick(4,2);

//Para gerar o modelo da peça
// de 3x1 pinos:
//lego_brick(3,1);

//Para gerar o modelo da peça
// de 13x1 pinos (que eu nunca vi à venda :-P):
//lego_brick(13,1);
 
 Share on Facebook Share on Twitter Share on Reddit Share on LinkedIn
No Comments  comments