본문 바로가기

프로그래밍/MaxSDK

[MAXSDK] 인터벌

원문 : max8 sdk 도움말. Intervals

인터벌

인터벌은 시간의 길이를 표현하는 클래스이다. 그것은 두 개의 데이터 멤버를 가지고 있는데, start 와 end 이다. 이것들은 TimeValue이다. TimeValue 는 시간 단위의 단일 인스턴트이다. TimeValue 에 대한 더 많은 정보를 원한다면 Advanced Topics 섹션 Time 을 참조하라.

인터벌은 시간의 범위를 기술하기 위해서 3ds 맥스 전반에서 사용된다. 대부분의 일반적인 용도는 요소가 "유효"한지를 알려 주기 위한 시간의 범위를 기술하기 위한 것이다. 이러한 유형의 인터벌은 Validity Interval 이라 불린다. 그것은 보통 캐시된 요소(item)와 관련되어 사용된다. 유효 인터벌은 캐시(cache)가 요소의 상태를 정확하게 반영하게 되는 시간의 범위를 기술한다. 캐시가 최신(up to date)인지 확인하기 위해서 주어진 시간을 비교할 때, 그 시간이 인터벌 내부에 있다면, 캐시가 그 시간에 대해 유효한 것이다. 만약 그것이 인터벌 외부에 있다면 캐쉬는 유효하지 않은 것이다.

3ds 맥스의 기하 파이프라인 시스템은 그것의 캐싱 스킴(scheme)의 일부로서 인터벌을 사용한다. 3ds 맥스 캐싱 시스템의 사용을 위해 절차적 오브젝트나 수정자 플러그인들의 많은 메서드들이 반드시 (인터벌과 관련해) 호출되거나 구현될 것이 요구된다. 이 캐시의 관점에서 인터벌은 특정 시간 근처에서 아이템을 위한 지속(constancy) 기간을 표현한다. 다시 말해 주어진 시간에 요소가 지속되는(변경되지 않는) 시간이 얼마나 초과했거나 남았는지를 알려주는 것이다. 캐싱 알고리즘의 일부는 요소가 상대적으로 지속되고 있는지 아닌지를 판단하기 위해서 필요하다.

그 예로서 전체 100 프레임 애니메이션 동안에 애니메이션되지 않는 절차적 오브젝트가 있다고 하자. 이 오브젝트는 영원한(FOREVER) 유효 인터벌을 가지고 있다. 그것은 아무 것도 변경되지 않기 때문에 최신이다. 그리고 나서 이 오브젝트에 Bend 수정자를 적용하고 프레임 50 에서 angle 파라미터를 애니메이션했다고 하자. 이제 프레임 0 부터 50 까지 항상 구부려진 오브젝트가 존재한다. 50 프레임 이후에 그것은 결코 변경되지 않는다. 처음 50 프레임에서는 모든 유효 인터벌이 즉시(instantaneous) 인터벌이다(start 시간이 end 시간과 같다). 50 프레임 이후인 51 부터 100까지는 모두 유효 인터벌로 계산된다.

3ds 맥스는 프레임 51 부터 100 까지 구부려진 오브젝트의 표현을 캐싱할 것이다. 그리고 그것은 이 전체 범위에서 구벼려진 오브젝트를 재계산할 필요가 없을 것이다. 3ds 맥스는 프레임 0 부터 50 까지는 표현을 캐싱하지 않을 것이다. 왜냐면 그것들은 항상 변경되기 때문이다.

플러그인은 반드시 3ds 맥스에 그것들이 변경되는 것이 언제이고 변경되지 않는 것이 언제인지에 대한 정보를 제공해야만 한다. 아래에 있는 것은 절차적 오브젝트 혹은 수정자의 플러그인 메서드가 인터벌을 반환하거나 변경하는 것을 호출하거나 구현하는 것을 예로 든 것이다.

GetValue()

IParamBlock 의 이 메서드는 몇 개의 인자를 가지며, 그중 하나는 인터벌에 대한 C++ 참조이다. 이것은 개발자가 인터벌을 줄이기 위해서 자주 사용하는 메서드다. 파라미터 블록의 파라미터가 애니메이션될 때, 거기에는 주어진 시간에 대해 파리미터가 지속되는 인터벌이 존재한다. 파라미터가 지속적으로 변경된다면, 인터벌은 instantaneous 이다. 만약 파라미터가 특정 간격 동안 변경되지 않는다면, 그 인터벌은 longer일 것이다. 만약 파라미터가 전혀 변경되지 않는다면 그 인터벌은 FOREVER 일 것이다. 파라미터 블록의 GetValue() 메서드에 인터벌을 넘김으로써, 당신은 파라미터 블록에 파라미터의 인터벌을 사용해 넘겨진 인터벌을 '간섭(intersect)'할 것을 요청하게 된다. 두 개의 인터벌을 간섭한다는 것은 start 값이 그 두 개보다 큰 새로운 인터벌을 반환한다는 것을 의미하고, 그것의 end 값이 그 두개보다 작다는 것을 의미한다. 이런 방식으로 결과 인터벌은 두 개의 인터벌에 대해 결합된 지속 기간을 표현하게 된다.

