1

我正在尝试使用给定的平移和方向数据来执行人体动画。我有一组使用以 (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
4

1 回答 1

0

我不确定您的问题到底是什么,但是如果不仔细查看您的代码,我的猜测是这可能是进行这些骨架转换时的两个常见错误之一。

  1. 您的矩阵转换顺序错误。请记住,A = A*B 与 A = B*A 不同。当您执行这种转换堆栈时,此顺序非常重要。
  2. 对象围绕错误的点旋转。通常它们围绕原点旋转。因此,如果您想围绕对象的中心旋转某些东西,则必须将图像平移到原点,旋转图像,然后将图像平移回原始位置。

不要放弃!这些转换可能很棘手,而且通常看起来完全混乱,而实际上代码非常接近正确。

于 2014-07-08T12:59:44.473 回答