본문 바로가기
개발/게임) 개발관련

게임개발) 캣멀롬 스플라인(Catmull-Romm Spline)

by 테샤르 2021. 10. 20.

캣멀롬 스플라인(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));
                }
            }
        }
 }

 

 

위키백과 캣멀롬 스플라인 : [링크]

 

캣멀롬 스플라인 - 위키백과, 우리 모두의 백과사전

캣멀롬 스플라인은 컴퓨터 그래픽스 용어로, 에드윈 캣멀과 Raphael Rom에 의해 정의되었다. 이는 보간 스플라인의 한 종류로서 제어점을 뚫는 모양을 가진다.  P 0 , P 1 , P 2 , P 3 {\displaystyle \mathbf {

ko.wikipedia.org

 

★★☆☆

 

반응형

댓글