java实现星图的输出,根据坐标和时间快速更改星图视图

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

我有两个节点,星图节点和摄像机节点,摄像机节点在星图节点内,使其像 360 视图。这是我的方式:

1.get 加速度数据

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

}

将摄像机节点更正到它正在查看的位置

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

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

}

根据用户的时间和坐标校正星图(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) }

以下是计算旋转和旋转的方法:

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

有人能给我一些准确的建议吗?提前致谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值