⭐️ARKitでプラネタリウムを作りたい(1)


タイトル通りARkitでプラネタリウムが作りたくなったので作ってみる
(1)では星の座標計算の準備までを作っていく

  • 計算に必要なもの
    • 星のデータ
    • 現在地座標
    • 時刻

星のデータ

  • 星はめっちゃあるので今回は1等星に絞る
    • 一等星21個 + ヘッダーの22行
  • 欲しい要素は↓
    • 番号:一意の番号
    • 名前:星の名前(多分英語)
    • 視等級:明るいほど小さい(地球から見たときの明るさ)
    • 赤経:天体の位置(時分秒で表される)
    • 赤緯:天体の位置(+90 ~ -90)
  • 星表はヒッパルコス星表を使用した
StarData.csv
hip_number,name,right_ascension,declination,visual_magnitude
32349,Sirius,6.4509,-16.4247,-1.44
30438,Canopus,6.2357,-52.4144,-0.62
69673,Arcturus,14.1540,19.1114,-0.05
71683,Rigil Kent,14.3940,-60.5006,-0.01
91262,Vega,18.3656,38.4658,0.03
24608,Capella,5.1641,45.5956,0.08
24436,Rigel,5.1432,-08.1205,0.18
37279,Procyon,7.3918,5.1339,0.4
7588,Achernar,1.3742,-57.1411,0.45
27989,Betelgeuse,5.5510,7.2425,0.45
68702,Agena,14.0349,-60.2222,0.61
97649,Altair,19.5046,8.5202,0.76
60718,Acrux,12.2635,-63.0556,0.77
21421,Aldebaran,4.3555,16.3035,0.87
65474,Spica,13.2511,-11.0940,0.98
80763,Antares,16.2924,-26.2555,1.06
37826,Pollux,7.4519,28.0134,1.16
113368,Fomalhaut,22.5738,-29.3718,1.17
62434,Becrux,12.4743,-59.4119,1.25
102098,Deneb,20.4125,45.1649,1.25
49669,Regulus,10.0822,11.5801,1.36

csvファイルを読み込み

用意したcsvファイルを取得して、使いやすいように整形(配列に格納)していく

ViewController.swift
// cavファイル読み込み
var csvArray = [String]()
guard let csvPath = Bundle.main.path(forResource: "StarData", ofType: "csv") else {
    return
}
do {
    let csvString = try String(contentsOfFile: csvPath, encoding: String.Encoding.utf8)
    csvArray = csvString.components(separatedBy: "\n")
    // 最後の改行を削除
    csvArray.removeLast()
} catch _ as NSError {
    return
}

for star in csvArray {
    let starDetail = star.components(separatedBy: ",")
    print("HIP番号: \(starDetail[0])\n名前: \(starDetail[1])\n赤経: \(starDetail[2])\n赤緯: \(starDetail[3])\n視等級: \(starDatail[4])\n")
}

これで星の方の準備は完了

現在地取得

星の位置は地球のどこにいるかで変わるので、のちの計算のために取得

Core Locationを使用

ほぼコピペなので割愛

時刻取得

星はの位置は時刻によって変わr(略

VierController.swift
// 時刻を取得
let date = Date()
let format = DateFormatter()
format.dateFormat = "yyyy,MM,dd,HH,mm,ss"
format.timeZone   = TimeZone(identifier: "Asia/Tokyo")
let currentTime = format.string(from: date).split(separator: ",")

print("現在時刻: \(currentTime[0])/\(currentTime[1])/\(currentTime[2]) \(currentTime[3]):\(currentTime[4]):\(currentTime[5])")
現在時刻: 2019/09/09 02:11:58

値が準備できたので計算処理を作る(次回)