Home > リソース > MATLABでアニメーション作成 > 6. 3次元形状を作る〜直方体(2)
MATLABでアニメーション作成

6. 3次元形状を作る〜直方体(2)

図1のように、任意の直方体は一角に張り付いた相対座標系の位置と姿勢、および3辺の長さ(Lx,Ly,Lz)で決まります。相対座標系の位置を r 、姿勢行列を R とすれば、頂点の座標は次の式で求まります。

equation_vertex_general

ここで p0i は基本配置における頂点の座標です。頂点の座標が求まれば、6個のパッチを前項と同様に作成して直方体を作ることができます。



block_general

図1: 直方体(一般の場合)

一般の直方体を作成するMATLABスクリプトをコード1に、このスクリプトによって作成された直方体を図2にそれぞれ示します。コード中の A は参照座標系の姿勢を表すオイラー角(x-y-z)です。

make_block_general.m
% make_block_general.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
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;

% 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

% 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
    
    % Patches data
    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

% 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]);
コード1: 直方体を作成するMATLABスクリプト(一般)


make_block_general

図2: パッチを組み合わせて作成した直方体(一般)