Dapatkan poin pada garis antara dua poin

9

Saya membuat game luar angkasa sederhana dalam JavaScript, tapi sekarang saya sudah menabrak vektor.

Tampilan game top-down pada grid 2d. Ketika pengguna mengklik pada grid, kapal ruang angkasa akan terbang ke tempat itu.

Jadi, jika saya memiliki dua set poin:

{ x : 100.2, y : 100.6 }; // the ship
{ x : 20.5,  y : 55.95 }; // the clicked coordinates

Jika loop game berdetak pada 60 iterasi per detik, dan kecepatan kapal yang diinginkan adalah 0,05 poin per tick (3 poin per detik), bagaimana cara menghitung set koordinat baru untuk kapal untuk setiap centang dari loop game?

ps Saya tidak ingin menghitung inersia, atau beberapa vektor yang mempengaruhi kapal, saya hanya ingin kapal menghentikan apa pun yang dilakukannya (yaitu terbang satu arah) dan pindah ke koordinat yang diklik dengan kecepatan statis.

Stephen
sumber

Jawaban:

8

Dalam Pseudocode:

speed_per_tick = 0.05
delta_x = x_goal - x_current
delta_y = y_goal - y_current
goal_dist = sqrt( (delta_x * delta_x) + (delta_y * delta_y) )
if (dist > speed_per_tick)
{
    ratio = speed_per_tick / goal_dist
    x_move = ratio * delta_x  
    y_move = ratio * delta_y
    new_x_pos = x_move + x_current  
    new_y_pos = y_move + y_current
}
else
{
    new_x_pos = x_goal 
    new_y_pos = y_goal
}
Tristan
sumber
@Tristan: Do you mean goal_distdi Anda ifkondisi?
Nate W.
21

LERP - Interpolasi Linier

Saya memberikan jawaban ini untuk masalah yang sama beberapa hari yang lalu, tetapi di sini kita mulai:

Interpolasi Linear adalah fungsi yang memberi Anda angka di antara dua angka, berdasarkan progresnya. Anda sebenarnya bisa, mendapatkan poin antara dua poin.


The Great Formula - Cara menghitungnya

Formula LERP umum diberikan oleh pu = p0 + (p1 - p0) * u. Dimana:

  • pu: Jumlah hasilnya
  • p0: Angka awal
  • p1: Angka terakhir
  • u: Kemajuan. Itu diberikan dalam persentase, antara 0 dan 1.

Cara mendapatkan persentase

Anda mungkin bertanya-tanya, "Bagaimana saya bisa mendapatkan persentase ini !?" Jangan khawatir. Seperti ini: Berapa banyak waktu yang dibutuhkan untuk melakukan perjalanan untuk memulai vektor untuk menyelesaikan? Oke, bagi dengan waktu yang sudah berlalu. Ini akan memberi Anda persentase.

Lihat, seperti ini: percentage = currentTime / finalTime;


Menghitung Vektor

Untuk mendapatkan vektor yang dihasilkan, yang perlu Anda lakukan adalah menerapkan rumus dua kali, satu untuk komponen X dan satu untuk komponen Y. Sesuatu seperti ini:

point.x = start.x + (final.x - start.x) * progress;
point.y = start.y + (final.y - start.y) * progress;

Menghitung waktu variasi

Anda mungkin ingin memiliki poin Anda untuk bepergian dengan kecepatan 0,5 poin, ya? Jadi katakanlah, jarak yang lebih jauh akan ditempuh dalam waktu yang lebih lama.

Anda dapat melakukannya sebagai berikut:

  • Dapatkan jarak panjang Untuk itu, Anda akan membutuhkan dua hal. Dapatkan vektor jarak, lalu ubah dalam nilai panjang.

    distancevec = final - start;
    distance = distancevec.length();

Saya harap Anda tahu vektor matematika. Jika tidak, Anda dapat menghitung panjang vektor dengan rumus ini d = sqrt(pow(v.x, 2) + pow(v.y, 2));.

  • Dapatkan waktu yang dibutuhkan dan perbarui waktu akhir. Yang ini mudah. Karena Anda ingin setiap kutu Anda mendapatkan panjang 0,5, kita hanya perlu membagi dan mendapatkan berapa banyak kutu yang kita dapatkan.

    finalTime = distance / 0.5f;

Selesai

PEMBERITAHUAN: Mungkin, ini mungkin bukan kecepatan yang dimaksudkan untuk Anda, tetapi ini adalah haknya. sehingga Anda memiliki gerakan linier, bahkan pada gerakan diagonal. Jika Anda ingin melakukan x + = 0,5f, y + = 0,5f, maka baca buku matematika vektor dan periksa kembali rencana Anda.

Gustavo Maciel
sumber
Bagaimana jika Anda ingin% pergi ke tujuan dari posisi Anda? JIKA Anda tidak dapat menggunakan waktu delta melainkan x: y berkoordinasi.
Dave
Jika Anda menghitung progresssebagaimana dinyatakan dalam jawaban ini, itu harus dalam 0..1kisaran. Lakukan saja:progressLeft = 1.0 - progress;
Gustavo Maciel
3

Ini dapat dilakukan dengan menghitung normal arah dan kemudian menghitung posisi saat ini melalui persamaan parametrik

newPoint = startPoint + directionVector * velocity * t

Di mana t adalah waktu yang berlalu sejak kapal mulai bepergian ke arah yang diinginkan. Anda juga dapat melakukan ini per pembaruan melalui

newPoint = currentPoint + directionVector * velocity * timeDelta

Dan Anda hanya menghitung ini di setiap frame / fisika / dll. memperbarui hingga kapal mencapai tujuannya.

hatboyzero
sumber