このアプリは、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