주요 콘텐츠

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

interp1

쿼터니언 보간(테이블 룩업)

R2025a 이후

    설명

    vq = interp1(x,v,xq)는 구면 선형 보간(SLERP)을 사용하여 특정 쿼리 점에서 1차원 함수의 쿼터니언 값을 보간합니다. x는 샘플 점을 지정하고, v는 대응하는 값 v(x)를 포함하는 쿼터니언을 지정합니다. xq는 쿼리 점을 지정합니다. 기본적으로 이 함수는 "slerp-short" 보간 방법을 사용합니다.

    예제

    vq = interp1(x,v,xq,method)는 보간 방법을 지정합니다.

    예제

    vq = interp1(x,v,xq,method,extrapolation)x의 정의역 밖에 있는 xq의 모든 쿼리 점에 대해 반환할 쿼터니언 값을 지정합니다.

    예제

    vq = interp1(v,xq)는 샘플 점의 디폴트 세트를 가정하여 쿼터니언 값을 보간합니다. 디폴트 점은 1부터 n 사이의 수열이며, 여기서 nv의 형태에 따라 다릅니다.

    • v가 쿼터니언으로 구성된 벡터인 경우 디폴트 점은 1:length(v)입니다.

    • v가 쿼터니언으로 구성된 배열인 경우 디폴트 점은 1:size(v,1)입니다.

    샘플 점 사이의 절대 거리가 중요하지 않을 때 이 구문을 사용하십시오.

    예제

    vq = interp1(v,xq,method)는 보간 방법을 지정하고 디폴트 샘플 점을 사용합니다.

    vq = interp1(v,xq,method,extrapolation)은 외삽 값을 지정하고 디폴트 샘플 점을 사용합니다.

    예제

    모두 축소

    샘플 점 x와 대응하는 샘플 값 v를 정의합니다.

    x = [1 2 5 6];
    eul = [-185:45:-50; -20*ones(1,4); zeros(1,4)]';
    v = quaternion(eul,"eulerd","ZYX","frame");

    x의 범위에 쿼리 점을 정의합니다.

    xq = [1.5 3 4 5.4];

    쿼리 점에서 보간합니다.

    vq = interp1(x,v,xq);

    결과를 시각화하기 위해 샘플 쿼터니언과 보간된 쿼터니언을 사용하여 동일한 점을 회전시킵니다.

    pts_samples = rotatepoint(v,[1.05 0 0]);
    pts_query = rotatepoint(vq,[1.05 0 0]);

    단위구를 플로팅한 다음, 샘플 쿼터니언과 보간된 쿼터니언을 구에 플로팅합니다.

    figure
    [X,Y,Z] = sphere;
    surf(X,Y,Z,FaceAlpha=0.5,EdgeAlpha=0.35)
    colormap gray
    hold on
    scatter3(pts_samples(:,1),pts_samples(:,2),pts_samples(:,3),"filled")
    scatter3(pts_query(:,1),pts_query(:,2),pts_query(:,3),"filled")
    exampleHelperAnnotateQuats(pts_samples,pts_query,x,xq,10,1.05)
    axis equal
    title(["Interpolated Quaternions Visualized","Using Rotated Points"])
    legend("","Sample Quaternions (v)","Interpolated Quaternions (vq)")

    Figure contains an axes object. The axes object with title Interpolated Quaternions Visualized Using Rotated Points contains 11 objects of type surface, scatter, text. These objects represent Sample Quaternions (v), Interpolated Quaternions (vq).

    함수 값 세트를 정의합니다.

    eul = [-170:20:-70; -20*sind(0:72:360)-25; zeros(1,6)]';
    v = quaternion(eul,"eulerd","ZYX","frame");

    디폴트 점 1:6 사이에 쿼리 점 세트를 정의합니다. 이 경우, v가 요소를 6개 가진 쿼터니언 배열이므로 디폴트 점은 1:6입니다.

    xq = [1.5 2.6 3.5 4.5 5.5];

    SQUAD 자연 보간 방법을 사용하여 xq에서 v를 평가합니다. 여기서 디폴트 "slerp-short" 보간 방법을 사용할 수 있지만, 이 보간 함수에서 설명하는 사인파 회전의 경우 SQUAD가 더 매끄러운 보간 경로를 생성합니다.

    vq = interp1(v,xq,"squad-natural");

    결과를 시각화하기 위해 샘플 쿼터니언과 보간된 쿼터니언을 사용하여 x축의 점을 회전시킵니다.

    pts_samples = rotatepoint(v,[1.05 0 0]); 
    pts_query = rotatepoint(vq,[1.05 0 0]);

    단위구를 플로팅한 다음, 샘플 쿼터니언과 보간된 쿼터니언을 구에 플로팅합니다.

    figure
    [X,Y,Z] = sphere;
    surf(X,Y,Z,FaceAlpha=0.5,EdgeAlpha=0.35)
    colormap gray
    hold on
    scatter3(pts_samples(:,1),pts_samples(:,2),pts_samples(:,3),"filled")
    scatter3(pts_query(:,1),pts_query(:,2),pts_query(:,3),"filled")
    exampleHelperAnnotateQuats(pts_samples,pts_query,1:6,xq,9,1.05)
    axis equal
    title(["Interpolated Quaternions Visualized","Using Rotated Points"])
    legend("","Sample Quaternions (v)","Interpolated Quaternions (vq)")

    Figure contains an axes object. The axes object with title Interpolated Quaternions Visualized Using Rotated Points contains 14 objects of type surface, scatter, text. These objects represent Sample Quaternions (v), Interpolated Quaternions (vq).

    서로 다른 방향을 나타내는 세 개의 쿼터니언을 정의합니다.

    q0 = quaternion([0 0 0],"euler","ZYX","frame");
    q1 = quaternion([pi/4 pi/6 pi/3],"euler","ZYX","frame");
    q2 = quaternion([pi/2 pi/4 pi/2],"euler","ZYX","frame");

    원래 키프레임에 대한 시간 벡터를 만듭니다.

    x = [1 2 3];

    보간에 대한 시간 벡터를 만듭니다.

    T = linspace(0,3,300);

    "slerp-natural" 방법과 "squad-natural" 방법으로 interp1을 사용하여 보간합니다.

    quats_slerp = interp1(x,[q0 q1 q2],T,"slerp-natural")';
    quats_squad = interp1(x,[q0 q1 q2],T,"squad-natural")';

    두 보간 방법 모두에 대해 각속도를 계산합니다.

    ang_vel_slerp = angvel(quats_slerp,T(2)-T(1),"frame");
    ang_vel_squad = angvel(quats_squad,T(2)-T(1),"frame");

    각속도를 플로팅합니다.

    tl = tiledlayout(2,1);
    title(tl,"Angular Velocity - SLERP vs SQUAD")

    SLERP 보간과 SQUAD 보간에 대한 각속도를 플로팅합니다. SQUAD 보간의 각속도가 SLERP를 사용한 보간보다 더 매끄럽습니다.

    nexttile
    plot(T,ang_vel_slerp)
    ylim padded
    title("SLERP Natural")
    legend("X","Y","Z")
    nexttile
    plot(T,ang_vel_squad)
    ylim padded
    title("SQUAD Natural")
    xlabel(tl,"Time")
    ylabel(tl,"Angular Velocity (rad/s)")

    Figure contains 2 axes objects. Axes object 1 with title SLERP Natural contains 3 objects of type line. These objects represent X, Y, Z. Axes object 2 with title SQUAD Natural contains 3 objects of type line.

    샘플 점 x와 대응하는 샘플 값 v를 정의합니다.

    x = [0 1 2];
    eul = [0 30 60; 0 20 60; zeros(1,3)]';
    v = quaternion(eul,"eulerd","ZYX","frame");

    쿼리 점 xqx의 정의역을 벗어나도록 확장하여 지정합니다.

    xq = [-0.5 0.5 1.5 2.5];

    이제 "slerp-short" 보간 방법을 사용하여 xq에서 v를 평가하고, x의 정의역을 벗어난 값들에는 모든 부분이 0으로 설정된 쿼터니언을 할당합니다.

    vq = interp1(x,v,xq,"slerp-short",ones("quaternion"))'
    vq = 4×1 quaternion array
                1 +        0i +        0j +        0k
          0.98774 + 0.022751i - 0.084907j -  0.12903k
          0.87097 +    0.151i -  0.30755j -  0.35217k
                1 +        0i +        0j +        0k
    
    

    입력 인수

    모두 축소

    샘플 점으로, N개 요소를 가진 실수로 구성된 벡터로 지정됩니다. x는 적어도 두 개의 샘플 점을 포함해야 하며 x의 값들은 서로 달라야 합니다. x의 길이는 v의 형태에 따라 다릅니다.

    • v가 쿼터니언으로 구성된 벡터인 경우 length(x)length(v)와 같아야 합니다.

    • v가 쿼터니언으로 구성된 배열인 경우 length(x)size(v,1)과 같아야 합니다.

    예: [1 2 3 4 5 6 7 8 9 10]

    예: 1:10

    예: [3 7 11 15 19 23 27 31]'

    샘플 쿼터니언으로, quaternion 객체로 구성된 N개 요소 벡터 또는 쿼터니언 객체로 구성된 배열로 지정됩니다.

    동일한 쿼리 점에서 샘플링된 데이터 세트가 여러 개인 경우 v를 배열로 지정하면 됩니다. 배열의 각 열은 서로 다른 1차원 샘플 값 세트를 포함해야 하며 첫 번째 차원의 길이는 N이어야 합니다. 여기서 N은 지정된 샘플 점 x의 개수입니다.

    쿼리 점으로, 스칼라, 벡터, 행렬 또는 실수로 구성된 배열로 지정됩니다.

    예: 5

    예: 1:0.05:10

    예: (1:0.05:10)'

    예: [0 1 2 7.5 10]

    보간 방법으로, 다음 표의 옵션 중 하나로 지정됩니다.

    방법설명연속성주석
    "slerp-short"

    보간 계수에 의한 샘플 쿼터니언 사이의 구면 선형 보간입니다. 샘플 쿼터니언 사이의 최단 보간 경로를 선택합니다.

    최단 경로를 얻기 위해 각 샘플 점에서 입력 쿼터니언과 출력 쿼터니언이 반전될 수 있습니다.

    SLERP 알고리즘에 대한 자세한 내용은 SLERP 알고리즘 항목을 참조하십시오.

    C0
    • 적어도 2개의 샘플 쿼터니언 필요

    • 낮은 메모리 요구 사항

    • 효율적인 계산 시간

    • 최단 경로 보간.

    • 가장 빠른 계산 시간

    "slerp-natural"

    보간 계수에 의한 샘플 쿼터니언 사이의 구면 선형 보간으로, 샘플 쿼터니언 사이의 자연 보간 경로를 선택합니다.

    입력 쿼터니언과 출력 쿼터니언은 샘플 점에서 동일한 부호를 갖습니다.

    SLERP 알고리즘에 대한 자세한 내용은 SLERP 알고리즘 항목을 참조하십시오.

    C0
    • 적어도 2개의 샘플 쿼터니언 필요

    • 낮은 메모리 요구 사항

    • 효율적인 계산 시간

    • 입력 쿼터니언과 출력 쿼터니언은 샘플 점에서 동일한 부호를 갖습니다.

    "squad-natural"

    샘플 쿼터니언 사이의 구면 사각형 보간으로, 가속도의 점진적인 변화에 따른 매끄럽고 연속적인 천이를 제공합니다.

    입력 쿼터니언과 출력 쿼터니언은 샘플 점에서 동일한 부호를 갖습니다.

    SQUAD 알고리즘에 대한 자세한 내용은 SQUAD 알고리즘 항목을 참조하십시오.

    C1
    • 적어도 2개의 샘플 쿼터니언 필요

    • 중간 수준의 메모리 요구 사항

    • 효율적인 계산 시간

    • 매끄러운 천이와 점진적인 가속도 변화

    "nearest"최근접이웃 보간. 쿼리 점의 보간된 값은 최근접 샘플 쿼터니언의 값입니다.불연속
    • 적어도 2개의 샘플 쿼터니언 필요

    • 적당한 수준의 메모리 요구 사항

    "next"다음이웃 보간. 쿼리 점의 보간된 값은 다음 샘플 쿼터니언의 값입니다.불연속
    • 적어도 2개의 샘플 쿼터니언 필요.

    • 메모리 요구 사항과 계산 시간이 "nearest"와 동일

    "previous"이전이웃 보간 쿼리 점의 보간된 값은 이전 샘플 쿼터니언의 값입니다.불연속
    • 적어도 2개의 샘플 쿼터니언 필요.

    • 메모리 요구 사항과 계산 시간이 "nearest"와 동일

    외삽 쿼터니언으로, quaternion 객체로 지정됩니다. interp1 함수는 x의 정의역을 벗어나 쿼리하는 모든 xq 값에 대해 이 쿼터니언을 반환합니다.

    예: interp1([0 1 2],quats,2.5,"slerp-natural")은 값이 NaN + NaNi + NaNj + NaNk인 쿼터니언을 반환합니다.

    예: interp1([0 1 2],quats,2.5,"slerp-natural",zeros("quaternion"))은 값이 0 + 0i + 0j + 0k인 쿼터니언을 반환합니다.

    출력 인수

    모두 축소

    보간된 값으로, 스칼라, 벡터, 행렬 또는 배열로 반환됩니다. vq의 크기는 vxq의 형태에 따라 다릅니다.

    v의 형태xq의 형태vq의 크기
    벡터벡터size(xq)size(v) = [1 100]
    이고 size(xq) = [1 500]인 경우,
    size(vq) = [1 500]입니다.
    벡터행렬
    또는 N차원 배열
    size(xq)size(v) = [1 100]
    이고 size(xq) = [50 30]인 경우,
    size(vq) = [50 30]입니다.
    배열벡터[length(xq) size(v,2),...,size(v,n)]size(v) = [100 3]
    이고 size(xq) = [1 500]인 경우,
    size(vq) = [500 3]입니다.
    배열행렬
    또는 N차원 배열
    [size(xq,1),...,size(xq,n),... size(v,2),...,size(v,m)]size(v) = [4 5 6]
    이고 size(xq) = [2 3 7]인 경우,
    size(vq) = [2 3 7 5 6]입니다.

    알고리즘

    모두 축소

    참고 문헌

    [1] Shoemake, Ken. "Animating Rotation with Quaternion Curves." ACM SIGGRAPH Computer Graphics 19, no. 3 (July 1985): 245–54. https://doi.org/10.1145/325165.325242.

    [2] Dam, Erik B., Martin Koch, and Martin Lillholm. Quaternions, Interpolation and Animation. Technical Report DIKU-TR-98/5. Department of Computer Science, University of Copenhagen, July 17, 1998. https://web.mit.edu/2.998/www/QuaternionReport1.pdf.

    확장 기능

    모두 확장

    C/C++ 코드 생성
    MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.

    버전 내역

    R2025a에 개발됨

    참고 항목

    |