剛体のアニメーションも、第2、第3項で説明した点のアニメーションと原理は全く同じです。剛体の場合、描画と消去の対象が3次元形状になるという違いがあるだけです。
例として、運動する直方体のアニメーションを作成してみましょう。これは、第6項で作成した一般配置の直方体を描画するスクリプトを基にして行えます。
まず、スクリプトを簡潔にするために、コード1に示すような、直方体の頂点の座標(vertices
)と各面の頂点の結び方を指定する行列(faces
)を返す関数を定義します。
function [vertices, faces] = calcBlock(r, R, Lx, Ly, Lz) % Return vertices and faces of a block geometry vertices_0 = [ 0, 0, 0; % #1 Lx, 0, 0; % #2 0, Ly, 0; % #3 0, 0, Lz; % #4 Lx, Ly, 0; % #5 0, Ly, Lz; % #6 Lx, 0, Lz; % #7 Lx, Ly, Lz]; % #8 vertices = r' + vertices_0*R'; faces = [ 1, 2, 5, 3; % #1 1, 3, 6, 4; % #2 1, 4, 7, 2; % #3 4, 7, 8, 6; % #4 2, 5, 8, 7; % #5 3, 6, 8, 5]; % #6 end
コード1の calcBlock()
関数を用いれば、第6項の一般配置の直方体を描画するスクリプトを、次のコード2のように簡潔に書き直すことができます。
% make_block.m clear; close all; % Reference position r = [1; 1; 1]; % Reference orientation R = eulerXYZ(-pi/3, 0, pi/6); % Side lengths Lx = 0.15; Ly = 0.05; Lz = 0.30; % Vertices and faces [vertices, faces] = calcBlock(r, R, Lx, Ly, Lz); % Draw patch figure(1); h = patch('Faces', faces, 'Vertices', vertices, 'FaceColor', 'y'); % Axes settings xlabel('x'); ylabel('y'); zlabel('z'); 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]);