夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

ヒッパルコス星表とBlenderでの使用方法 その③CSVデータからオブジェクトの配置

本日は昨日に引き続きBlenderPython枠です。

昨日はヒッパルコス星表のCSVBlenderで読み込むことを行いました。

〇環境

・Windows11PC

・Blender4.1

ヒッパルコス星表記載の星の座標の定義

星の計算についてはその①でも触れています。

redhologerbera.hatenablog.com

Blenderなどで春分点から東に0.22秒、天の赤道から北に1度5分20.4秒離れた位置にある天体を配置するということを行う際は赤経赤緯を曲面座標系に変換する必要があります。

この際に曲面座標系で、半径r、仰角Θ=赤緯、方位角φ=赤系のパラメータであらわされます。

まずは度数法に変換します。赤経の0.22秒を度数法に変換します。

0.22×13600度/秒=0.00006110.22 \text{秒} \times \frac{1}{3600} \text{度/秒} = 0.0000611 \text{度}

童謡に赤緯も度数法で変換します。

1+5×160度/分+20.4×13600度/秒=1.0891 \text{度} + 5 \text{分} \times \frac{1}{60} \text{度/分} + 20.4 \text{秒} \times \frac{1}{3600} \text{度/秒} = 1.089 \text{度}

次に曲面座標系に変換するためにはラジアンに変換します。

ラジアンは度×π/180のため、次のように計算します。

0.0000611×π180=0.00000107ラジアン0.0000611 \text{度} \times \frac{\pi}{180} = 0.00000107 \text{ラジアン}

1.089×π180=0.019ラジアン1.089 \text{度} \times \frac{\pi}{180} = 0.019 \text{ラジアン}

以上から半径rとしたXYZの極座標変換を行います。

r×cos(赤緯)×cos(赤経)=r×cos(0.019)×cos(0.00000107)r \times \cos(\text{赤緯}) \times \cos(\text{赤経}) = r \times \cos(0.019) \times \cos(0.00000107)

r×cos(赤緯)×sin(赤経)=r×cos(0.019)×sin(0.00000107)r \times \cos(\text{赤緯}) \times \sin(\text{赤経}) = r \times \cos(0.019) \times \sin(0.00000107)

r×sin(赤緯)=r×sin(0.019)r \times \sin(\text{赤緯}) = r \times \sin(0.019)

これが星の座標になります。今回はこの計算式をBlenderで実装します。

CSVで読み取ったデータをもとに座標計算を行う

上記の計算方法からBlenderで座標を計算し星を配置するコードは次のようになります。

import bpy
import csv
import math

# CSVファイルのパス
csv_file_path = "C:hip_lite_a.csv"

# CSVファイルを開きます。
with open(csv_file_path, newline='') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        # 赤経と赤緯を度数法に変換
        ra_deg = float(row[3]) * 1/3600
        dec_deg = float(row[4]) + float(row[5]) * 1/60 + float(row[6]) * 1/3600

        # 度数法をラジアンに変換
        ra_rad = ra_deg * math.pi / 180
        dec_rad = dec_deg * math.pi / 180

        # 半径
        r = 1

        # 極座標系に変換
        x = r * math.cos(dec_rad) * math.cos(ra_rad)
        y = r * math.cos(dec_rad) * math.sin(ra_rad)
        z = r * math.sin(dec_rad)

        # 星を配置
        bpy.ops.mesh.primitive_uv_sphere_add(location=(x, y, z))

このコードではCSVデータに基づき座標計算と球の作成、配置を行っています。

問題点としてはデータ量に対してオブジェクトを生成するため、数万のデータを作成するときにBlenderが落ちてしまうことです。 次はこの問題を解消したいと思います。

本日は以上です。