Spline apa yang paling umum Anda temui dalam pengembangan game?

11

Daftar di sini splines paling umum yang ditemukan dalam pengembangan game, berapa banyak poin yang dibutuhkan metode untuk menginterpolasi kurva, dan bagaimana Anda bisa membangun tipe data yang memungkinkan Anda untuk mendapatkan interpolasi dari poin kurva. Contoh: Kurva Bezier, B-Splines, Cubic Splines, dll.

PS: Saya menempatkan ini sebagai wiki komunitas sehingga kami dapat mendaftar semua jenis interpolasi spline.

chiguire
sumber
1
Itu pertanyaan yang bagus, IMO.
jacmoe
2
Saya memilih pertanyaan ini untuk diubah agar diterapkan ke interpolasi daripada interpolasi spline khusus. Inilah yang saya pikirkan tentang pertanyaan itu, jadi jawaban saya yang tidak pada tempatnya di bawah.
Ricket
Meskipun interpolasi bilinear Anda adalah jawaban yang baik, saya pikir perhitungan semacam ini bisa masuk dalam pertanyaan terkait, misalnya, kecocokan atau perkiraan spline. Atau mungkin saya salah dan ini juga bisa pergi ke sini.
chiguire

Jawaban:

4

Kasing paling sederhana adalah interpolasi linier untuk garis lurus:

(x0, y0) * ------------------------ * (x1, y1)

Say t adalah antara [0, 1]:

function lerp((x0, y0), (x1, y1), t):
    return (x0+(x1-x0)*t, y0+(y1-y0)*t)
chiguire
sumber
3

Catmull-Rom splines (sejenis cubic hermite spline) bisa sangat berguna, jika Anda memiliki sekumpulan titik yang ingin Anda buat jalur yang mulus di antara (tanpa menentukan titik kontrol tambahan), seperti jalur kamera

Untuk semua matematika, lihat:

http://en.wikipedia.org/wiki/Cubic_Hermite_spline

Jika Anda menggunakan D3DX, ada beberapa fungsi praktis untuk menghadapinya (D3DXVec3CatmullRom)

bluescrn
sumber
0

Sunting: Maaf, seperti yang ditunjukkan Jason dalam komentar, jawaban berikut bukan tentang splines tetapi tentang interpolasi linear dua dimensi (atau bilinear ). Saya memilih untuk tidak menghapusnya kalau-kalau ada yang menganggapnya informatif.


Saya telah membuat medan 3D sederhana dan kemudian ingin karakter saya berjalan melintasi medan. Jadi, untuk menemukan ketinggian karakter di titik mana pun di medan, saya menggunakan interpolasi bilinear .

Berikut adalah kode Java yang saya gunakan untuk interpolasi bilinear:

/**
 * Interpolates the value of a point in a two dimensional surface using bilinear spline interpolation.
 * The value is calculated using the position of the point and the values of the 4 surrounding points.
 * Note that the returned value can be more or less than any of the values of the surrounding points. 
 * 
 * @param p A 2x2 array containing the heights of the 4 surrounding points
 * @param x The horizontal position, between 0 and 1
 * @param y The vertical position, between 0 and 1
 * @return the interpolated height
 */
private static float bilinearInterpolate (float[][] p, float x, float y) {
    return p[0][0]*(1.0f-x)*(1.0f-y) + p[1][0]*x*(1.0f-y) + p[0][1]*(1.0f-x)*y + p[1][1]*x*y;
}

/**
 * Finds a 2-dimensional array of the heights of the four points that 
 * surround (x,y).
 *
 * Uses the member variable "verts", an 2D array of Vertex objects which have
 * a member "height" that is the specific vertex's height.
 */
private float[][] nearestFour(float x, float y) {
    int xf = (int) Math.floor(x);
    int yf = (int) Math.floor(y);

    if(xf < 0 || yf < 0 || xf > verts[0].length-2 || yf > verts.length-2) {
        // TODO do something better than just return 0s
        return new float[][]{
                {0.0f, 0.0f},
                {0.0f, 0.0f}
            };
    } else {
        return new float[][]{
                {verts[yf][xf].height, verts[yf][xf+1].height},
                {verts[yf+1][xf].height, verts[yf+1][xf+1].height},
            };
    }
}

Perhatikan bahwa interpolasi bikubik mungkin menghadirkan interpolasi yang lebih halus atau lebih realistis di seluruh titik yang jauh; tapi saya memilih untuk menggunakan bilinear karena saya memiliki grid yang padat, dalam upaya untuk mengoptimalkan (mungkin sebelum waktunya).

Ricket
sumber
Pertanyaannya adalah tentang interpolasi sepanjang spline
Jason Kozak
Maaf; pesan ditambahkan ke atas jawaban.
Ricket