完善地图交互、动画与罗盘调试
This commit is contained in:
@@ -5,7 +5,13 @@ export interface CompassHeadingControllerCallbacks {
|
||||
|
||||
type SensorSource = 'compass' | 'motion' | null
|
||||
|
||||
const ABSOLUTE_HEADING_CORRECTION = 0.44
|
||||
export type CompassTuningProfile = 'smooth' | 'balanced' | 'responsive'
|
||||
|
||||
const HEADING_CORRECTION_BY_PROFILE: Record<CompassTuningProfile, number> = {
|
||||
smooth: 0.3,
|
||||
balanced: 0.4,
|
||||
responsive: 0.54,
|
||||
}
|
||||
|
||||
function normalizeHeadingDeg(headingDeg: number): number {
|
||||
const normalized = headingDeg % 360
|
||||
@@ -41,6 +47,7 @@ export class CompassHeadingController {
|
||||
rollDeg: number | null
|
||||
motionReady: boolean
|
||||
compassReady: boolean
|
||||
tuningProfile: CompassTuningProfile
|
||||
|
||||
constructor(callbacks: CompassHeadingControllerCallbacks) {
|
||||
this.callbacks = callbacks
|
||||
@@ -53,6 +60,7 @@ export class CompassHeadingController {
|
||||
this.rollDeg = null
|
||||
this.motionReady = false
|
||||
this.compassReady = false
|
||||
this.tuningProfile = 'balanced'
|
||||
}
|
||||
|
||||
start(): void {
|
||||
@@ -99,6 +107,10 @@ export class CompassHeadingController {
|
||||
this.stop()
|
||||
}
|
||||
|
||||
setTuningProfile(profile: CompassTuningProfile): void {
|
||||
this.tuningProfile = profile
|
||||
}
|
||||
|
||||
startMotionSource(previousMessage: string): void {
|
||||
if (typeof wx.startDeviceMotionListening !== 'function' || typeof wx.onDeviceMotionChange !== 'function') {
|
||||
this.callbacks.onError(previousMessage)
|
||||
@@ -111,14 +123,13 @@ export class CompassHeadingController {
|
||||
}
|
||||
|
||||
this.pitchDeg = typeof result.beta === 'number' && !Number.isNaN(result.beta)
|
||||
? result.beta * 180 / Math.PI
|
||||
? result.beta
|
||||
: null
|
||||
this.rollDeg = typeof result.gamma === 'number' && !Number.isNaN(result.gamma)
|
||||
? result.gamma * 180 / Math.PI
|
||||
? result.gamma
|
||||
: null
|
||||
|
||||
const alphaDeg = result.alpha * 180 / Math.PI
|
||||
this.applyAbsoluteHeading(normalizeHeadingDeg(360 - alphaDeg), 'motion')
|
||||
this.applyAbsoluteHeading(normalizeHeadingDeg(360 - result.alpha), 'motion')
|
||||
}
|
||||
|
||||
this.motionCallback = callback
|
||||
@@ -163,10 +174,11 @@ export class CompassHeadingController {
|
||||
}
|
||||
|
||||
applyAbsoluteHeading(headingDeg: number, source: 'compass' | 'motion'): void {
|
||||
const headingCorrection = HEADING_CORRECTION_BY_PROFILE[this.tuningProfile]
|
||||
if (this.absoluteHeadingDeg === null) {
|
||||
this.absoluteHeadingDeg = headingDeg
|
||||
} else {
|
||||
this.absoluteHeadingDeg = interpolateHeadingDeg(this.absoluteHeadingDeg, headingDeg, ABSOLUTE_HEADING_CORRECTION)
|
||||
this.absoluteHeadingDeg = interpolateHeadingDeg(this.absoluteHeadingDeg, headingDeg, headingCorrection)
|
||||
}
|
||||
|
||||
this.source = source
|
||||
@@ -200,5 +212,3 @@ export class CompassHeadingController {
|
||||
this.compassCallback = null
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user