2024年12月13日(金) 01:45 JST

アニメーションで見たい

  • 2015年4月27日(月) 17:03 JST
  • 投稿者:

GDL講習会が始まりましたが、第1回からやたらと高度なサンプルが出てきました。毎年講師役は交代するので、担当者が前年に負けまいと頑張るとこういうことがおきます。受講生からみるともしかしたら負担が大きいかもしれませんが、ちょっと無責任ですが、運営責任者からみるととても楽しい状況です。次回以降が楽しみです。

さて、上のアニメーションは第1回のサンプルになっていた木工パズルの嵌合部のアニメーションをOpenSCADで作成したものです。こういうギミック系の納まりはとても楽しいですが、動画で見ると仕組みがよくわかってさらに面白いのではないでしょうか。長くなるので、ソースコードは下の続きを読むリンクを押したら表示されるようにしました。

アニメーション部分を除けば、GDLのスクリプトと大変よく似ていますね。3Dモデリングに必要となる基本的な概念は同じですから、片方を理解できればもう一方も難なく理解できます。いわゆる、つぶしのきく、そういう知識ですので、多くの若者に身につけて欲しいと思います。

d = 11; //部材厚み
w = 2*d; //部材高さ
a = d/2.0; //部材に空く穴のオフセット(高さ)
x = 2; //部材に空く穴のオフセット(幅)

module p1(){
  color([1,0,0]) 
  rotate([0,90,0])
  linear_extrude(height=d, center=true)
  polygon(
    points=[
      [-( x + w / 2 ), -w / 2],
      [-( x + w / 2 ), w / 2],
      [x + w / 2, w / 2],
      [x + w / 2, -w / 2],
      [-( x + w / 2 ), -w / 2],
      [-w / 2, -d / 2],
      [-w / 2, d / 2],
      [w / 2, d / 2],
      [w / 2, -d / 2],
      [-w / 2, -d / 2]
    ],
    paths=[[0,1,2,3,4,5,6,7,8,9]
    ]
  );
}

module p2(){
  color([0,1,0])
  rotate([90,0,0])
  linear_extrude(height=d, center=true)
  polygon(
    points=[
      [-( x + w / 2 ), -w / 2],
      [-( x + w / 2 ), w / 2],
      [-a, w / 2],
      [-a, -d / 2],
      [2*a, -d / 2],
      [2*a, d / 2],
      [0, d / 2],
      [0, w / 2],
      [x + w / 2, w / 2],
      [x + w / 2, -w / 2]
    ],
    paths=[[0,1,2,3,4,5,6,7,8,9]]
  );
}

module p3(){
  color([0,0,1])
  rotate([0,0,90])
  linear_extrude(height=d, center=true)
  polygon(
    points=[
      [-( x + w / 2 ), -w / 2],
      [-( x + w / 2 ), w / 2],
      [-d / 2, w / 2],
      [-d / 2, d / 2],
      [-w / 2, d / 2],
      [-w / 2, -d / 2],
      [w / 2, -d / 2],
      [w / 2, d / 2],
      [d / 2, d / 2],
      [d / 2, w / 2],
      [x + w / 2, w / 2],
      [x + w / 2, -w / 2]
    ],
    paths=[[0,1,2,3,4,5,6,7,8,9,10,11]]
  );
}

animation();

loc_p2 = [
  20, 19, 18, 17, 16, 15, 14, 13, 12, 11,
  11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
  10,  9,  8,  7,  6,  5,  4,  3,  2,  1,
   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
   0,  0,  0,  0,  0,  0,  0,  0,  0,  0];

loc_p3 = [
  20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
  19, 18, 17, 16, 15, 14, 13, 12, 11, 10,
   9,  8,  7,  6,  5,  4,  3,  2,  1,  0,
   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
   0,  0,  0,  0,  0,  0,  0,  0,  0,  0];

function step() = $t * 100;

module animation()
{
  p1();
  i = step();
  translate([loc_p2[i],0,0])p2();
  translate([0,0,loc_p3[i]])p3();
  //echo( step() );
}