完善地图交互、动画与罗盘调试

This commit is contained in:
2026-03-26 16:58:53 +08:00
parent d695308a55
commit 5fc996dea1
18 changed files with 1566 additions and 165 deletions

View File

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