sampler
- 한 애니메이션을 위한 보간 샘플링 함수를 정의한다.
-
Concepts
- 애니메이션 함수 곡선은 COLLADA 내부의 1D<sampler> 엘리먼트로 나타내어 진다. 샘플러는 샘플링 점과 어떻게 그들 사이를 보간할 것인지 정의되어 있다. 애니메이션 채널의 값을 계산할 때, 샘플링 점은 애니메이션 키 프레임을 나타낸다.
- 샘플링 점(Key frames)는 샘플러의 입력 데이터 소스이며, 보간 타입의 명칭도 나타낸다. 애니메이션 채널은 타겟으로 샘플러의 다이렉트로 출력 값이 된다.
-
Animation Curves(<animation>/<sampler>)
- 애니메이션은 어떻게 애니메이티드 파라미터를 시간에 따라 전개하느냐를 곡선(curves)을 사용하여 정의 한다. 곡선 정의는 애니메이션 키를 포함한 특별한 한 차원의 축을 제외하고는, <geometry>/<spline>을 위한 정의와 비슷하다. 키는 파라미터가 어떻게 주어지느냐를 정의하거나 파라미터를 set하고, 애니메이션 전체에 걸친 시간을 전개한다.
- 키Key는 종종 시간 값으로 쓰이지만, 다른 값으로 쓰일 수 있다. 예를 들어, 트랙 위의 기차의 위치에 관련된 기차 바퀴의 회전값으로 쓰일 수 있다.( 기차는 앞 혹은 뒤로 이동함으로서 바퀴나 다른 매카니즘은 자동적으로 움직일 수 있다.
- 애니메이션은 키 축안에서 단조 곡선을 가져야 한다는 한계를 가진다. 다르게 말하자면, 애니메이션 키는 INPUT 의 증가 명령안에서 정렬이 필요하고 딱 들어맞을 수 없다. 이것은 애니메이션 곡선은 아주 가까(closed)울 수 없다는것을 의미한다.
-
키는 <source>배열을 저장하고, <geometry>/<spline>의 모든 POSITION 인풋의 첫번째 축을 굧체한다. 몇몇 파리미터는 같은 키 값에 대하여 다른 곡선의 애니메이팅을 할 수 있다. 이러한 파라미터들은 OUTPUT 배열에 주어진다.
In short:
POSITION[i].X = INPUT[i]
POSITION[i].Y = OUTPUT[i]
And for n curves, the point i of the curve j is:
POSITION[j][i] = INPUT[j][i]
POSITION[j][i+1] = OUTPUT[j][i]
-
Attributes
- id - (xs:ID) - 엘리먼트의 유니크한 식별자를 포함하는 스트링. 이 값은 반드시 인스턴스 문서에서 유일해야 한다. Optional
-
pre_behavior - (Enumeration) - 첫번째 키 이전에 샘플된 값을 나타내야 한다. 유효한 값은 다음과 같다.
- • UNDEFINED: 기본 값. 이전 과 이후의 행동이 정의되지 않았을 때.
• CONSTANT: 첫번째 값(behavior_before) 이나 나중 값(behavior_after)이 리턴되었을 때
• GRADIENT: The value follows the line given by the last two keys in the
sample. (Same as LINEAR in Maya®.)
• CYCLE: The key is mapped in the [first_key , last_key]
interval so that the animation cycles.
• OSCILLATE: The key is mapped in the [first_key , last_key]
interval so that the animation oscillates.
• CYCLE_RELATIVE: The animation continues indefinitely.
See “Details” for more information.
- • UNDEFINED: 기본 값. 이전 과 이후의 행동이 정의되지 않았을 때.
- post_behavior - (Enumeration) - Optional. 마지막 키 뒤에 샘플 값을 나타내야 한다. 유효값은 pre_behavior와 같다.
-
관련 엘리먼트
- parent elements - animation
- Child elements - 아래 참고
- Others - None
-
Child Elements
- <input>(unshared) - 적어도 한<input>엘리먼트는 반드시 INTERPOLATION값의 semantic 속성을 가져야 한다. See main entry. - (Default)None - (Occurrences) 1 or more
-
Detatils
- 샘플링 포인트는 <source>엘리먼트를 참조시킨 <input>엘리먼트로 묘사 된다. <input>엘리먼트의 semantic 어트리뷰트속성은 INPUT, INTERPOLATION, IN_TANGENT, OUTPUT중 한개가 될 수 있지만, 한정되지는 않는다.
- COLLADA 다음과 같은 보간 타입을 인정한다: LINEAR, BEZIER, CARDINAL, HERMITE, BSPLINE and STEP. 이 심볼릭 이름들은 그들을 저장한 <name_array>를 포함한 <source> 엘리먼트안에 들어있다. 이 값들은 INTERPOLATION <input> 엘리먼트의 샘플러에 입력된다.
- 완전해지기 위하여, <sampler> 엘리먼트는 INTERPOLATION의 semantic 속성과 함께 <input> 엘리먼트에 포함되어야 한다. COLLADA는 기본 인터폴레이션 타입이 명확하지 않다. 만약 한 인터폴레이션 타입이 명확하지 않다면, <sampler>는 어플리케이션 디파인 된 결과를 보여준다.
- CH4: Programming Guide 참고 할 것.
-
STEP Interpolation
- 애니메이션 곡선은 interpolation의 부가적인 타입에 다음을 허용한다.:step. 이는 아래의 곡선과 같은 넥스트 세그먼트가 나오기 전까지, 세그먼트의 첫번째 포인트 값이 불변하게 남는다는 것을 뜻 한다.
-
The COLLADA code for this would be:
<animation>
<source id="time_axis" >
<float_array count="4"... >
... <technique_common><accessor>
<param name="TIME">
...</accessor></technique_common>
...</source>
<source id="positions" >
<float_array count="4" ...>
<technique_common>... <accessor>
<param name="name_of_parameter_animated" type="float" ...
...</accessor></technique_common>
...</source>
<source id="interpolations" >
<Name_array count="4"> STEP STEP STEP STEP </Name_array> <!-- last one
ignored -->
<technique_common>... ... <accessor>
<param name="INTERPOLATION" type="Name" ...
...</accessor></technique_common>
...</source>
<sampler>
<input semantic="INPUT" source = "#time_axis" />
<input semantic="OUTPUT" source="#positions" />
<input semantic="INTERPOLATION" source="#interpolations" />
- 애니메이션 곡선은 interpolation의 부가적인 타입에 다음을 허용한다.:step. 이는 아래의 곡선과 같은 넥스트 세그먼트가 나오기 전까지, 세그먼트의 첫번째 포인트 값이 불변하게 남는다는 것을 뜻 한다.
-
Linear Animation Curves
- LINEAR interpolation 은 STEP과 비슷하지만, 파라미터들의 값이 키 값들 사이에서 선형적으로 보간 된다.
- LINEAR interpolation 은 STEP과 비슷하지만, 파라미터들의 값이 키 값들 사이에서 선형적으로 보간 된다.
-
Bezier and Hermite Animation Curves
- BEZIER와 HERMITE 보간은 <input> semantic의 no POSITON인것을 제외하고는, <spline>을 표현하기 위한 방법과 비슷하지만 오히려 INPUT과 OUTPUT semantics이다. INPUT과 OUTPUT 시맨틱은 항상 1D 파라미터이다. 앞서 설명된 것처럼, 만약 OUTPUT이 한 차원 이상을 가진다면, 몇몇 파라미터들은 같은 키 값을 독립적으로 사용하여 보간 되어야 한다. IN_TANGENT와 OUT_TANGENT 시맨틱은 한개의 키 값을 가지고 있고, 그땐 파라미터별로 각각 한개의 값을 가진다.
-
큐빅 입방체의 베지어와 Hermite 인터폴레이션을 위한 항등식은, 다음의 파라미터 j와 세그먼트[i]:와 함께 지오메트리 벡터<spline>에 이미 적용되어 사용되었다.
For Bézier:
• P0 is (INPUT[i] , OUTPUT[j][i])
• C0 (or T0) is (OUT_TANGENT[0][i] , OUT_TANGENT[j][i])
• C1 (or T1) is (IN_TANGENT[0][i+1], IN_TANGENT[j][i+1])
• P1 is (INPUT[i+1], OUTPUT[j][i+1])
-
Special Case: 1D Tangent Values
- 어떤 exporter들은 exporting 곡선은 탄젠트로부터 변질(퇴화)된 곡선을 추출 되어져 오고 있다. 이것들은 COLLADA specification을 서포트 하지 않으며, 변형(퇴화)된 케이스는 영향을 받은 exporter의 업데이트와 함께 사라질 것이다. 다음은 정보 용도로만 제공 되었다.
- 1D 탄젠트 데이터를 가지는 특별한 경우, OUT_TANGENT와 IN_TANGENT는 키값을 포함하지 않으며, 그러므로 OUTPUT 배열과 같은 차원을 가진다.
- 키 값을 잃어버리는 것은 INPUT 세그먼트에 의한 키의 linear interpolation 일 때처럼 공급되어진다.
geometry 벡터 값은 통상적인 애니메이션 곡선에게 하듯이 같은 방법을 공급한다.
• P0 is (INPUT[i] , OUTPUT[j][i]
• C0 is (INPUT[i]/3 + INPUT[i+1] *2/3 , OUT_TANGENT[j][i])
• C1 is (INPUT[i]*2/3 + INPUT[i+1]/3, IN_TANGENT[j][i+1])
• C1 is (INPUT[i+1], OUTPUT[j][i+1])
-
B-Spline and Cardinal Animation Curves
- BSPLINE 과 CARDINAL 곡선의 지원은 같은 본질로 오래전부터 논쟁되었다. POSITON은 INPUT과 OUTPUT이 결합되 주어진다. 이 애니메이션 커브는 이전에 미리 같은 방정식으로 정의되었다.
- BSPLINE 과 CARDINAL 곡선의 지원은 같은 본질로 오래전부터 논쟁되었다. POSITON은 INPUT과 OUTPUT이 결합되 주어진다. 이 애니메이션 커브는 이전에 미리 같은 방정식으로 정의되었다.
-
Behavior Before and After
-
두 옵션 속성은 pre_behavior와 post_behavior로 첫번째 키와 마지막 키 전에 샘플된 값을 가리킨다.
다음 다이어그램과 의사 코드는 behavior 옵션의 다른 행동을 예로 제공한다.
++ pseudo code for post_behavior: key > last_key > first_key
if the INTERPOLATION provides tangent values:
tangent = tangent[last_key]
else
tangent = value[last_key]-value[penultimate_key] / (last_key -
penultimate_key)
return value[last_key] + tangent * (key-last_key)
++ pseudo code for pre_behavior: key < first_key < last_key
if the INTERPOLATION provides tangent values:
tangent = tangent[first_key]
else
tangent = value[second_key]-value[first_key] / (second_key- first_key)
return value[fist_key] + tangent * (key-fist_key)
++ pseudo code for post_behavior: key > last_key > first_key
repeat = (int) (key - first_key) / (last_key - first_key)
new_key = key - (last_key - first_key) * repeat;
return value[new_key]
++ pseudo code for pre_behavior: key < first_key < last_key
repeat = (int) (first_key - key) / (last_key - first_key)
new_key = key + (last_key - first_key) * (repeat + 1);
return value[new_key]
++ pseudo code for post_behavior: key > last_key > first_key
repeat = (int) (key - first_key) / (last_key - first_key)
if (repeat is even) // same as CYCLE
new_key = key - (last_key - first_key) * repeat;
else // play animation backward
new_key = first_key + last_key - (key - (last_key - first_key) * repeat);
return value[new_key]
++ pseudo code for pre_behavior: key < first_key < last_key
repeat = (int) (first_key - key) / (last_key - first_key)
if (repeat is odd) // same as CYCLE
new_key = key + (last_key - first_key) * (repeat + 1);
else // play animation backward
new_key = first_key + last_key - (key + (last_key - first_key) * (repeat
+ 1));
return value[new_key]
++ pseudo code for post_behavior: key > last_key > first_key
repeat = (int) (key - first_key) / (last_key - first_key)
new_key = key - (last_key - first_key) * repeat;
return value[new_key] + (value[last_key] - value[first_key])*repeat
++ pseudo code for pre_behavior: key < first_key < last_key
repeat = (int) (key - first_key) / (last_key - first_key)
new_key = key + (last_key - first_key) * (repeat + 1);
return value[new_key] - (value[last_key] - value[first_key])*(repeat+1)
-
- Example
-
Here is an example of a <sampler> element that evaluates the y-axis values of a key-frame source
element whose id is “group1_translate-anim-outputY”. The INTERPOLATION inputs are shown in
their <source> element for added clarity:
<animation id="group1_translate-anim">
<source id="group1_translate-anim-inputY">
...
</source>
<source id="group1_translate-anim-outputY">
...
</source>
<source id="group1_translate-anim-interpY">
<Name_array count="3" id="group1_translate-anim-interpY-array">
BEZIER BEZIER BEZIER
</Name_array>
<technique_common>
<accessor count="3" source="#group1_translate-anim-interpY-array">
<param name="Y" type="Name"/>
</accessor>
</technique_common>
</source>
<sampler id="group1_translate-anim-samplerY">
<input semantic="INPUT" source="#group1_translate-anim-inputY"/>
<input semantic="OUTPUT" source="#group1_translate-anim-outputY"/>
<input semantic="IN_TANGENT" source="#group1_translate-anim-intanY"/>
<input semantic="OUT_TANGENT" source="#group1_translate-anim-outtanY"/>
<input semantic="INTERPOLATION" source="#group1_translate-anim-interpY"/>
</sampler>
<channel source="#group1_translate-anim-samplerY"
target="group1/translate.Y"/>
</animation>
이 글은 스프링노트에서 작성되었습니다.
'COLLADA Specification' 카테고리의 다른 글
[COLLADA 2.0 Controller] instance_controller (0) | 2010.11.09 |
---|---|
[COLLADA 2.0 Controller] controller (0) | 2010.11.09 |
[COLLADA 2.0 Animation] library_animation_clips (0) | 2010.10.13 |
[COLLADA 2.0 Animation] library_animations (0) | 2010.10.13 |
[COLLADA 2.0 Animation] instance_animation (0) | 2010.10.13 |