Sobes.tech
Middle+

Кейс: картада машинаның тегіс анимациясын жүзеге асыру керек. Телеметрия (ендік, бойлық, бұрыш) екі рет секундына келеді, машина координаттар бойынша секіріп тұрады. Сіз оны қалай жүзеге асырар едіңіз?

sobes.tech AI

AI-дан жауап

Картада машина қозғалысының тегіс анимациясы үшін телеметрияны секундына 2 рет жаңартқанда алынған координаттар мен бұрыштар арасында интерполяция қолдануға болады.

Негізгі идея:

  1. Жаңа деректерді (ендік, бойлық, бұрыш) алған кезде ағымдағы және жаңа мәндерді сақтаймыз.
  2. Анимацияны іске қосамыз, ол машина позициясы мен бұрышын ағымдағы мәндерден жаңа мәндерге біртіндеп өзгертеді, мысалы, 500 мс ішінде (деректер әр 500 мс сайын келеді).
  3. Интерполяция үшін сызықтық интерполяцияны (LERP) координаттар мен бұрышқа қолдануға болады.
  4. Анимацияны 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);
}

Осылайша, координаттар жаңартулар арасында машина тегіс қозғалып, бұрылып тұрады, «секірістерді» болдырмайды.