캣멀롬 스플라인(Catmull-Romm Spline)
캣멀롬 스플라인은 포인트와 포인트의 사이의 통과하는 포인트를 의미하는 특성을 가진다.
커브의 포인트를 계산하려면 from 포인트와 - end 포인트의 2개의 포인트의 t(시간) 값에 의해서 지정된다. 컨트롤 포인트는 정규 간격(중간 포인트)이 생긴다.
반응형
테스트한 코드로 포인트에는 DrawCube를 생성했고
그 중간 라인에서는 DrawLine으로 Gizmos를 생성하면 이렇게 된다.
베이어 곡선과 다르게 급격한 커브와 가속도에 대한건 표현하기는 부적절한 것 같은데
그래도 포인트를 정확하게 거칠수있다는 점이 다르다.
void DrawCurve(List<Vector2> p, int _pointNumber, float _gap)
{
float pointX = 0, pointY = 0;
float tt, _1_t, _2t, h00, h10, h01, h11;
Vector2 m0;
Vector2 m1;
Vector2 m2;
Vector2 m3;
List<Vector2> positionList = new List<Vector2>();
for (int n = 0; n < _pointNumber; n++)
{
for (float t = 0; t < 1; t += _gap)
{
tt = t * t;
_1_t = 1 - t;
_2t = 2 * t;
h00 = (1 + _2t) * (_1_t) * (_1_t);
h10 = t * (_1_t) * (_1_t);
h01 = tt * (3 - _2t);
h11 = tt * (t - 1);
if (n == 0)
{
m0 = tangent(p[n + 1], p[n]);
m1 = tangent(p[n + 2], p[n]);
pointX = h00 * p[n].x + h10 * m0.x + h01 * p[n + 1].x + h11 * m1.x;
pointY = h00 * p[n].y + h10 * m0.y + h01 * p[n + 1].y + h11 * m1.y;
positionList.Add(new Vector2(pointX, pointY));
}
else if (n < _pointNumber - 2)
{
m1 = tangent(p[n + 1], p[n - 1]);
m2 = tangent(p[n + 2], p[n]);
pointX = h00 * p[n].x + h10 * m1.x + h01 * p[n + 1].x + h11 * m2.x;
pointY = h00 * p[n].y + h10 * m1.y + h01 * p[n + 1].y + h11 * m2.y;
positionList.Add(new Vector2(pointX, pointY));
}
else if (n == _pointNumber - 1)
{
m2 = tangent(p[n], p[n - 2]);
m3 = tangent(p[n], p[n - 1]);
pointX = h00 * p[n - 1].x + h10 * m2.x + h01 * p[n].x + h11 * m3.x;
pointY = h00 * p[n - 1].y + h10 * m2.y + h01 * p[n].y + h11 * m3.y;
positionList.Add(new Vector2(pointX, pointY));
}
}
}
}
위키백과 캣멀롬 스플라인 : [링크]
★★☆☆☆
반응형
'개발 > 게임) 개발관련' 카테고리의 다른 글
문제해결)Git) You are not allowed to push code to protected branches on this project. (0) | 2021.11.24 |
---|---|
문제해결)Unity).csproj 파일이 생성되지 않을 때 (6) | 2021.11.16 |
Android) adb Shell 명령어 정리 (0) | 2021.09.29 |
Andorid).APK Finger Print 확인하기 (0) | 2021.09.07 |
문제해결)Android)Cannot recover key android (0) | 2021.09.05 |
댓글