我正在想办法根据用户的时间和坐标来修正我的星图视图,但是它不是很精确,所以我想知道哪一部分是错误的。
我有两个节点,星图节点和相机节点,相机节点在星图节点内,使其看起来像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
}
将摄影机节点更正为它所看到的位置
//让摄影机节点从看春分开始//
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))
}
根据用户的时间和坐标修正星图
KYMAP的函数校正(旋转:浮点,旋转:浮点,纬度:浮点)->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()->浮点{
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}}
有人能给我一些建议,让我准确地说出来吗?提前谢谢。
最佳答案
缩小你的错误。有太多的事情可能是错误的,任何人都无法检查。
RA/偏角正确吗?你怎么知道的?
对于给定的RA/decl,你的恒星出现在外球面的正确点上吗?你怎么知道的?
查看https://stackoverflow.com/help/mcve并发布一个与Playground兼容的代码片段,我们可以运行该代码片段并重现您的错误。
有评论的截图也会有帮助。