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

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

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

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

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

Euler2R.sci
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;

endfunction
コード1: オイラー角を姿勢行列に変換するScilab関数

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

r = Location;
R = Orientation;

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

// Vertices
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

endfunction
コード2: 直方体の頂点の座標を計算するScilab関数

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

// Patches
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

endfunction
コード3: 直方体のパッチ作成用データを計算するScilab関数

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

make_block.sce
// make_block.sce

clear; xdel(winsid());

exec('Euler2R.sci',-1);
exec('GeoVerMakeBlock.sci',-1);
exec('GeoPatMakeBlock.sci',-1);

// 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 patch
figure(1);
plot3d(PatchData_X,PatchData_Y,PatchData_Z);
h_fac3d = gce();
h_fac3d.color_mode = 4;
h_fac3d.foreground = 1;
h_fac3d.hiddencolor = 4;

// Axes settings
xlabel("x",'fontsize',2);
ylabel("y",'fontsize',2);
zlabel("z",'fontsize',2);
h_axes = gca();
h_axes.font_size = 2;
h_axes.isoview = "on";
h_axes.box = "off";
h_axes.rotation_angles = [63.5,-127];
h_axes.data_bounds = [0.8,0.9,0.8;1.3,1.4,1.3];
xgrid;
コード4: 直方体を作成するScilabスクリプト