Apps WebApp

001-Rhino-Compute-Sphere|RhinoComputeを使用して3Dモデルをウィンドウに表示

このアプリは、3Dモデリングとアニメーションを組み合わせた簡単なビジュアルツールです。Rhino3Dの機能を利用して、複数の球体を生成し、Tkinterを使用してそれらを回転させるアニメーションを画面に表示します。具体的には、以下の流れで動作します。

  • アプリケーションは、3D空間における球体の中心点と半径を指定して、複数の球体を作成します。
  • その球体をRhino3Dのメッシュ(Brep形式)に変換し、メッシュの頂点データをもとに、2Dのキャンバス上にその形状を描画します。
  • 描画されたメッシュは、指定した回転軸を中心に回転し、アニメーションとして表示されます。

このアプリは、3Dグラフィックスを2Dで視覚化し、回転アニメーションを加えることで、簡単に3Dモデルをインタラクティブに表示する方法を学べるツールです。

コードの解説

# -*- coding: utf-8 -*-  # このファイルはUTF-8でエンコードされています。
from rhino3dm import *  # Rhinoの3Dデータ形式を操作するライブラリをインポート
import tkinter as Tkinter  # GUI作成のためのライブラリをインポート
import time  # アニメーションのフレーム間に時間間隔を入れるためのライブラリ
import compute_rhino3d.Mesh  # Rhino.Computeを使ってメッシュを操作するライブラリ
import compute_rhino3d.Util  # Rhino.Computeのユーティリティライブラリ

# Rhino.ComputeのURL設定(ローカルで動作しているサーバー)
compute_rhino3d.Util.url = "http://localhost:6500/"

# 球の中心点を3つ定義し、リストに格納
centers = [Point3d(300, 450, 0), Point3d(600, 450, 0), Point3d(900, 450, 0)]
radius = 100  # 球の半径を設定

# 球体を作成し、メッシュに変換する
spheres = [Sphere(center, radius) for center in centers]  # 各中心点に基づいてSphereオブジェクトを作成
meshes = []  # メッシュを格納するリスト
for sphere in spheres:
    brep = sphere.ToBrep()  # 球体をBrep(境界表現)に変換
    d = compute_rhino3d.Mesh.CreateFromBrep(brep)  # Brepをメッシュに変換(リストとして返される)
    meshes.append(d[0])  # 最初のメッシュをリストに追加

# Tkinterを使ったGUIのセットアップ
top = Tkinter.Tk()  # ウィンドウを作成
w = Tkinter.Canvas(top, width=1200, height=900)  # 幅1200、高さ900のキャンバスを作成
w.pack()  # キャンバスをウィンドウに追加

# メッシュを回転させるための回転軸を設定
v = Vector3d(1, 1, 0)  # X方向とY方向に傾いた回転軸

# アニメーションループ
for x in range(100):  # ループを100回繰り返す
    top.update()  # Tkinterウィンドウを更新
    time.sleep(0.01)  # 0.01秒間処理を停止して、アニメーションを滑らかにする
    w.delete("all")  # キャンバス上の既存の描画を全て削除
    
    # 各メッシュを描画
    for i, mesh in enumerate(meshes):  # メッシュごとに処理を実行
        center = centers[i]  # 対応する球の中心点を取得
        mesh.Rotate(0.1, v, center)  # メッシュを指定の軸(v)と中心(center)で回転
        verts = mesh.Vertices  # メッシュの頂点リストを取得
        faces = mesh.Faces  # メッシュの面リストを取得
        
        # 各面を描画
        for j in range(len(faces)):  # 各面を処理
            face = faces[j]  # 現在の面のインデックスを取得
            pts = [verts[face[0]], verts[face[1]], verts[face[2]], verts[face[3]]]  # 面を構成する4つの頂点を取得
            # 面を構成する頂点を線で結び、キャンバスに描画
            w.create_line(pts[0].X, pts[0].Y, pts[1].X, pts[1].Y)  # 頂点0から1へ
            w.create_line(pts[1].X, pts[1].Y, pts[2].X, pts[2].Y)  # 頂点1から2へ
            w.create_line(pts[2].X, pts[2].Y, pts[3].X, pts[3].Y)  # 頂点2から3へ
            w.create_line(pts[3].X, pts[3].Y, pts[0].X, pts[0].Y)  # 頂点3から0へ

