2014-07-07 4 views
1

필자는 주어진 번역 및 방향 데이터를 사용하여 인체 애니메이션을 수행하려고합니다. 필자는 인체를 표현하기 위해 (0,0,0)을 중심으로 패치를 사용하여 만들어지고 그에 따라 번역 된 강체 본문 집합을 가지고 있습니다. 나는 각각에 대한 계층 구조를 설정하고 각 강체 세그먼트에 대한 변형 행렬을 수행했습니다. 사지 세그먼트는 서로 상쇄되어 문제를 일으 킵니다. 예를 들어 팔의 강체는 올바른 동작을 수행하더라도 상대적인 원점을 가지지 않는 것처럼 움직입니다. 운동은 패치 중심에서 강체를 움직이는 것과 비슷합니까? 반면에 한쪽 끝은 고정되어 있고 다른 쪽 끝은 번역 데이터를 따라 움직이는 것으로되어 있습니다. 누군가 내가 잘못하고있는 것이 무엇인지 알려 줄 수 있습니까? 내 코드의 레이아웃은 다음과 같습니다패치 및 hgtransform을 사용한 matlab rigid body animation

% Body segment lengths 
xlength = somevalue 
ylength = somevalue 
zlength = somevalue 

% Translation data 
Xdata 
Ydata 
Zdata 

% Orientation data 
Yaw = rotation about z axis 
Pitch = rotation about x axis 
Roll = rotation about y axis 

Vertices = [xlength*ones(8,1),ylength*ones(8,1),zlength*ones(8,1)]... 
    .*[-0.5,-0.5,-0.5; 
    0.5,-0.5,-0.5; 
    -0.5,0.5,-0.5; 
    -0.5,-0.5,0.5; 
    0.5,0.5,-0.5; 
    -0.5,0.5,0.5; 
    0.5,-0.5,0.5; 
    0.5,0.5,0.5]; 

% Create patches 
for i = 1:6 
    % create faces for patches 
end 

% create axes 
ax = axes(...) 

% draw patches 
bodysegmentPatch = patch(patchxdata,patchydata,patchzdata) 

% create hierarchy using hgtransform 
pelvis = hgtransform('Parent',ax); 
trunk = hgtransform('Parent',pelvis); 
head = hgtransform('Parent',trunk); 
leftupperarm = hgtransform('Parent',trunk); 
leftforearm = hgtransform('Parent',leftupperarm); 
rightupperarm = hgtransform('Parent',trunk); 
rightforearm = hgtransform('Parent',rightupperarm); 
leftthigh = hgtransform('Parent',pelvis); 
leftcalf = hgtransform('Parent',leftthigh); 
rightthigh = hgtransform('Parent',pelvis); 
rightcalf = hgtransform('Parent',rightthigh); 

% set patches to hierarchy 
set(pelvisPatch,'Parent',pelvis) 

% Animation loop 
for i = 1:n 
    % translation of body segment 
    bodysegmentT = makehgtform('translate',[x(i) y(i) z(i)]); 

    % rotation of body segment 
    bodysegmentR = makehgtform('yrotate',Roll(i),'xrotate',Pitch(i),'zrotate',Yaw(i)); 

    % Create transform matrices 
    set(pelvis,'Matrix',pelvisR); 
    set(trunk,'Matrix',trunkR*pelvisR); 
    set(leftupperarm,'Matrix',leftupperarmT*leftupperarmR*trunkR*pelvisR); 
    drawnow 

end 
+0

작업 코드 샘플을 제공하여 사람들이 스크립트에 복사하여 붙여 넣을 수 있으므로 진행 상황을 빠르게 확인할 수 있습니까? – Justin

+0

그러나이 데이터는 모션 캡처 파일에서 가져온 것이므로 수천 개의 행과 수십 개의 열이 있습니다. –

답변

0

나는 당신의 문제가 정확히 무엇인지 확실하지 않다,하지만 너무 밀접하게 코드를 보지 않고 내 생각 엔이 가능성이 일반적인 실수 중 하나 이러한 골격 변형을하는 동안입니다.

  1. 매트릭스 변환의 순서가 잘못되었습니다. A = A * B는 A = B * A와 같은 것이 아니라는 것을 기억하십시오. 이런 종류의 변환 스택을 수행 할 때이 순서가 매우 중요합니다.
  2. 개체가 잘못된 지점을 중심으로 회전하고 있습니다. 보통 원점을 중심으로 회전합니다. 따라서 대상의 중심을 중심으로 회전 할 대상을 원하면 이미지를 원점으로 변환하고 이미지를 회전하고 이미지를 원래 위치로 다시 변환해야합니다.

포기하지 마세요. 이러한 변환은 까다로울 수 있으며 실제로 코드가 실제로는 거의 정확하지만 실제로는 완전히 혼란스럽게 보일 수 있습니다.

+0

입력 해 주셔서 감사합니다. 그러나 회전은 처음에 원점에서 시작하여 다른 점으로 변환됩니다 (왼쪽 상단 참조). –

+0

제 문제는 패치 강체가 움직이는 것입니다. 한쪽 끝이 점에 붙어있는 대신 양쪽 끝이 변위되는 반면 다른 쪽 끝은 동작 데이터에 따라 움직이는 것입니다. –

관련 문제