tkopengl プログラム仕様

tkopenglモジュール

概要: このモジュールは、OpenGL (PyOpenGLとFreeGLUT) を使用して3Dグラフィックを描画するためのユーティリティ関数とクラスを提供します。 基本的な形状の描画、テキスト表示、カメラ操作、イベント処理などをサポートしています。

関連リンク: tkopengl.py ライブラリ技術ドキュメント

tklib.tkgraphic.tkopengl.draw_arrow(x0, y0, z0, x1, y1, z1, radius=0.1, arrow_h=0.2, arrow_r=0.2, R=1.0, G=0.0, B=0.0, alpha=0.5, slices=10, stacks=10)[ソース]
概要:

3D空間に矢印を描画します。

詳細説明:

開始点 (x0, y0, z0) から終了点 (x1, y1, z1) までを結ぶ矢印を描画します。 矢印は円柱の軸と円錐の頭部で構成されます。方向ベクトルから回転軸と角度を計算し、 適切に配置されます。色と透明度を設定でき、マテリアル設定を一時的に変更して描画し、 元のマテリアル設定に戻します。

パラメータ:
  • x0 -- float - 矢印の開始点のX座標。

  • y0 -- float - 矢印の開始点のY座標。

  • z0 -- float - 矢印の開始点のZ座標。

  • x1 -- float - 矢印の終了点のX座標。

  • y1 -- float - 矢印の終了点のY座標。

  • z1 -- float - 矢印の終了点のZ座標。

  • radius -- float - 矢印の軸(円柱)の半径。デフォルトは0.1。

  • arrow_h -- float - 矢印の頭部(円錐)の高さ。デフォルトは0.2。

  • arrow_r -- float - 矢印の頭部(円錐)の底面の半径。デフォルトは0.2。

  • R -- float - 矢印の赤成分 (0.0-1.0)。デフォルトは1.0。

  • G -- float - 矢印の緑成分 (0.0-1.0)。デフォルトは0.0。

  • B -- float - 矢印の青成分 (0.0-1.0)。デフォルトは0.0。

  • alpha -- float - 矢印の透明度 (0.0-1.0)。デフォルトは0.5。

  • slices -- int - 円柱および円錐の側面を構成する縦方向の分割数。デフォルトは10。

  • stacks -- int - 円柱および円錐の側面を構成する横方向の分割数。デフォルトは10。

戻り値:

None

tklib.tkgraphic.tkopengl.draw_cylinder(x0, y0, z0, x1, y1, z1, radius=0.1, R=0.5, G=0.5, B=0.5, alpha=1.0, slices=10, stacks=10)[ソース]
概要:

3D空間に円柱を描画します。

詳細説明:

開始点 (x0, y0, z0) から終了点 (x1, y1, z1) までを結ぶ円柱を描画します。 円柱の方向は2点間のベクトルから計算され、適切に回転して配置されます。 色と透明度を設定でき、マテリアル設定を一時的に変更して描画し、元のマテリアル設定に戻します。

パラメータ:
  • x0 -- float - 円柱の開始点のX座標。

  • y0 -- float - 円柱の開始点のY座標。

  • z0 -- float - 円柱の開始点のZ座標。

  • x1 -- float - 円柱の終了点のX座標。

  • y1 -- float - 円柱の終了点のY座標。

  • z1 -- float - 円柱の終了点のZ座標。

  • radius -- float - 円柱の半径。デフォルトは0.1。

  • R -- float - 円柱の赤成分 (0.0-1.0)。デフォルトは0.5。

  • G -- float - 円柱の緑成分 (0.0-1.0)。デフォルトは0.5。

  • B -- float - 円柱の青成分 (0.0-1.0)。デフォルトは0.5。

  • alpha -- float - 円柱の透明度 (0.0-1.0)。デフォルトは1.0 (不透明)。

  • slices -- int - 円柱の側面を構成する縦方向の分割数。デフォルトは10。

  • stacks -- int - 円柱の側面を構成する横方向の分割数。デフォルトは10。

戻り値:

None

tklib.tkgraphic.tkopengl.draw_sphere(x, y, z, radius, R=1.0, G=0.0, B=0.0, alpha=1.0, slices=10, stacks=10)[ソース]
概要:

3D空間に球体を描画します。

詳細説明:

指定された中心座標と半径を持つ球体を描画します。色と透明度を設定でき、 マテリアル設定を一時的に変更して描画し、元のマテリアル設定に戻します。

