gpt4 book ai didi

Swift-根据坐标和时间改变星图 View

转载 作者:行者123 更新时间:2023-11-28 08:24:59 28 4
gpt4 key购买 nike

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

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

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. 将相机节点更正到它正在看的地方

//让相机节点从看春分开始//

  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(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) }
  2. 下面是计算公转和自转的方法:

    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}}

任何人都可以给我一些建议以使其准确吗?提前致谢。

最佳答案

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

赤经/偏角是否正确?你怎么知道?

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

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

带评论的屏幕截图也会有所帮助。

关于Swift-根据坐标和时间改变星图 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40297809/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com