Home > リソース > MATLABでアニメーション作成 > 9. 運動する直方体のアニメーション〜準備
MATLABでアニメーション作成

9. 運動する直方体のアニメーション〜準備

剛体のアニメーションも、第2、第3項の点のアニメーションと原理は全く同じです。剛体の場合、描画と消去の対象が3次元形状になるという違いがあるだけです。

例として、運動する直方体のアニメーションを作成してみましょう。これは、第6項の直方体を描画するスクリプトを基にして行えます。

まず、スクリプトを簡潔にするために、次の3つのMATLAB関数を定義します。

Euler2R.m
function R = Euler2R(A)

% Euler angle -> Orientation matrix
a1 = A(1);
a2 = A(2);
a3 = A(3);

R1 = [1, 0, 0;
    0, cos(a1), -sin(a1);
    0, sin(a1), cos(a1)];

R2 = [cos(a2), 0, sin(a2);
    0, 1, 0;
    -sin(a2), 0, cos(a2)];

R3 = [cos(a3), -sin(a3), 0;
    sin(a3), cos(a3), 0;
    0, 0, 1];

R = R1*R2*R3;
コード1: オイラー角を姿勢行列に変換するMATLAB関数

GeoVerMakeBlock.m
function VertexData = GeoVerMakeBlock(Location,Orientation,SideLength)

r = Location;
R = Orientation;

Lx = SideLength(1);
Ly = SideLength(2);
Lz = SideLength(3);

VertexData_0 = [Lx*ones(8,1), Ly*ones(8,1), Lz*ones(8,1)]...
    .*[0,0,0;
    1,0,0;
    0,1,0;
    0,0,1;
    1,1,0;
    0,1,1;
    1,0,1;
    1,1,1];

n_ver = 8;

for i_ver=1:n_ver
    
    VertexData(i_ver,:) = r + VertexData_0(i_ver,:)*R';
end
コード2: 直方体の頂点の座標を計算するMATLAB関数

GeoPatMakeBlock.m
function [PatchData_X,PatchData_Y,PatchData_Z] = GeoPatMakeBlock(VertexData)

Index_Patch = ...
    [1,2,5,3;
    1,3,6,4;
    1,4,7,2;
    4,7,8,6;
    2,5,8,7;
    3,6,8,5];

n_pat = 6;

for i_pat=1:n_pat
    
    PatchData_X(:,i_pat) = VertexData(Index_Patch(i_pat,:),1);
    PatchData_Y(:,i_pat) = VertexData(Index_Patch(i_pat,:),2);
    PatchData_Z(:,i_pat) = VertexData(Index_Patch(i_pat,:),3);
end
コード3: 直方体のパッチ作成用データを計算するMATLAB関数

上記の3つのMATLAB関数を用いれば、第6項の直方体を描画するスクリプトを次のコード4のように書き直すことができます。

make_block.m
% make_block.m

clear; close all;

% Block specification
r = [1,1,1];          % Reference position
A = [-pi/3, 0, pi/6]; % Reference orientation (x-y-z Euler angle)

Lx = 0.15;
Ly = 0.05;
Lz = 0.30;

% Euler angle -> Orientation matrix
R = Euler2R(A);

% Vertices
VertexData = GeoVerMakeBlock(r,R,[Lx,Ly,Lz]);

% Patches
[PatchData_X,PatchData_Y,PatchData_Z] = GeoPatMakeBlock(VertexData);

% Draw patches
figure(1);
h = patch(PatchData_X,PatchData_Y,PatchData_Z,'y');
set(h,'FaceLighting','phong','EdgeLighting','phong');
set(h,'EraseMode','normal');

% Axes settings
xlabel('x','FontSize',14);
ylabel('y','FontSize',14);
zlabel('z','FontSize',14);
set(gca,'FontSize',14);
axis vis3d equal;
view([-37.5,30]);
camlight;
grid on;
xlim([0.8,1.3]);
ylim([0.9,1.4]);
zlim([0.8,1.3]);
コード4: 直方体を作成するMATLABスクリプト