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

时间:2016-10-28 03:56:18

标签: swift scenekit astronomy

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

我有两个节点,星图节点和摄像机节点,摄像机节点位于星图节点内,使其像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

}
  1. 将相机节点更正为其正在查看的位置
  2. //让摄影机节点从查看春分点开始//

      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))
    }
    
    1. 根据用户的时间和坐标

      更正星图(SCNshpere)

      func correctOfSkyMap(革命:浮动,旋转:浮动,纬度:浮动) - > 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)   }
      
    2. 以下是计算旋转和旋转的方法:

      func calculateRevolution() - >浮动{

      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() - >浮动{

      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}}
      
    3. 有人能给我一些准确的建议吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

缩小您的错误。有太多东西可能是错误的,任何人都无法检查。

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

对于给定的RA / decl,您的恒星是否出现在外球体上的正确点上?你怎么知道的?

查看https://stackoverflow.com/help/mcve并发布我们可以运行的Playground兼容代码段并重现您的错误。

评论的截图也有帮助。