게임 개발에서 찾을 수있는 가장 일반적인 스플라인은 무엇입니까?


11

게임 개발에서 발견되는 가장 일반적인 스플라인, 메소드가 커브를 보간하는 데 필요한 포인트 수 및 커브 포인트의 보간을 얻을 수있는 데이터 유형을 작성하는 방법을 여기에 나열하십시오. 예 : 베 지어 곡선, B- 스플라인, 입방 스플라인 등

추신 : 나는 이것을 커뮤니티 위키로 만들고 있으므로 모든 종류의 스플라인 보간을 나열 할 수 있습니다.


1
좋은 질문입니다. IMO.
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

편집 : 죄송합니다. Jason이 의견에서 지적한 것처럼 다음 대답은 스플라인이 아니라 2 차원 선형 (또는 이중선 ) 보간에 관한 것입니다. 누군가가 유익한 정보를 발견 할 수 있도록 삭제하지 않기로 결정했습니다.


간단한 3D 지형을 만들고 캐릭터가 지형을 가로 질러 걸어 가기를 원했습니다. 지형의 어느 지점에서나 캐릭터의 높이를 찾기 위해 bilinear interpolation을 사용했습니다 .

이중선 보간에 사용하는 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},
            };
    }
}

쌍 입방 보간은 먼 지점에서 더 부드럽고 사실적인 보간을 제공 할 수 있습니다. 그러나 밀도가 높은 그리드를 가지고 있기 때문에 이중선을 사용하기로 결정했습니다 (아마 조기에).


문제는 스플라인을
Jason Kozak

죄송합니다; 답변 상단에 메시지가 추가되었습니다.
Ricket
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.