Які найпоширеніші сплайни ви знайдете в розробці ігор?


11

Перерахуйте тут найпоширеніші сплайни, знайдені в розробці гри, скільки точок потрібно методу для інтерполяції кривої та як можна побудувати тип даних, що дозволяє отримати інтерполяцію точок кривої. Приклади: криві Безьє, B-сплайни, кубічні сплайни тощо

PS: Я ставлю це як вікі спільноти, щоб ми могли перелічити всі види інтерполяції сплайну.


1
Це гарне запитання, ІМО.
jacmoe

2
Я голосую за те, щоб це питання було змінено, щоб застосувати до інтерполяції, а не конкретно сплайнованої інтерполяції. Це те, про що я думав, про що йдеться, таким чином, моя відповідь поза місцем нижче.
Ricket

Хоча ваша білінеарна інтерполяція є гарною відповіддю, я думаю, що такі обчислення можуть входити у відповідне запитання, наприклад, шлейф або приближення. А може я помиляюся, і вони також можуть сюди піти.
chiguire

Відповіді:


4

Найпростіший випадок - це лінійна інтерполяція для прямої:

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

Скажімо, t знаходиться між [0, 1]:

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

3

Шпаги Catmull-Rom (тип кубічного сплаву гермітів) можуть бути дуже корисними, якщо у вас є набір точок, які ви хочете створити плавний шлях між (без визначення додаткових контрольних точок), наприклад, шляхи камери

Про всю математику див .:

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

Якщо ви використовуєте D3DX, є деякі зручні функції для поводження з ними (D3DXVec3CatmullRom)


0

Редагувати: Вибачте, як в коментарі вказує Джейсон, наступна відповідь стосується не сплайнів, а двовимірної лінійної (або білінеарної ) інтерполяції. Я вибираю не видаляти його на випадок, якщо хтось може вважати його інформативним.


Я створив просту 3D-місцевість, а потім хотів, щоб мій персонаж ходив по місцевості. Отже, щоб знайти висоту персонажа в будь-якій точці місцевості, я використовував білінеарну інтерполяцію .

Ось код Java, який я використовую для білінеарної інтерполяції:

/**
 * 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},
            };
    }
}

Зауважте, бикубическая інтерполяція може представляти плавнішу або реалістичнішу інтерполяцію через віддалені точки; але я вирішу перейти з білінеарною, оскільки у мене щільна сітка, намагаючись оптимізувати (можливо, передчасно).


Питання про інтерполяцію вздовж сплайну
Джейсон Козак

Вибачте; повідомлення додано до верхньої частини відповіді.
Ricket
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.