基于面片和hg变换的matlab刚体动画

基于面片和hg变换的matlab刚体动画,matlab,animation,transform,matlab-figure,rigid-bodies,Matlab,Animation,Transform,Matlab Figure,Rigid Bodies,我正在尝试使用给定的平移和方向数据执行人体动画。我有一组刚体分段,使用以(0,0,0)为中心的面片来表示人体,并进行相应的转换。我已经为它们中的每一个建立了一个层次结构,并为每个刚体段执行了一个变换矩阵。肢体分段开始相互偏移并产生问题。例如,手臂的刚体移动时,就好像它没有相对原点一样,即使它遵循正确的运动。该运动类似于从面片重心移动刚体?然而,它应该在一端固定的情况下移动,而另一端跟随翻译数据。有人能告诉我我做错了什么吗?我的代码布局如下: % Body segment lengths xlen

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

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

  • 矩阵变换的顺序错误。请记住,A=A*B与A=B*A不是一回事。当您进行这种转换堆栈时,此顺序非常重要
  • 对象围绕错误的点旋转。通常它们围绕原点旋转。因此,如果你想让物体围绕物体的中心旋转,你必须将图像转换到原点,旋转图像,将图像转换回原始位置

  • 不要放弃!这些转换可能很棘手,通常情况下,它看起来完全混乱,而实际上代码几乎是正确的。

    能否提供一个工作代码示例,以便人们可以将其复制并粘贴到脚本中,以快速查看发生了什么事?不过,我可以尝试,这个数据来自一个动作捕捉文件,所以有数千个行和几十个列。感谢输入,我会考虑更多。但是,旋转最初从原点开始,然后平移到另一个点,请参见leftupperarmT。我的问题是,面片刚体在移动时两端都在移动,而不是一端仍然附着在一个点上,而另一端根据运动数据移动。