게임 개발에서 발견되는 가장 일반적인 스플라인, 메소드가 커브를 보간하는 데 필요한 포인트 수 및 커브 포인트의 보간을 얻을 수있는 데이터 유형을 작성하는 방법을 여기에 나열하십시오. 예 : 베 지어 곡선, B- 스플라인, 입방 스플라인 등
추신 : 나는 이것을 커뮤니티 위키로 만들고 있으므로 모든 종류의 스플라인 보간을 나열 할 수 있습니다.
게임 개발에서 발견되는 가장 일반적인 스플라인, 메소드가 커브를 보간하는 데 필요한 포인트 수 및 커브 포인트의 보간을 얻을 수있는 데이터 유형을 작성하는 방법을 여기에 나열하십시오. 예 : 베 지어 곡선, B- 스플라인, 입방 스플라인 등
추신 : 나는 이것을 커뮤니티 위키로 만들고 있으므로 모든 종류의 스플라인 보간을 나열 할 수 있습니다.
답변:
카메라 경로와 같은 (추가 제어점을 정의하지 않고) 사이에 부드러운 경로를 만들려는 점 세트가있는 경우 Catmull-Rom 스플라인 (입방 소라 기 스플라인 유형)이 매우 유용 할 수 있습니다.
모든 수학에 대해서는 다음을 참조하십시오.
http://en.wikipedia.org/wiki/Cubic_Hermite_spline
D3DX를 사용하는 경우이를 처리하기위한 편리한 기능이 있습니다 (D3DXVec3CatmullRom).
편집 : 죄송합니다. 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},
};
}
}
쌍 입방 보간은 먼 지점에서 더 부드럽고 사실적인 보간을 제공 할 수 있습니다. 그러나 밀도가 높은 그리드를 가지고 있기 때문에 이중선을 사용하기로 결정했습니다 (아마 조기에).