이 기법은 오브젝트에 대한 유효 인터벌을 계산하기 위해 자주 사용된다. 개발자는 FOREVER로서 인터벌을 시작하고, 이 인터벌을 (GetValue()를 호출함으로써) 그것의 애니메이션되는 파라미터들로 간섭한다. GetValue() 는 각 호출을 할 때 그 인터벌을 감소시킨다. 모든 파라미터가 간섭되면, 그 결과는 특정 시간에 대한 오브젝트의 전체적인 유효 인터벌이다.

아래 다이어그램을 가지고 예를 들어 보자. 두 개의 애니메이션되는 파라미터인 Radius, Segments 를 가지고 있는 오브젝트에 대해서 시간 40에 유효 인터벌이 계산된다. 이 인터벌은 먼저 Radius 파라미터를 사용해 초기의 FOREVER 인터벌을 간섭함으로써 계산된다. Radius 인터벌은 20 부터 100까지이다. 이 간섭의 결과는 20 부터 100까지의 인터벌이다. 이 인터벌은 Segment 파라미터 인터벌에 의해 간섭된다(10부터 50까지). 이 간섭의 결과는 20 부터 50까지의 인터벌이다. 결국 40 에서의 오브젝트의 유효 인터벌은 20부터 50까지이다.


ObjectValidity(TimeValue t)

플러그인에 의해 구현되는 이 메서드는 넘겨진 시간 근처의 절차적 오브젝트의 유효 인터벌을 반환한다. 이 메서드는 FOREVER 에서 인터벌을 시작하고 이 인터벌을 그것의 애니메이션되는 파라미터들의 각 인터벌로 간섭함으로써 오브젝트에 의해 계산된다. 이러한 방식으로 그것은 파라미터 각각에 의해 간섭되었기 때문에 인터벌은 감소하게 된다. 결과 인터벌은 넘겨진 TimeValue와 관련한 지속의 기간(period of constancy)을 표현한다. 이 인터벌은 TimeValue 가 되기 위해서 얼마나 남았으며, 오브젝트가 지속적으로 존재하는 시간이 얼마나 남았는지를 표현한다.

LocalValidity(TimeValue t)

이 메서드는 넘겨진 시간 근처의 수정자 자체의 유효 인터벌을 반환한다. 일반적으로 이것은 수정자가 자신의 파라미터를 제어하기 위해서 사용하는 모든 컨트롤러의 유효 인터벌에 의한 간섭을 의미한다. 그래서 만약 수정자가 애니메이트되지 않으면, 이 인터벌은 FOREVER 이다.

오브젝트는 파이프라인을 따라서 이동하기 때문에, 각 수정자의 유효 인터벌은 오브젝트 상태의 유효 인터벌 안으로 간섭된다. 오브젝트가 파이프라인의 끝에 도달하면, 그것의 유효 인터벌은 파이프라인 내부의 모든 요소의 간섭을 반영한다.

GetValidity(TimeValue t)

SimpleMod 클래스는 이 메서드를 호출해 수정자의 유효 인터벌을 획득한다. 수정자는 이 인터벌을 FOREVER 로 인터벌을 시작해 수정자의 각 파라미터를 그 인터벌로 간섭함으로써 이 인터벌을 제공한다. 그리고 나서 SimpleMod는 LocalValidity()의 자체 구현에서 반환되는 인터벌로 자신의 컨트롤러의 유효 인터벌을 간섭한다.

UpdateValidity(int nchan, Interval v)

수정자는 오브젝트의 UpdateValidity() 메서드를 호출한다. 수정자가 오브젝트에 적용될 때, 그것은 자신의 유효 인터벌을 포함할 필요가 있다. 이것은 자신의 ModifyObject() 메서드에서 수정자에 의해 자주 호출된다.

    SetChannelValidity(int nchan, Interval v)

이 메서드는 파이프라인의 특정 채널을 위해 유효 인터벌을 지정하기 위해서 호출된다. 

 

[출처] - 라이푸님의 http://blog.naver.com/lifeisforu 네이버 블로그