# Tkinterのメインループを開始(ウィンドウを閉じるまでアニメーションを実行)
top.mainloop()

以下のコードは、3D球体のメッシュを作成し、回転する様子を2Dキャンバス上でアニメーション表示するプログラムです。初学者向けにわかりやすく説明します。

1. ファイルのエンコーディング指定

# -*- coding: utf-8 -*-
  • ソースコードがUTF-8形式で書かれていることを指定します。これにより、プログラムが正しくテキストを解釈できます。

2. 必要なライブラリのインポート

from rhino3dm import *
import tkinter as Tkinter
import time
import compute_rhino3d.Mesh
import compute_rhino3d.Util
  • rhino3dm: Rhinoの3Dデータ形式を操作するためのライブラリ。
  • tkinter: シンプルなGUI(グラフィカルユーザーインターフェース)を作成するためのPython標準ライブラリ。
  • time: プログラム実行を一時停止するために使用。
  • compute_rhino3d: Rhino.Computeを操作するライブラリで、Rhinoの計算機能を外部プログラムで使えます。

3. Rhino.ComputeのURL設定

compute_rhino3d.Util.url = "http://localhost:6500/"
  • Rhino.Computeサーバー(ローカル環境で動作している)のURLを指定します。この設定で、Rhinoの計算機能が利用可能になります。

4. 球体データの準備

centers = [Point3d(300, 450, 0), Point3d(600, 450, 0), Point3d(900, 450, 0)]
radius = 100
  • centers: 球の中心座標を3つ定義。
    • 例: 最初の球の中心は(150, 250, 0)
  • radius: 球の半径(100)。

5. 球体を作成しメッシュ化

spheres = [Sphere(center, radius) for center in centers]
meshes = []
for sphere in spheres:
    brep = sphere.ToBrep()
    d = compute_rhino3d.Mesh.CreateFromBrep(brep)
    meshes.append(d[0])
  • 各中心点と半径を使い、Sphereオブジェクトを作成。
  • ToBrep(): 球をBrep(境界表現)に変換。
  • compute_rhino3d.Mesh.CreateFromBrep(): Brepをメッシュ(点と面で構成されるデータ)に変換。

6. GUIのセットアップ

top = Tkinter.Tk()
w = Tkinter.Canvas(top, width=1200, height=900)
w.pack()
  • Tk()でウィンドウを作成。
  • Canvasを使って幅500、高さ500の描画領域を作成。
  • pack()でウィンドウに描画領域を配置。

7. 回転軸の設定

v = Vector3d(1, 1, 0)
  • 球体を回転させるための軸を定義。
    • (1, 1, 0)は、X方向とY方向に傾いた軸を示します。

8. アニメーションループ

for x in range(100):
    top.update()
    time.sleep(0.01)
    w.delete("all")
  • ループが100回繰り返され、アニメーションが表示されます。
  • top.update(): GUIを更新。
  • time.sleep(0.01): 0.01秒間処理を一時停止。
  • w.delete("all"): 前回の描画内容を消去。

9. 各メッシュの描画と回転

for i, mesh in enumerate(meshes):
    center = centers[i]
    mesh.Rotate(0.1, v, center)
    verts = mesh.Vertices
    faces = mesh.Faces
    for j in range(len(faces)):
        face = faces[j]
        pts = [verts[face[0]], verts[face[1]], verts[face[2]], verts[face[3]]]
        w.create_line(pts[0].X, pts[0].Y, pts[1].X, pts[1].Y)
        w.create_line(pts[1].X, pts[1].Y, pts[2].X, pts[2].Y)
        w.create_line(pts[2].X, pts[2].Y, pts[3].X, pts[3].Y)
        w.create_line(pts[3].X, pts[3].Y, pts[0].X, pts[0].Y)
  • mesh.Rotate(0.1, v, center): 各球体を回転。
    • 0.1: 回転角度(ラジアン)。
  • メッシュの頂点(Vertices)と面(Faces)を取得。
  • 各面の頂点を繋いで線を描画。

10. GUIの実行

top.mainloop()
  • イベントループを開始し、ウィンドウを閉じるまでアニメーションを続けます。

実行結果

  • 3つの球体が2Dのキャンバス上で表示され、回転する様子がアニメーションで描かれます。

参考

https://github.com/mcneel/rhino-developer-samples/tree/8/compute/py/SampleTkinter

-Apps, WebApp
-