COLLADA Specification2010. 10. 13. 03:31

 untitled.bmp

 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.
    • 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. 이는 아래의 곡선과 같은 넥스트 세그먼트가 나오기 전까지, 세그먼트의 첫번째 포인트 값이 불변하게 남는다는 것을 뜻 한다.
        1.jpg 
      1.  

        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" />  

    • Linear Animation Curves

      • 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이 결합되 주어진다. 이 애니메이션 커브는 이전에 미리 같은 방정식으로 정의되었다.
    •  Behavior Before and After

      • 두 옵션 속성은 pre_behavior와 post_behavior로 첫번째 키와 마지막 키 전에 샘플된 값을 가리킨다.
        다음 다이어그램과 의사 코드는 behavior 옵션의 다른 행동을 예로 제공한다.

        1(1).jpg 
        ++ 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)

        2.jpg 
        ++ 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]
        3.jpg 
        ++ 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]
        4.jpg 
        ++ 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
  1.  

    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>

 

 

이 글은 스프링노트에서 작성되었습니다.

Posted by BLUE-NOTE