342 地球表面の天球儀 作業部屋 (1)pic2023

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で動く完全なアドオンコードまで作れます。