時計を作ってみよう


ここまでに書いてきたことをいろいろと使いながら,左のような画像を作ってみます。下のプレビュー画像をクリックすると,別ウインドウで640×480の画像を見ることができます。画像のソースはこちらにあります。

基本的にOkamotoが作ったときの過程を元に書いていますが,もちろん,作り方の順番やテクスチャなど,これ,と決まったものがあるわけではありませんので,自分なりにやりやすい方法で作ってください。

本文中やソースのリンク部分をクリックすると,関連ページが別ウインドウで開きます。


まずは時計の外側を作っていきます。

#include "colors.inc"
#include "shapes.inc"

camera {
 location <2, 4, -6>
 look_at <0, 0, 0>
 angle 30
 right x*image_width/image_height 
}

light_source {
 <100, 30, -100>
 color rgb 1
}

difference {
  object {
    Round_Box_Union(<-1,-1,-1>, <1,1,1>, .075)
    texture { pigment { Red } }
    scale <1, 1, 0.7>
  }

  object {
    cylinder {<0, -1, 0>, <0, 1, 0>, 1}
    texture { pigment { White } }
    scale <0.8, 1, 0.8>
    rotate <90, 0, 0>
    translate <0, 0, -1.4>
  }
}

角丸の立方体(Round_Box_Union)を変形させて,differenceを使ってcylinderでくりぬいています。cylinderでくりぬくとき,scaleとrotateとtranslateの順番に注意しましょう。

この段階から,最終の仕上がりを考えながらテクスチャを決めてしまっても良いのですが,Okamotoはたいてい,全体の形が出来上がった段階で全体を見ながらテクスチャを決めていくことが多いです。とりあえずは区別がしやすいような色をつけることが多いですね。


次に左の画像のような文字盤を作っていきます。

目盛りが赤の部分と青の部分がありますが,これは見やすくするために,とりあえずそういう色をつけているだけです。

まずベースの文字盤の部分を作ります。ソースは次の通りです。
object {
  disc { <0, 0, 0>, z, 0.9, 0 }
  texture {
    pigment {
      image_map {
        jpeg "mojiban.jpg"
        once
      }
    }
    translate <-0.5, -0.5, 0>
    scale <1.8, 1.8, 1>
  }
}

基本的にdisc(円盤)にimage_mapで画像を貼り付けただけです。貼り付けるときに「once」オプションを使った上で,画像を移動しています。「mojiban.jpg」というファイルを,シーンファイルと同じフォルダに入れておくのを忘れないでください。

貼り付けた画像はこちらです。

次に目盛りを作りましょう(左の画像では,見やすいように背景をグレーにしています)。

赤い(長い)目盛りと青い(短い)目盛りがありますが,これらを別々に作ります。ただ,作り方は一緒です。

赤い目盛りの作り方です。左の1番目のソースは次のようになっています。
#declare MyObj = union{
  #declare MyCounter = 0;
  #while ( MyCounter < 180 )
  object {
    cylinder { <0, -0.85, 0>, <0, 0.85, 0>, 0.015 }
    texture { pigment { Red } }
    rotate <0, 0, MyCounter>
  }
  #declare MyCounter = MyCounter + 30;
  #end
}

difference {
  object { MyObj }
  object { cylinder { <0, 0, -1>, <0, 0, 1>, 0.65 } pigment { White } }
}

上のソースの前半部分では,シリンダー(円柱)を変形させて,それを繰り返し処理(#while以下)を使って回転しながら左の2番目のような形を作り,unionでまとめています。

5分刻みの目盛りなので,MyCounterを30(度)ずつ増やしています。

後半部分では,繰り返し処理で作ったオブジェクトから,シリンダーを使って中央部分をくりぬいています(difference)。

青い目盛りも同じようにして作ります。
#declare MyObj2 = union {
  #declare MyCounter2 = 0;
  #while ( MyCounter2 < 180 )
    object {
      cylinder { <0, -0.85, 0>, <0, 0.85, 0>, 0.007 }
      texture {
        pigment { Blue }
      }
      rotate <0, 0, MyCounter2>
    }
    #declare MyCounter2 = MyCounter2 + 6;
  #end
}

difference {
  object { MyObj2 }
  object { cylinder { <0, 0, -1>, <0, 0, 1>, 0.72 } pigment { White } }
}

こちらは1分刻みの目盛りなので,MyCounterを6(度)ずつ増やしています。


次に長針,短針と軸を作ります。

//軸
object {
  sphere { <0, 0, 0>, 1 }
  texture { pigment { Blue } }
  scale <0.03, 0.03, 0.1>
}

//短針
#declare tanshin = union {
  object {
    cylinder { <0, 0, 0.007>, <0, 0, -0.007>, 0.05 }
    pigment { Red }
    translate <0, 0, -0.02>
  }

  object {
    box { <-0.5, -0.5, -0.5>, <0.5, 0.5, 0.5> }
    pigment { Red }
    scale <0.04, 0.6, 0.014>
    translate <0, 0.3, -0.02>
  }
}

//長針
#declare choushin = union {
  object {
    cylinder { <0, 0, 0.007>, <0, 0, -0.007>, 0.05 }
    pigment { White }
    translate <0, 0, -0.04>
  }

  object {
    box { <-0.5, -0.5, -0.5>, <0.5, 0.5, 0.5> }
    pigment { White }
    scale <0.04, 0.8, 0.014>
    translate <0, 0.4, -0.04>
  }
}

object { tanshin rotate <0, 0, -306>}
object { choushin rotate <0, 0, -60>}

軸はを変形しているだけです。また短針と長針は,円柱と立方体をそれぞれ変形して組み合わせて作っています。

短針と長針については,unionで結合した後で,最後に回転しています。


ここまでで,時計を構成するパーツはほとんどそろいました。

ここまでのパーツを少し移動したりしながら組み合わせ,文字盤の上の透明な板をくわえると,左のような画像になります。

この後は,それぞれのパーツのテクスチャを決めたり,床を付け加えたりといった作業になります。

ここまで作った時点で,時計全体をunionで一つにまとめました。後で移動したりするのを便利にするためです。

ちなみに,文字盤の上の透明な板のソースは次の通りです。屈折率を設定すると,文字盤の文字などが歪んでしまうので,屈折率は設定していません。

object {
  box { <-1, -1, -1>, <1, 1, 1> }
  texture {
    pigment { White*0.9 filter 0.99}
  }
  scale <0.9, 0.9, 0.005>
  translate <0, 0, -0.62>
}

あとは床(plane)を追加した上で,時計の位置やカメラの位置,ライトなどを調整します。また,時計の個々のテクスチャなどを設定します。床の部分(左の画像)のソースは次の通りです。

object {
  plane { y, -0.0 }
  texture {
   T_Wood19
   scale 2
  }
}

woods.incを読みこんで「T_Wood19」を使っていますが,どのテクスチャを使うかは好みの問題です。テクスチャが細かいと,時計とのバランスが悪かったので,テクスチャを2倍に拡大しています。

個々のテクスチャの設定などは,一つ一つ書いていくととても長くなるので省略します。全体のソースファイルがこちらにあります。コメント入りになっていますので,参考にしてください。*ソースのテキストをブラウザでみたときに日本語の表示がおかしい場合は,テキストエンコーディングを変更してみてください。


戻る