анимация твердого тела в Matlab с использованием patch и hgtransform

Я пытаюсь выполнить анимацию человеческого тела, используя предоставленные мне данные о переводе и ориентации. У меня есть набор сегментов твердого тела, сделанных с помощью патча, все с центром в (0,0,0), чтобы представить человеческое тело и соответственно переведены. Я установил иерархию для каждого из них и выполнил матрицу преобразования для каждого сегмента твердого тела. Сегменты конечностей начинают смещать друг друга и вызывать проблемы. Например, твердое тело руки движется так, как будто у него нет относительной исходной точки, даже если оно следует собственному движению. Это движение похоже на перемещение твердого тела из центра тяжести заплатки? В то время как он должен двигаться, фиксируя один конец, а другой конец следует за данными перевода. Может ли кто-нибудь сообщить мне, что я делаю неправильно? Макет моего кода:

% 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

person Muhaned g    schedule 07.07.2014    source источник
comment
Можете ли вы предоставить рабочий образец кода, чтобы люди могли скопировать и вставить его в сценарий, чтобы быстро увидеть, что происходит?   -  person Justin    schedule 08.07.2014
comment
Однако я могу попробовать, данные для этого взяты из файла захвата движения, так что буквально тысячи строк и десятки столбцов.   -  person Muhaned g    schedule 09.07.2014


Ответы (1)


Я не уверен, в чем именно заключается ваша проблема, но, не глядя слишком внимательно на ваш код, я предполагаю, что это, вероятно, одна из двух распространенных ошибок при выполнении этих преобразований скелета.

  1. Ваши преобразования матрицы идут в неправильном порядке. Помните, что A = A * B - это не то же самое, что A = B * A. Когда вы делаете такой стек трансформации, этот порядок очень важен.
  2. Объекты вращаются не в той точке. Обычно они вращаются вокруг начала координат. Поэтому, если вы хотите, чтобы что-то вращалось вокруг центра объекта, вам нужно будет перевести изображение в начало координат, повернуть изображение, перевести изображение обратно в исходное положение.

Не сдавайся! Эти преобразования могут быть сложными и часто могут выглядеть совершенно хаотичными, в то время как на самом деле код действительно близок к правильному.

person DevLan    schedule 08.07.2014
comment
Спасибо за вклад, я рассмотрю его подробнее. Однако сначала вращение начинается в исходной точке, а затем переводится в другую точку, см. Левуюверхнюю точку. - person Muhaned g; 09.07.2014
comment
Моя проблема в том, что твердое тело патча движется, когда оба конца смещаются, а не один конец остается прикрепленным к точке, в то время как другой конец движется в соответствии с данными движения. - person Muhaned g; 09.07.2014