#はじめに
シリーズ5回目です。
PDBのタンパク質データをもとに、タンパク質をSketchUp内で立体モデル化することを目指しています。
前回までに、タンパク質の主鎖、側鎖をedgeとして描画し、また主鎖を円柱化して色を塗りました。
今回は、SketchUpで球(原子)を作ります。
タンパク質の立体構造をSketchUpでモデル化 その1
タンパク質の立体構造をSketchUpでモデル化 その2【アミノ酸の側鎖を描画】
タンパク質の立体構造をSketchUpでモデル化 その3【アミノ酸の側鎖も含めて描画】
タンパク質の立体構造をSketchUpでモデル化 その4【主鎖を立体に】
タンパク質の立体構造をSketchUpでモデル化 その5【玉の描画】
タンパク質の立体構造をSketchUpでモデル化 その6【ついでにDNAをモデル化】
タンパク質の立体構造をSketchUpでモデル化 その7【最終回】
#SketchUpでの球の作り方
円を2つ用意します。円1の中心を通る線上に中心を持つ円2を書きます。円2が乗る平面は先の線と直行するようにします。円1のFaceを円2のedgeにそってfollowmeします。
わかりやすくするために線を引いてありますが、この線は本来不要です。
フォローミーツールを選んで、上の円のFaceをクリックしてから、下の円の円周でマウスを動かすと下のようになります。
2つの円の位置関係ですが、中心は同じでも大丈夫です。
つまり、球を作りたい位置にお互いに直行する平面上に乗る2つの円を作り、一方をFaceにして他方の円についてfollowmeしてやれば良いことになります。
#球を作るメソッド
中心と半径があれば球が作れます。
def makeSphere(center,radius)
#第1引数:中心座標 Geom::Point3d あるいは[1,1,5] 3つの値の配列でも良い
#第2引数:半径 数値
#描画対象を取得
model = Sketchup.active_model
entities = model.active_entities
#ベクトルを2つ使用。2つが直行していれば何でも良い。
vector1 = Geom::Vector3d.new(1,0,0)
vector2 = Geom::Vector3d.new(0,0,1)
#円1を描く
circleEdges = entities.add_circle center, vector1, radius
#円1に面をつける
face = entities.add_face(circleEdges)
#円2を描く
circleEdges2 = entities.add_circle center, vector2, radius*2#半径は適当で良い
#円1のフェイスに対して、円2をエッジとしてフォローミーツールを適用
face.followme(circleEdges2)
#余計なエッジを消す
for edge in circleEdges2 do
edge.erase!
end
end
#動作確認
makeSphere([10,1,2],1)
#タンパク質の絵
主鎖から飛び出しているカルボニル結合(C=O)の酸素原子を球にしてみます。前回のコードに、先のメソッド(makeSphere)と
以下のコードを足します。
for line in lines
dataInLine = line.split
if dataInLine[0] == "ATOM" and dataInLine[2] == "O"
center = Geom::Point3d.new(dataInLine[6].to_f, dataInLine[7].to_f, dataInLine[8].to_f)
makeSphere(center,0.48)
end
end
こうなりました。
球がたくさんのFaceでてきているためでしょうか、目立って遅くなってきました。Oだけでかなり遅くなりましたので、原子を描画するのはこれが限界のように思います。それと裏地が表に出てしまっている球が半分くらいあります。
球は基本的に座標が異なるだけなので、どうして裏地が表に出たやつができてしまうのかわかりません。球を10個作って、動かして、また同じ座標に10個作ってみました。
座標にもよっておらず、ランダムみたいです。面のどちらが表に出ているかをどう判定したら良いでしょうか?原子を球で表現すると、かなり遅くなるようなので、とりあえず保留としたいと思います。
#終わりに
次はDNAをモデル化します。