https://chatgpt.com/share/6a88cdcb-32cc-83ee-9f44-87ca9c767405
はい。先ほどの**「地球表面上の一点Pに立ち、自分Pを中心として半径5の天球をイメージする」モデル**を、添付いただいたBlender 5.0対応アドオンの構成・設計思想を参考にして、**Blender 5以降のアドオンを生成させるための指示プロンプト**にまとめます。
添付コードは `blender: (5, 0, 0)` を明示し、PropertyGroup、Operator、VIEW_3Dパネル、リアルタイム更新、設定値のコード書き出しまで含む構成になっています。 また、球体・観測点・表示設定をプロパティで操作する方式が参考になります。
### Blender 5以降用・アドオン作成指示プロンプト
```text
あなたは Blender 5.0以降対応のPythonアドオン開発者です。
以下の幾何学モデルを、Blender上で正確に3D可視化する完全なアドオンを作成してください。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【基本モデル】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
地球儀の中心を O とする。
地球の半径を R = 5 とする。
地球表面上の一点を P とする。
P は赤道円周上の一点とする。
観測者は P に立っているものとし、
観測者自身は「大きさを持たない数学的な点」として扱う。
したがって、
|OP| = 5
である。
さらに、観測者P自身を中心として、
半径5の仮想的な「天球」を構築する。
つまり、
地球:中心 O、半径 5
観測者:点 P
天球:中心 P、半径 5
という2つの球を同時に3D空間へ配置する。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【重要な座標設定】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
座標系を以下のように固定する。
Blender座標:
X軸 = 赤道方向
Y軸 = 赤道方向
Z軸 = 地球の自転軸方向
地球中心:
O = (0, 0, 0)
地球半径:
R = 5
観測者Pは赤道上に置く。
初期位置:
P = (5, 0, 0)
したがって、
|OP| = 5
となる。
観測者Pは数学的な点として扱い、
実体のある球体にはしない。
ただしBlender上で位置を視認できるように、
小さなマーカーを表示する。
マーカーの大きさは、
「観測者そのものの大きさ」ではなく、
単なる表示用マーカーであることを明確にする。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【天球】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
観測者Pを中心に半径5の球を生成する。
天球:
center = P
radius = 5
したがって初期状態では、
天球中心 = (5, 0, 0)
天球半径 = 5
とする。
地球と天球は別オブジェクトとして管理する。
天球は透明または半透明表示にする。
地球表面と天球の位置関係を視覚的に確認できるようにする。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【星々】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
天球表面上に複数の星を配置する。
星は、
|S_i - P| = 5
を満たす位置に配置する。
つまり、星はすべて観測者Pを中心とした半径5の天球上に存在する。
最低でも以下を実装する。
・星の個数
・星の大きさ
・星の表示/非表示
・星のランダム配置
・星の固定配置
・星の色
・星の輝度
ランダム配置の場合も必ず球面上に均一に配置する。
単純なXYZランダムではなく、
球面分布として適切に配置すること。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【星の重要な意味】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
このアドオンでは、
星そのものの物理的大きさや実際の距離を再現するのではない。
これは「観測者Pを中心とした天球」という幾何学モデルを可視化するためのもの。
したがって、
地球中心 O を基準にした球
と
観測者 P を基準にした球
を明確に区別する。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【カメラ】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
カメラを観測者P付近に配置する。
カメラ位置はPを基準として設定できるようにする。
重要:
観測者Pから星を見る視点を用意する。
つまり、
「地球上の一点Pに立って夜空を見る」
という視覚状態を再現する。
さらに、
・観測者視点
・全体視点
・地球中心視点
・天球全体視点
を切り替えられるようにする。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【地球】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
地球は半径5のUV Sphereとして生成する。
中心:
(0,0,0)
半径:
5
地球は完全な透明ではなく、
内部構造と観測者位置を確認できる表示方法を採用する。
必要に応じて、
・半透明
・ワイヤーフレーム
・通常表示
を切り替えられるようにする。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【赤道】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
地球の赤道を明示的に表示する。
赤道は、
Z = 0
の円として表示する。
観測者Pは必ず赤道上に存在する。
観測者位置を変更する場合も、
赤道上を移動するモードを用意する。
例えば経度θを使用して、
P = (5 cosθ, 5 sinθ, 0)
とする。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【観測者位置】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
UIから観測者Pの位置を変更できるようにする。
最低限、
・経度
・赤道上移動
・P座標表示
を用意する。
経度を変更すると、
P = (R cosθ, R sinθ, 0)
に従って観測者Pと天球全体が移動する。
重要:
天球の中心は常に観測者P。
したがって観測者を移動した場合、
天球中心 = P
を必ず維持する。
天球半径は5を維持する。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【地球と天球の関係】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
このアドオンの最重要部分。
地球中心:
O = (0,0,0)
観測者:
P
地球:
|X-O| = 5
天球:
|X-P| = 5
という2つの球面を同時に扱う。
UIにも、
「地球中心 O」
「観測者 P」
「天球中心 P」
「地球半径」
「天球半径」
を数値表示する。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【視覚化】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
以下の補助表示を作成する。
1. 地球中心Oのマーカー
2. 観測者Pのマーカー
3. O-Pを結ぶ線
4. O-P間距離を示す寸法表示
5. 天球中心Pのマーカー
6. 天球半径5を示す線
7. 星からPへの視線
8. 赤道円
9. 地球の自転軸
10. XYZ軸
特に、
O → P = 5
P → 星 = 5
を視覚的に確認できるようにする。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【UI】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Blender 5.0以降のVIEW_3Dサイドバーに専用タブを作る。
タブ名:
「Observer Sky」
UIは以下のように整理する。
■ Earth
・地球半径
・地球表示
・透明度
・赤道表示
■ Observer
・経度
・P座標
・観測者マーカー表示
■ Celestial Sphere
・天球半径
・天球表示
・透明度
■ Stars
・星の数
・星の大きさ
・星の色
・星の輝度
・ランダム配置
・星を再生成
■ Camera
・観測者視点
・全体視点
・地球中心視点
・天球視点
■ Visualization
・O-P線
・P-Star線
・距離表示
・座標軸
・赤道
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【リアルタイム更新】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
UIの数値を変更したら、
可能な限りリアルタイムで3D表示を更新する。
例えば、
地球半径を変更
↓
Pの位置を再計算
↓
天球中心Pを再計算
↓
星の位置を再計算
↓
補助線を更新
という流れにする。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【アドオン構造】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Blender 5.0以降で動作する完全な.pyファイルを作る。
bl_infoには、
"blender": (5, 0, 0)
を設定する。
PropertyGroup
Operator
Panel
register()
unregister()
を適切に実装する。
名前衝突を避けるため、
すべての内部名に専用PREFIXを付ける。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【安全な再生成】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
「生成」ボタンを押した場合、
以前生成したオブジェクトを安全に識別して更新する。
同じオブジェクトが無限に増殖しないようにする。
専用Collectionを作り、
ObserverSky_Collection
などの専用コレクションにすべての生成物を入れる。
再生成時には既存オブジェクトを再利用するか、
安全に削除して再生成する。
ユーザーが作成した他のBlenderオブジェクトには絶対に影響を与えない。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【Blender 5対応】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Blender 5.0以降のAPIを前提にする。
古いBlender APIを安易に使用しない。
特にマテリアル、
透明表示、
Geometry、
Modifier、
View Layer、
Operator、
PropertyGroup
についてBlender 5.xで動作するコードを書く。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【エラー対策】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
以下を徹底する。
・NameErrorを発生させない
・AttributeErrorを発生させない
・register/unregisterを安全にする
・再読み込みに対応する
・既存オブジェクト名の衝突を避ける
・存在しないオブジェクトを参照しない
・UI描画中にエラーを出さない
・Blender Text Editorから実行しても動作する
・外部.pyアドオンとしてインストールしても動作する
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【設定値の書き出し】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
参考コードと同様に、
現在のUI設定値を初期値としてコードへ書き出せる機能を実装する。
「現在設定を初期値としてコード書き出し」
ボタンを作る。
現在値を取得し、
Blender Text Editorに完全なPythonコードを書き出す。
書き出す前にcompile()による構文チェックを行う。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【コード出力に関する重要条件】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
最終回答では省略コードを絶対に出さない。
必ず、
・bl_info
・import
・定数
・PropertyGroup
・マテリアル
・メッシュ生成
・星生成
・天球生成
・地球生成
・観測者位置計算
・補助線
・カメラ
・Operators
・UI Panels
・register()
・unregister()
を含む完全なコードを提示する。
「以下省略」
「同様」
「ここに追加」
などは禁止。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【数学的整合性】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
コード中では必ず以下を満たす。
地球:
|O-P| = R
観測者P:
P = (R cosθ, R sinθ, 0)
天球:
center = P
radius = R_sky
星S:
|S-P| = R_sky
初期値:
R = 5
R_sky = 5
θ = 0
したがって初期状態:
O = (0,0,0)
P = (5,0,0)
となる。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【最終目的】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
最終的にBlender上で、
「半径5の地球の赤道上の一点Pに自分が立ち、
自分Pを中心として半径5の天球を想像し、
その天球上に星々が存在している」
という幾何学モデルを、
直感的かつ正確に観察できるアドオンにする。
特に重要なのは、
「地球の中心O」と
「観測者Pを中心とする天球」
を混同しないことである。
この2つの中心が異なることを、
3D表示によって明確に理解できるように設計する。
最後に、完成したコードについて、
Blender 5.0以降での実行手順と、
UI各項目の使い方も日本語で説明する。
このプロンプトなら、添付された既存アドオンの**「設定値をUIから変更→リアルタイム反映→現在設定をコード化」**という構造も引き継ぎつつ、今回の「O=地球中心、P=観測者中心、P中心の半径5天球」を明確に指定できます。
次に、このプロンプトを使って実際にBlender 5.xで動く完全なアドオンコードまで作れます。