フリーソフトで分子模型を作ってみる会
ページタイトルのやや寒々しい掛詞は置いておくとして、大抵の市販の分子モデリングソフトには球棒模型とか空間充填模型とかで分子を表示できる機能がついています。しかし、個人で買うにはちょっと高価です。そして、模型の原子の色とか光の当て方とかを設定ができるソフトは(たぶん)ありません(そういう目的で使うソフトじゃないような気もしますが)。ということで、フリーウェアを使ってそういうことをしてみようかなというのが動機です。
分子模型の画像を作る場合、原子を表す球とかを描いていくわけですが、遠近感とか球らしい感じを出す(たとえば影や光沢をつけて立体感を出す)とかを考えると、美的感覚の乏しい自分みたいな人間にはどうやったらいいかが良く分からない上、そういう細かい作業を1つ1つの原子の球に対して手作業でやるのはつらいものがあります。
そういう作業をやってくれるのが、POV-Rayというソフトです。POV-RayはPersistence Of Vision-Raytracerの略のようです。このソフトはある光源から発せられた光が物体に当たってどのように反射してカメラに写るかをシミュレートしてくれます(いわゆるレイトレーシング、光線追跡です)。POV-Rayはこちらの公式サイトからダウンロードできます。
POV-Rayで何か画像を描くにはシーンファイルというものを記述する必要があります。上で述べた通りPOV-Rayは光源から発せられた光が物体に当たってどのように反射してカメラに写るかをシミュレートするソフトです。なので、光源、物体、カメラについてどこにあってどのような状態になっているかをPOV-Rayに教えてやる必要があります。これらの情報が書かれているのがシーンファイルです。
シーンファイルはメモ帳のようなテキストエディタで編集できます。拡張子には.povを使います。以下に極めて単純なシーンファイルを示します。
camera {
location <0, -5, 0>
right <-1.33, 0, 0>
sky <0, 0, 1>
look_at <0, 0, 0>
}
light_source {
<5, 0, 0>
color rgb <1, 1, 1>
}
sphere {
<0, 0, 0>, 1
texture {
pigment {
color rgb <1, 1, 0>
}
}
}
なお、POV-Rayはほとんどの場合、改行はスペースと同じように解釈されます。なので、上のシーンファイルは以下のように書いても問題はありません。
camera { location <0, -5, 0> right <-1.33, 0, 0> sky <0,
0, 1> look_at <0, 0, 0> }
light_source { <5, 0, 0> color rgb <1, 1, 1> }
sphere { <0, 0, 0>, 1 texture { pigment { color rgb <1, 1, 0>
} } }
POV-Rayを起動して、この記述をしたファイルを読み込んで、上部のメニューでRunをクリックすると右半分が明るく輝いた半月状に光る黄色の球が表示されます。
カメラについての設定をキーワードcameraの後の{}内に記述します。
location <0, -5, 0> これはカメラの位置の設定です。カメラの位置をx=0, y=-5, z=0の座標にセットします。このようにPOV-Rayのシーンファイルではそれぞれのカメラや物体、光源の位置は3次元の直角に交わる座標を用いて記述します。
right <-1.33, 0, 0> 右手系の3次元座標を使うことを宣言します。右手系の座標とは右手の親指、人差し指、中指で直交する3つの方向を指したときに親指がx軸方向、人差し指がy軸方向、中指がz軸方向を指すような形の座標です。分子内の原子の座標を表現したりするときには普通この右手系の座標が使われているのでこの設定をします。なお、POV-Rayのデフォルトは左手系の座標になっています。
sky <0, 0, 1> カメラに写る画像の上側をz軸方向にします。
look_at <0, 0, 0> カメラの向いている向きを指定しています。
これらの設定によりPOV-Rayは<0, -5, 0>の位置にあるカメラから<0, 0, 0>の方を見たときに見える画像を<0,
0, 1>の方向を上側にして表示します。つまりy軸上を負の側から正の方向を見ています。
光源についての設定をキーワードlight_sourceの後の{}内に記述します。光源がないとカメラに入る光がないので、物体を書いたとしてもほとんど何も表示されません。
<5, 0, 0> light_sourceの一番最初には光源の位置の座標が記述されます。
color rgb <1, 1, 1> 光源の色をcolorの後ろに記述します。rgbは色を三原色の強さで指定することを示しています。<1,
1, 1>の数字はそれぞれ最初からR(赤)、G(緑)、B(青)の色の強さで0から1の範囲で指定します。この場合、三色とも最大値にセットされているので白色光を最大強度で放射していることを表しています。
この設定で光源はx軸正の方向から照らしていることになるので、カメラの視線とは垂直の方向から光が当たることになります。
物体についての設定です。物体を記述するのはその立体の形状によって違うキーワードが使われます。ここでは球体を指定するキーワードsphereを使っています。球の設定をsphereの後の{}内に記述します。
<0, 0, 0>, 1 sphereの一番最初には球の位置と半径を指定します。<0, 0, 0>に半径1の球をセットします。
texture {} キーワードtextureは物体の表面などの性質を指定するもので、{}内に各種の設定を記述します。
pigment {} キーワードpigmentは物体の色を指定します。{}内に色についての設定を記述します。
color rgb <1, 1, 0> light_sourceのところと同様に色を三原色で指定しています。ここでは赤と緑が1で青が0なので黄色が指定されています。
この設定で球の位置はカメラの視線方向と一致しているので、画像の中心に球が表示されます。そして光は視線とは垂直方向から来ていますから、半分だけが照らされて半月状に見えます。黄色の球を白い光で照らしているので見える球の色は黄色のままです。
上のシーンファイルで球が表示されましたけれども、のっぺりしていてあまり球らしくないです。これは球の表面での光の反射の仕方などがちゃんと設定されていないためです。これをちゃんと設定するにはsphere {}を以下のように書き換えます。
sphere {
<0, 0, 0>, 1
texture {
pigment {
color rgb <1, 1, 0>
}
finish {
ambient 0.2
diffuse 0.7
specular 0.5
reflection 0
}
}
}
今度の球は光沢がついてより立体的に見えます。新しく追加したキーワードfinishは物体の表面での光の反射の具合を調整するためのキーワードです。
キーワードfinishは物体の表面での光の反射の具合を調整するキーワードで、細かい設定がいろいろあります。ここでは中でも重要な4つのキーワードを使って反射の具合を調整しています。
ambient 0.2:キーワードambientは光源からの光が当たらなくても物体がどのくらい見えるかを指定しています。通常光の影になっている部分でも真っ暗ということはないので、このキーワードでその明るさを0~1の範囲で指定します。0ならば真っ暗で1にすると一番明るくなります。指定しなかったときにはデフォルトの設定値0.1になります。
diffuse 0.7:キーワードdiffuseは光源からの光が当たった場所が、その光をどのくらい反射して見えるかを指定します。この反射は拡散反射と呼ばれる反射で反射面における入射角と反射角は多少違っても光が見えます(が、2つの角度が近いほど明るくなります)。また反射光は光源の色から物体の補色が差し引かれた色になります。0ならば(ambientなどが別に指定されていない限り)真っ暗で1にすると一番明るくなります。指定しなかったときにはデフォルトの設定値0.6になります。
specular 0.5:キーワードspecularは光源からの光が鏡面反射される程度を指定します。鏡面反射なのでdiffuseと違い、これは反射面における入射角と反射角がほぼ等しい場所だけが輝きます。また反射光は光源の色になり物体の色は影響しません。普通つるつるした光沢のある物体を表現するために利用されます。値は0から1で、0では鏡面反射なし、1で鏡面反射が一番強くなります。指定しなかったときはデフォルトの設定値0になります。
reflection 0:キーワードreflectionは光源からの光が別の物体に当たってからその物体に当たったときに、別の物体がその物体に映りこんで見える程度を指定します。注意すべきことは光源からの光が直接当たったときには、光源は映りこみしないことです(この効果はsoecularで指定します)。写りこんだ物体の色は物体表面の色に左右されず、元の物体が見えている色で決まります。鏡や金属、ガラスのような物体を表現するためにspecularとともに使います。値は0から1で、0では映りこみなし、1で一番はっきり映りこみます。指定しなかったときはデフォルトの設定値0になります。
POV-Rayの基本的な使い方が分かればメタンくらいの分子なら簡単に描くことができます。メタンを描くのに必要なのはまず各原子の座標をどう設定するかです。メタンの4つの水素は正四面体の頂点にあるので、炭素はその重心の位置にあるのでそういう風に球を配置すればとりあえずメタンっぽくは見えるでしょう。
camera {
location <0, -7, 0>
right <-1.33, 0, 0>
sky <0, 0, 1>
look_at <0, 0, 0>
}
light_source {
<7, -7, 0>
color rgb <1, 1, 1>
}
background { color rgb <0, 0, 1>}
sphere { <0, 0, 0>, 1.5
texture {
pigment { color rgb <0, 0, 0> }
finish { ambient 0.2 diffuse 0.8 specular 0.5 reflection 0 }
}
}
sphere { <1, 1, 1>, 1
texture {
pigment { color rgb <1, 1, 1> }
finish { ambient 0.2 diffuse 0.7 specular 0.5 reflection 0 }
}
}
sphere { <-1, -1, 1>, 1
texture {
pigment { color rgb <1, 1, 1> }
finish { ambient 0.2 diffuse 0.7 specular 0.5 reflection 0 }
}
}
sphere { <-1, 1, -1>, 1
texture {
pigment { color rgb <1, 1, 1> }
finish { ambient 0.2 diffuse 0.7 specular 0.5 reflection 0 }
}
}
sphere { <1, -1, -1>, 1
texture {
pigment { color rgb <1, 1, 1> }
finish { ambient 0.2 diffuse 0.7 specular 0.5 reflection 0 }
}
}
このシーンファイルを実行すると青い背景でメタンらしく見える分子模型が描かれます。
カメラは前の球のシーンファイルよりも若干y軸負の方向へ遠ざけています。これは物体が前よりも大きいのでそのままだと画面からはみ出してしまうためです。
光源もカメラよりに置きなおしています。カメラの視線と45度の方向から光を当てているので、光が当たっている部分が多くなり見やすくなります。
新しいキーワードbackgroundは背景の色を決めます。デフォルトはrgb <0, 0, 0>で黒ですが、ここでは炭素原子を黒にしているので見にくくならないように青に変更しています。
以下5つのsphereが並びますが、最初のものが炭素原子、残りの4つが水素原子を表しています。炭素原子は原点<0, 0, 0>にあって半径1.5、色がrgb <0, 0, 0>(つまり黒)です。残りの水素はこの炭素原子が中心にある辺の長さ2の立方体の8つ頂点のうちの4つにあるようにして正四面体を構成させています。色はrgb <1, 1, 1>で白です。
上のシーンファイルではpigment { color rgb <1, 1, 1> }やfinish { ambient 0.2 diffuse 0.8 specular 0.5 reflection 0 }という記述が重複しています。もし後から原子の表面の光沢を変えたくなったりした場合には、これを一個一個修正しなければなりません。今は原子数が5個ですから大した手間ではないですが、原子数が大きな分子では大変面倒なことになります。POV-Rayにはこういった何度も出てくる表記を簡単な文字列(識別子)に置き換えておくことができる機能があります。これに使うのが#declareという宣言です。例えば#declare Hatomcolor = pigment { color rgb <1, 1, 1> }と前もって宣言しておくと、後でpigment { Hatomcolor }と書くだけでpigment { color rgb <1, 1, 1> }に自動的に置き換えられて解釈されます。この機能を利用してシーンファイルを書き換えると次のようになります。
#declare Catomradius = 1.5;
#declare Catompigment = pigment { color rgb <0, 0, 0> }
#declare Catomfinish = finish { ambient 0.2 diffuse 0.8 specular 0.5 reflection
0 }
#declare Hatomradius = 1;
#declare Hatompigment = pigment { color rgb <1, 1, 1> }
#declare Hatomfinish = finish { ambient 0.2 diffuse 0.8 specular 0.5 reflection
0 }
camera {
location <0, -7, 0>
right <-1.33, 0, 0>
sky <0, 0, 1>
look_at <0, 0, 0>
}
light_source {
<7, -7, 0>
color rgb <1, 1, 1>
}
background { color rgb <0, 0, 1>}
sphere { <0, 0, 0>, Catomradius
texture {
pigment { Catompigment }
finish { Catomfinish }
}
}
sphere { <1, 1, 1>, Hatomradius
texture {
pigment { Hatompigment }
finish { Hatomfinish }
}
}
sphere { <-1, -1, 1>, Hatomradius
texture {
pigment { Hatompigment }
finish { Hatomfinish }
}
}
sphere { <-1, 1, -1>, Hatomradius
texture {
pigment { Hatompigment }
finish { Hatomfinish }
}
}
sphere { <1, -1, -1>, Hatomradius
texture {
pigment { Hatompigment }
finish { Hatomfinish }
}
}
#declareの使い方は2種類あります。1つは#declare Catomradius = 1.5;のように#declare 識別子 = 数値またはベクトル(色を含む);と宣言し、識別子を数値やベクトルの代わりに使う方法です。識別子は40文字以下で基本的に頭文字を大文字とします。この使い方では文末に;で宣言を締める必要があります。
もう1つは#declare Catompigment = pigment { color rgb <0, 0, 0> }のように#declare 識別子 = キーワード {キーワードのパラメータ}という形で宣言して、識別子をキーワードのパラメータの代わりに使う方法です。識別子はキーワード {キーワードのパラメータ}に置き換えられるのではなく、あくまでキーワードのパラメータに置き換わるものだということに注意してください。つまり使うときにはpigment { Catompigment }のようにキーワードは改めて書かなくてはいけないということです。この使い方でも識別子は40文字以下で基本的に頭文字を大文字とするのは同じですが、文末に;は不要です。
つぎにもう少し複雑なものとしてベンゼン分子を書いてみます。ベンゼンは正六角形型の分子なので、とりあえず炭素6個と水素6個を正六角形の頂点に置くように配置すればできそうです。しかし、適当にこれをやると炭素-炭素結合距離と炭素-水素結合距離が正しい比率になりません。炭素-炭素結合距離と炭素-水素結合の距離の比を考慮して原子の位置を計算してやる必要があります。しかしもっと複雑な分子を作ることを考えた場合、この方法では計算の手間が多すぎてとても無理にです。また、上で作ったメタン分子では適当に原子の直径を決定していますが、これも実際にはvan der Waals半径などを反映した値であるべきです。
複雑な分子については分子モデリングソフトを使って原子の座標を作ってしまうのが楽です。フリーの分子モデリングソフトはいくつかありますが、自分はWinmostarを使っています。このソフトはMOPAC Ver.6.0を内蔵しているので、データのない分子でもある程度の精度でモデルを構築できます。また、GamessやGaussianとの連携も行なえます。なおWinmostar自体、POV-Rayへの出力機能も持っています。Winmostarはこちらのサイトからダウンロードできます。
最初、炭素原子と水素原子が1つずつ表示されています。ここで炭素原子をクリックし、Addボタンの隣りのプルダウンメニューからC6H5-を選びます。この状態でプルダウンメニューの隣りのAddボタンをクリックすると選択されていた炭素原子がベンゼン環に置換されます。
こうしてベンゼン分子ができたら編集メニューからクリーンを選び、分子の形を整えます。そうすると炭素-炭素結合距離が1.394オングストローム、炭素-水素結合距離が1.104オングストロームとなります。実測値はそれぞれ1.399オングストローム、1.101オングストロームですから模型としては充分でしょう。次に分子を画面上でドラッグすると適当に回転できるので見栄えが良いように回転させます。そうしたらファイルメニューからXYZ形式で保存を選びます。するとそこにチェックマークが付きます。この状態でファイルメニューから名前を付けて保存を選びます。ファイル名はbenzeneとし、ファイルの種類はMOPACとしておきます。保存したいフォルダに移動してから、保存をクリックするとそこにbenzene.datの名前で保存されます。
このファイルをノートパッドで開いてみます。benzene.datを保存したフォルダを開いてbenzene.datのアイコンの上で右クリックします。メニューが開くのでプログラムから開くを選び、さらに一覧からプログラムを選択するを選んで表示される一覧の中からNotepadを選びます。するとファイルの中身が表示され、次のようになっています。
AM1 EF PRECISE GNORM=0.05 NOINTER GRAPH
Winmostar
C -1.364930 0 -0.212104 0 -0.195156 0
H -2.440851 1 -0.379320 0 -0.348915 0
C -0.690876 1 0.740743 1 -0.959250 0
C -0.674070 1 -0.952829 1 0.764099 1
C 0.690871 1 -0.740730 1 0.959258 1
C 0.674062 1 0.952829 1 -0.764102 1
C 1.364940 1 0.212097 1 0.195147 1
H -1.205380 1 -1.703915 1 1.366412 1
H 1.235426 1 -1.324637 1 1.715397 1
H -1.235491 1 1.324602 1 -1.715366 1
H 1.205459 1 1.703884 1 -1.366403 1
H 2.440873 1 0.379312 1 0.348926 1
1行目はこれをMOPACで処理するときに使われるキーワードです。2行目と3行目はコメントです。4行目からが原子の種類と座標になっています。意味はそれぞれの行で、原子の種類 X座標 MOPACでX座標を最適化するか Y座標 MOPACでY座標を最適化するか Z座標 MOPACでZ座標を最適化するか となっています。なので、これから原子の種類と座標を取り出してやればいいわけです。なお、座標の数字の単位はオングストロームです。
#declare C1atomxyz = < -1.364930 , -0.212104 , -0.195156 >;
#declare C2atomxyz = < -0.690876 , 0.740743 , -0.959250 >;
#declare C3atomxyz = < -0.674070 , -0.952829 , 0.764099 >;
#declare C4atomxyz = < 0.690871 , -0.740730 , 0.959258 >;
#declare C5atomxyz = < 0.674062 , 0.952829 , -0.764102 >;
#declare C6atomxyz = < 1.364940 , 0.212097 , 0.195147 >;
#declare H1atomxyz = < -2.440851 , -0.379320 , -0.348915 >;
#declare H2atomxyz = < -1.205380 , -1.703915 , 1.366412 >;
#declare H3atomxyz = < 1.235426 , -1.324637 , 1.715397 >;
#declare H4atomxyz = < -1.235491 , 1.324602 , -1.715366 >;
#declare H5atomxyz = < 1.205459 , 1.703884 , -1.366403 >;
#declare H6atomxyz = < 2.440873 , 0.379312 , 0.348926 >;
#declare Catomradius = 1.7;
#declare Catompigment = pigment { color rgb <0, 0, 0> }
#declare Catomfinish = finish { ambient 0.2 diffuse 0.8 specular 0.5 reflection 0 }
#declare Hatomradius = 1.2;
#declare Hatompigment = pigment { color rgb <1, 1, 1> }
#declare Hatomfinish = finish { ambient 0.2 diffuse 0.8 specular 0.5 reflection 0 }
camera {
location <0, 0, 8>
right <-1.33, 0, 0>
sky <0, 1, 0>
look_at <0, 0, 0>
}
light_source {
<0, 8, 8>
color rgb <1, 1, 1>
}
background { color rgb <0, 0, 1>}
sphere { C1atomxyz, Catomradius texture { pigment { Catompigment } finish { Catomfinish } } }
sphere { C2atomxyz, Catomradius texture { pigment { Catompigment } finish { Catomfinish } } }
sphere { C3atomxyz, Catomradius texture { pigment { Catompigment } finish { Catomfinish } } }
sphere { C4atomxyz, Catomradius texture { pigment { Catompigment } finish { Catomfinish } } }
sphere { C5atomxyz, Catomradius texture { pigment { Catompigment } finish { Catomfinish } } }
sphere { C6atomxyz, Catomradius texture { pigment { Catompigment } finish { Catomfinish } } }
sphere { H1atomxyz, Hatomradius texture { pigment { Hatompigment } finish { Hatomfinish } } }
sphere { H2atomxyz, Hatomradius texture { pigment { Hatompigment } finish { Hatomfinish } } }
sphere { H3atomxyz, Hatomradius texture { pigment { Hatompigment } finish { Hatomfinish } } }
sphere { H4atomxyz, Hatomradius texture { pigment { Hatompigment } finish { Hatomfinish } } }
sphere { H5atomxyz, Hatomradius texture { pigment { Hatompigment } finish { Hatomfinish } } }
sphere { H6atomxyz, Hatomradius texture { pigment { Hatompigment } finish { Hatomfinish } } }
上のシーンファイルによって描かれたベンゼン分子です。
まず最初にWinmostarから出力された原子の座標を#declareでまとめてXNatomxyz(Xは元素名、Nは番号)に置換します。原子の半径はvan
der Waals半径をそのまま使っています(座標がオングストローム単位なのでこれもオングストローム単位)。
カメラの位置はz軸上にy軸方向が上になるようにセットしています。これはWinmostarでの表示と同じようになるようにしています。