パラメータ:
  • x -- float - 球体の中心のX座標。

  • y -- float - 球体の中心のY座標。

  • z -- float - 球体の中心のZ座標。

  • radius -- float - 球体の半径。

  • R -- float - 球体の赤成分 (0.0-1.0)。デフォルトは1.0。

  • G -- float - 球体の緑成分 (0.0-1.0)。デフォルトは0.0。

  • B -- float - 球体の青成分 (0.0-1.0)。デフォルトは0.0。

  • alpha -- float - 球体の透明度 (0.0-1.0)。デフォルトは1.0 (不透明)。

  • slices -- int - 球体の縦方向の分割数。デフォルトは10。

  • stacks -- int - 球体の横方向の分割数。デフォルトは10。

戻り値:

None

tklib.tkgraphic.tkopengl.draw_text(text, x, y, z, sx, sy, sz, R=0.5, G=0.5, B=0.5)[ソース]
概要:

3D空間にテキストを描画します。

詳細説明:

指定された3D座標にGLUTのビットマップフォント (GLUT_BITMAP_HELVETICA_18) を使用してテキストを描画します。 テキストの色とスケールを指定できます。

パラメータ:
  • text -- str - 描画するテキスト文字列。

  • x -- float - テキストのX座標。

  • y -- float - テキストのY座標。

  • z -- float - テキストのZ座標。

  • sx -- float - テキストのX方向のスケール。

  • sy -- float - テキストのY方向のスケール。

  • sz -- float - テキストのZ方向のスケール。

  • R -- float - テキストの赤成分 (0.0-1.0)。デフォルトは0.5。

  • G -- float - テキストの緑成分 (0.0-1.0)。デフォルトは0.5。

  • B -- float - テキストの青成分 (0.0-1.0)。デフォルトは0.5。

戻り値:

None

class tklib.tkgraphic.tkopengl.tkOpenGL(app=None, center=[0, 0, 0], fcenter=[0.0, 0.0, 0.0], title=b'Crystal Structure', window_w=800, window_h=600, color_bg=[1.0, 1.0, 1.0, 1.0], nslices=32, nstacks=32, debug=False)[ソース]

ベースクラス: object

概要:

OpenGLウィンドウの初期化、イベント処理、描画ロジックを管理するクラス。

詳細説明:

GLUT (FreeGLUT) を使用してOpenGLコンテキストを設定し、3Dシーンを描画するための基本機能を提供します。 マウスによる視点操作(回転、拡大縮小)やキーボードによるオブジェクト操作に対応しています。

パラメータ:
  • app -- Any - アプリケーションインスタンス (未使用だが引数として存在)。

  • center -- list[float] - シーンの中心座標 [cx, cy, cz]。

  • fcenter -- list[float] - シーンの焦点座標 [fcx, fcy, fcz] (未使用だが引数として存在)。

  • title -- bytes - ウィンドウのタイトル。デフォルトは b"Crystal Structure"。

  • window_w -- int - ウィンドウの初期幅。デフォルトは800。

  • window_h -- int - ウィンドウの初期高さ。デフォルトは600。

  • color_bg -- list[float] - 背景色 [R, G, B, A]。デフォルトは [1.0, 1.0, 1.0, 1.0] (白)。

  • nslices -- int - 描画されるオブジェクトの分割数 (スライス)。デフォルトは32。

  • nstacks -- int - 描画されるオブジェクトの分割数 (スタック)。デフォルトは32。

  • debug -- bool - デバッグモードの有効/無効。Trueの場合、デバッグ出力が増える。デフォルトはFalse。

camera_distance(W, D, H, fov_y)[ソース]
概要:

オブジェクト全体を視野に収めるためのカメラ距離を計算します。

詳細説明:

与えられたオブジェクトの幅 (W)、奥行き (D)、高さ (H)、および垂直視野角 (fov_y) に基づいて、 オブジェクト全体がカメラの視野に収まるように必要なカメラとオブジェクト間の距離を計算します。

パラメータ:
  • W -- float - オブジェクトの幅。

  • D -- float - オブジェクトの奥行き。

  • H -- float - オブジェクトの高さ。

  • fov_y -- float - 垂直視野角 (度数)。

戻り値:

float - カメラとオブジェクト間の距離。

init_canvas(color_bg=None, title=None)[ソース]
概要:

OpenGLの描画キャンバスを初期化します。

詳細説明:

GLUTウィンドウを作成し、基本的なOpenGLレンダリング設定(背景色、深度テスト、 ブレンド、シェーディングモデル、ライト、マテリアル)を初期化します。 このメソッドは、描画を開始する前に一度呼び出す必要があります。

パラメータ:
  • color_bg -- list[float], optional - 背景色 [R, G, B, A]。Noneの場合、インスタンスの`color_bg`を使用。

  • title -- bytes, optional - ウィンドウのタイトル。Noneの場合、インスタンスの`title`を使用。

