Middle+
Кейс: картада машинаның тегіс анимациясын жүзеге асыру керек. Телеметрия (ендік, бойлық, бұрыш) екі рет секундына келеді, машина координаттар бойынша секіріп тұрады. Сіз оны қалай жүзеге асырар едіңіз?
sobes.tech AI
AI-дан жауап
Картада машина қозғалысының тегіс анимациясы үшін телеметрияны секундына 2 рет жаңартқанда алынған координаттар мен бұрыштар арасында интерполяция қолдануға болады.
Негізгі идея:
- Жаңа деректерді (ендік, бойлық, бұрыш) алған кезде ағымдағы және жаңа мәндерді сақтаймыз.
- Анимацияны іске қосамыз, ол машина позициясы мен бұрышын ағымдағы мәндерден жаңа мәндерге біртіндеп өзгертеді, мысалы, 500 мс ішінде (деректер әр 500 мс сайын келеді).
- Интерполяция үшін сызықтық интерполяцияны (LERP) координаттар мен бұрышқа қолдануға болады.
- Анимацияны
requestAnimationFrameкөмегімен жүзеге асыруға болады, ол тегіс қозғалыс үшін.
JavaScript мысалы (Leaflet немесе ұқсас кітапхана қолдана отырып):
let currentPos = {lat: 0, lng: 0, angle: 0};
let targetPos = {lat: 0, lng: 0, angle: 0};
let animationStart = null;
const animationDuration = 500; // мс
function lerp(start, end, t) {
return start + (end - start) * t;
}
function animate(timestamp) {
if (!animationStart) animationStart = timestamp;
const progress = Math.min((timestamp - animationStart) / animationDuration, 1);
const lat = lerp(currentPos.lat, targetPos.lat, progress);
const lng = lerp(currentPos.lng, targetPos.lng, progress);
const angle = lerp(currentPos.angle, targetPos.angle, progress);
// Машинаның картадағы позициясы мен бұрышын жаңарту
updateCarOnMap(lat, lng, angle);
if (progress < 1) {
requestAnimationFrame(animate);
} else {
currentPos = {...targetPos};
animationStart = null;
}
}
function onTelemetryReceived(newLat, newLng, newAngle) {
targetPos = {lat: newLat, lng: newLng, angle: newAngle};
animationStart = null;
requestAnimationFrame(animate);
}
Осылайша, координаттар жаңартулар арасында машина тегіс қозғалып, бұрылып тұрады, «секірістерді» болдырмайды.