Các spline phổ biến nhất bạn sẽ tìm thấy trong phát triển trò chơi là gì?


11

Liệt kê ở đây các spline phổ biến nhất được tìm thấy trong phát triển trò chơi, phương pháp cần bao nhiêu điểm để nội suy một đường cong và làm thế nào bạn có thể xây dựng một kiểu dữ liệu cho phép bạn có được phép nội suy các điểm đường cong. Ví dụ: Đường cong Bezier, B-Splines, Splines, v.v.

PS: Tôi đang đặt nó như một wiki cộng đồng để chúng tôi có thể liệt kê tất cả các loại nội suy spline.


1
Đó là một câu hỏi hay, IMO.
jacmoe

2
Tôi bỏ phiếu cho câu hỏi này sẽ được thay đổi để áp dụng cho phép nội suy thay vì nội suy spline cụ thể. Đây là những gì tôi nghĩ rằng câu hỏi là về, do đó, câu trả lời không đúng chỗ của tôi dưới đây.
Ricket

Mặc dù phép nội suy song tuyến tính của bạn là một câu trả lời tốt, tôi nghĩ rằng các loại tính toán này có thể đi vào một câu hỏi liên quan, ví dụ, một phép nối spline hoặc xấp xỉ. Hoặc có thể tôi sai và những điều này cũng có thể đi đến đây.
chiguire

Câu trả lời:


4

Trường hợp đơn giản nhất là phép nội suy tuyến tính cho một đường thẳng:

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

Nói t nằm trong khoảng [0, 1]:

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

3

Các spline Catmull-Rom (một loại spline hermite hình khối) có thể khá hữu ích, nếu bạn có một tập hợp các điểm mà bạn muốn tạo một đường dẫn trơn tru giữa (mà không xác định bất kỳ điểm kiểm soát bổ sung nào), chẳng hạn như đường dẫn camera

Đối với tất cả các toán học, xem:

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

Nếu bạn đang sử dụng D3DX, có một số chức năng tiện dụng để xử lý chúng (D3DXVec3CatmullRom)


0

Chỉnh sửa: Xin lỗi, như Jason chỉ ra trong nhận xét, câu trả lời sau đây không phải là về phép chia mà là về phép nội suy tuyến tính hai chiều (hoặc song tuyến tính ). Tôi đang chọn không xóa nó trong trường hợp ai đó có thể tìm thấy nó nhiều thông tin.


Tôi đã tạo một địa hình 3D đơn giản và sau đó muốn nhân vật của tôi đi bộ qua địa hình. Vì vậy, để tìm chiều cao của nhân vật tại bất kỳ điểm nào trên địa hình, tôi đã sử dụng phép nội suy song tuyến tính .

Đây là mã Java tôi sử dụng cho phép nội suy song tuyến tính:

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

Lưu ý rằng phép nội suy hai chiều có thể trình bày nội suy mượt mà hơn hoặc thực tế hơn trên các điểm ở xa; nhưng tôi chọn đi với song tuyến vì tôi có một mạng lưới dày đặc, trong một nỗ lực để tối ưu hóa (có lẽ là sớm).


Câu hỏi là về phép nội suy dọc theo một spline
Jason Kozak

Lấy làm tiếc; tin nhắn được thêm vào đầu câu trả lời.
Ricket
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.