戻り値:

None

init_projection(width, height)[ソース]
概要:

投影行列とモデルビュー行列を設定し、カメラの位置を初期化します。

詳細説明:

ウィンドウの幅と高さに基づいてビューポートを設定し、gluPerspective でパースペクティブ投影を定義します。 gluLookAt を使用してカメラの位置、注視点、上方向ベクトルを設定し、シーンの初期視点を確立します。 また、光源 (GL_LIGHT0) の位置も設定します。

パラメータ:
  • width -- int - ウィンドウの幅。

  • height -- int - ウィンドウの高さ。

戻り値:

None

key_pressed(x, y)[ソース]
概要:

キーが押されたときに呼び出されるコールバック関数。

詳細説明:

スペースキー (b' ') が押された場合に、アニメーションの実行状態 (animation_running) を 切り替えます。 ※このメソッドはクラスメソッドとして実装されていますが、self が引数に含まれていません。 実行時にエラーが発生する可能性がありますが、既存のコードを変更できないためこのままです。

パラメータ:
  • key -- bytes - 押されたキーのASCIIコード (bytes形式)。

  • x -- int - イベント発生時のマウスのX座標。

  • y -- int - イベント発生時のマウスのY座標。

戻り値:

None

keyboard(key, x, y)[ソース]
概要:

キーボードイベントを処理するコールバック関数。

詳細説明:

特定のキーが押されたとき、モデルのスケールや位置 (X, Y, Z軸方向) を調整します。 たとえば、'u'/'U' で拡大、'd'/'D' で縮小、'h'/'L' でX軸移動、'j'/'k' でZ軸移動、 '<'/' >' でY軸移動を行います。 変更後、シーンの再描画を要求します。

パラメータ:
  • key -- bytes - 押されたキーのASCIIコード (bytes形式)。

  • x -- int - イベント発生時のマウスのX座標。

  • y -- int - イベント発生時のマウスのY座標。

戻り値:

None

motion(x, y)[ソース]
概要:

マウスドラッグイベントを処理するコールバック関数。

詳細説明:

マウスがドラッグされている間、現在のマウス座標と前回の座標の差に基づいて、 モデルのX軸とZ軸周りの回転角度を更新します。 更新後、シーンの再描画を要求します。

パラメータ:
  • x -- int - 現在のマウスのX座標。

  • y -- int - 現在のマウスのY座標。

戻り値:

None

mouse(button, state, x, y)[ソース]
概要:

マウスイベント(ボタンの押下/離上)を処理するコールバック関数。

詳細説明:

GLUT_LEFT_BUTTONが押されたときに、マウスダウンフラグをTrueに設定し、 現在のマウス座標を記録します。ボタンが離されたときはフラグをFalseに戻します。

パラメータ:
  • button -- int - 押された/離されたマウスボタン。

  • state -- int - マウスボタンの状態 (GLUT_DOWN または GLUT_UP)。

  • x -- int - イベント発生時のマウスのX座標。

  • y -- int - イベント発生時のマウスのY座標。

戻り値:

None

reshape(w, h)[ソース]
概要:

ウィンドウのリサイズ時に呼び出されるコールバック関数。

詳細説明:

ウィンドウの新しい幅 (w) と高さ (h) を受け取り、 それに応じてビューポートと投影行列を再設定し、シーンを適切に表示します。

パラメータ:
  • w -- int - 新しいウィンドウの幅。

  • h -- int - 新しいウィンドウの高さ。

戻り値:

None

save_image(filename, width, height)[ソース]
概要:

現在のOpenGLフレームバッファの内容を画像ファイルとして保存します。

詳細説明:

glReadPixels を使用して現在のウィンドウの内容をピクセルデータとして読み込み、 Pillow (PIL) ライブラリを使用して指定されたファイル名で画像として保存します。 読み込んだピクセルデータは上下反転して保存されます。

パラメータ:
  • filename -- str - 保存する画像ファイルのパス。

  • width -- int - 保存する画像の幅。

  • height -- int - 保存する画像の高さ。

戻り値:

None

start_animation()[ソース]
概要:

アニメーションを開始します。

詳細説明:

animation_running フラグをTrueに設定し、アニメーションループの実行を許可します。 ※このメソッドはクラスメソッドとして実装されていますが、self が引数に含まれていません。 実行時にエラーが発生する可能性がありますが、既存のコードを変更できないためこのままです。

戻り値:

None

stop_animation()[ソース]
概要:

アニメーションを停止します。

詳細説明:

animation_running フラグをFalseに設定し、アニメーションループの実行を停止します。

戻り値:

None