タンパク質の立体構造をSketchUpでモデル化 その5【玉の描画】

#はじめに
シリーズ5回目です。
PDBのタンパク質データをもとに、タンパク質をSketchUp内で立体モデル化することを目指しています。
前回までに、タンパク質の主鎖、側鎖をedgeとして描画し、また主鎖を円柱化して色を塗りました。

今回は、SketchUpで球(原子)を作ります。

[タンパク質の立体構造をSketchUpでモデル化 その1](https://qiita.com/yoho/items/1e15bbd4e3a7c4c7ff69)
[タンパク質の立体構造をSketchUpでモデル化 その2【アミノ酸の側鎖を描画】](https://qiita.com/yoho/items/05037dd8f128c77152d7)
[タンパク質の立体構造をSketchUpでモデル化 その3【アミノ酸の側鎖も含めて描画】](https://qiita.com/yoho/items/3c8e5eb48d68324cec60)
[タンパク質の立体構造をSketchUpでモデル化 その4【主鎖を立体に】](https://qiita.com/yoho/items/d5626464fd39903e0d51)
[タンパク質の立体構造をSketchUpでモデル化 その5【玉の描画】](https://qiita.com/yoho/items/c85a37e9937ddbbaab9c)
[タンパク質の立体構造をSketchUpでモデル化 その6【ついでにDNAをモデル化】](https://qiita.com/yoho/items/0c38e1bca3b1ce17fbb5)
[タンパク質の立体構造をSketchUpでモデル化 その7【最終回】](https://qiita.com/yoho/items/a8204082a216e35462d7)

#SketchUpでの球の作り方
円を2つ用意します。円1の中心を通る線上に中心を持つ円2を書きます。円2が乗る平面は先の線と直行するようにします。円1のFaceを円2のedgeにそってfollowmeします。

<img width="328" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595771/e0b97b09-92d9-5ced-221d-451c2a462119.png">

わかりやすくするために線を引いてありますが、この線は本来不要です。
フォローミーツールを選んで、上の円のFaceをクリックしてから、下の円の円周でマウスを動かすと下のようになります。

<img width="292" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595771/636de0b3-b932-6337-6714-2295fe5c514e.png">

２つの円の位置関係ですが、中心は同じでも大丈夫です。
つまり、球を作りたい位置にお互いに直行する平面上に乗る2つの円を作り、一方をFaceにして他方の円についてfollowmeしてやれば良いことになります。

#球を作るメソッド
中心と半径があれば球が作れます。

```rb
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)

```
#描画結果
<img width="437" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595771/253d8939-0bb6-1639-195e-42ead6c82835.png">

#タンパク質の絵
主鎖から飛び出しているカルボニル結合(C=O)の酸素原子を球にしてみます。前回のコードに、先のメソッド(makeSphere)と
以下のコードを足します。

```rb
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
```

こうなりました。
<img width="781" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595771/1769621f-c8ea-f5ec-4ec3-5b282b845697.png">
球がたくさんのFaceでてきているためでしょうか、目立って遅くなってきました。Oだけでかなり遅くなりましたので、原子を描画するのはこれが限界のように思います。それと裏地が表に出てしまっている球が半分くらいあります。

球は基本的に座標が異なるだけなので、どうして裏地が表に出たやつができてしまうのかわかりません。球を10個作って、動かして、また同じ座標に10個作ってみました。

、<img width="488" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595771/e6f5ee3b-3030-062e-38b8-82679fd8f012.png">

座標にもよっておらず、ランダムみたいです。面のどちらが表に出ているかをどう判定したら良いでしょうか？原子を球で表現すると、かなり遅くなるようなので、とりあえず保留としたいと思います。

#終わりに
次はDNAをモデル化します。