根据坐标和时间更改星图视图

问题描述 投票:0回答:1

我正在尝试找出根据用户的时间和坐标来纠正我的星图视图的方法,但它并不是很准确,所以我想知道哪一部分是错误的。

我有两个节点,星图节点和相机节点,相机节点位于星图节点内部,使其像 360 度视图。 这是我的制作方法:

  1. 获取加速度数据

    motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: {(accelerometerData, error) -> Void in
    
     self.outputAccelerationData(accelerometerData!.acceleration)
    
     if(error != nil) {
         print("\(error)")
     }
    })
    
    func outputAccelerationData(acceleration: CMAcceleration) {
    
     let accZ: Double = fabs(acceleration.z)
     rotateDegreeCameraX = acos(accZ) * 180 / M_PI
    
    }
    
  2. 将相机节点纠正到它所看到的位置

    // let the camera node start from looking at vernal equinox //
    
    
    
    private func orientationFromCMQuaternion(attitudeQuaternion: CMQuaternion, trueHeading: Float) -> SCNVector4 { 
     let gq1 = GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(Float(rotateDegreeCameraX) - 90), 1, 0, 0)
     let gq2 = GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(180), 0, 0, 1)
     let gq3 = GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(trueHeading), 0, 0, 1)       
     let gq4 = GLKQuaternionMake(Float(attitudeQuaternion.x), Float(attitudeQuaternion.y), Float(attitudeQuaternion.z), Float(attitudeQuaternion.w))
    
     let qp = GLKQuaternionMultiply(gq1, gq2)
     let qp2 = GLKQuaternionMultiply(qp, gq3)
     let qp3 = GLKQuaternionMultiply(qp2, gq4)
     let rq = CMQuaternion(x: Double(qp3.x), y: Double(qp3.y), z: Double(qp3.z), w: Double(qp3.w))
     return SCNVector4Make(Float(rq.x), Float(rq.y), Float(rq.z), Float(rq.w))
    }
    
  3. 根据用户的时间和坐标修正星图(SCNshpere)

    func correctOfSkyMap(revolution: Float, rotation: Float, latitude: Float) -> SCNVector4  {
    
      // rotate the sphere, making Equatorial plane is now same position with Ecliptic plane. (degrees: 23.4397) //
      let gq = GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(-23.4397), 0, 0, 1)
    
      // rotate the sphere according to the gap between current date and the date vernal equinox pass 0 longitude //
      let gq2 = GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(-revolution), 0, 1, 0)
      let qp = GLKQuaternionMultiply(gq, gq2)
    
      // rotate sphere back to where Equatorial plane is //
      let gq3 = GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(-23.4397), 0, 0, 1)
      let qp2 = GLKQuaternionMultiply(qp, gq3)
    
      // rotate the sphere according to current time //
      let gq4 = GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(-rotation), 0, 1, 0)
      let qp3 = GLKQuaternionMultiply(qp2, gq4)
    
      // rotate sphere according to user's latitude (adjust the degree of polaris) //
      let gq5 = GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(latitude - 90), 1, 0, 0)
      let qp4 = GLKQuaternionMultiply(qp3, gq5)
    
      // after comparing with other star gazing app, finding the map needs to rotate 90 degrees to make it more accurate. //
      let gq6 = GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(90), 0, 0, 1)
      let qp5 = GLKQuaternionMultiply(qp4, gq6)
    
      return SCNVector4Make(qp5.x, qp5.y, qp5.z, qp5.w)   }
    
  4. 以下是计算公转和自转的方法:

    func calculateRevolution() -> Float  {
    
     let degreePerDay: Double = 0.9656112744
     let originalDate = NSDate()
     let dateFormatter = NSDateFormatter()
     dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"
     dateFormatter.timeZone = NSTimeZone(abbreviation: "UTC")
     let currentDateStr = dateFormatter.stringFromDate(originalDate)
     if let currentDate = dateFormatter.dateFromString(currentDateStr),
         let vernalEquinox = dateFormatter.dateFromString("2016-03-20 04:30") {
    
         let currentDateInSecs = currentDate.timeIntervalSinceDate(vernalEquinox)
         let currentDateInDays = currentDateInSecs / (60 * 60 * 24)
         let rotateDegreesDouble = currentDateInDays * degreePerDay
         let rotateDegrees = Float(rotateDegreesDouble)
    
         return rotateDegrees
    
     } else { return 0.0 }}
    
    
    
    func calculateEarthRotation() -> Float {
    
     let degreePerMinute: Double = 0.25
     let originalDate = NSDate()
     let dateFormatter = NSDateFormatter()
     dateFormatter.timeZone = NSTimeZone(abbreviation: "UTC")
     dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"
     let originalDateStr = dateFormatter.stringFromDate(originalDate)
     if let currentDate = dateFormatter.dateFromString(originalDateStr) {
         let calendar = NSCalendar.currentCalendar()
         let hours = Double(calendar.component(.Hour, fromDate: currentDate))
         let minutes = Double(calendar.component(.Minute, fromDate: currentDate))
    
         print("pass time: \(hours * 60 + minutes)")
         print("Local date: \(originalDate)")
         print("Date in UTC: \(currentDate)")
    
         return Float((hours * 60 + minutes) * degreePerMinute)
    
     } else {return 0.0}}
    

有人可以给我一些建议以使其准确吗?

swift scenekit astronomy
1个回答
0
投票

缩小错误范围。有太多的事情可能是错误的,任何人都无法检查。

赤纬/赤纬是否正确?你怎么知道?

对于给定的赤经/赤经,您的恒星是否出现在外球体的正确位置?你怎么知道?

© www.soinside.com 2019 - 2024. All rights reserved.