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

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

図1のような一般配置の直方体は、一角に張り付いた形状基準枠の位置と回転姿勢および3辺の長さ(Lx, Ly, Lz)で定義できます。形状基準枠の位置座標ベクトルを r 、回転行列を R とすれば、頂点の座標は次の式で求まります。

equation_vertex_general

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



block_general

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

一般配置の直方体を作成するScilabスクリプトをコード1に、このスクリプトによる描画の結果を図2にそれぞれ示します。スクリプト中で使用されている関数 eulerXYZ() は、XYZオイラー角を回転行列に変換する関数で、コード2のように定義されます。また、関数 transver() は、上記の座標変換式に従って頂点群を変換する関数で、コード3のように定義されます。

make_block_general.sce
// make_block_general.sce

clear; xdel(winsid());

exec('eulerXYZ.sci', -1);
exec('transver.sci', -1);
exec('genpat.sci', -1);

// 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
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 = transver(vertices_0, r, R);

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

// Patches
patches = genpat(vertices, faces);

// Draw patches
h_fig = figure;
h_fig.background = 8;
h_pat = plot3d(patches.x, patches.y, patches.z);
h_pat.color_mode = 4;
h_pat.foreground = 1;
h_pat.hiddencolor = 4;

// Axes settings
xlabel("x"); ylabel("y"); zlabel("z");
h_axes = gca();
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;
コード1: 直方体を作成するScilabスクリプト(一般配置)
eulerXYZ.sci
function R = eulerXYZ(a1, a2, a3)
// Convert XYZ Euler angles to rotation matrix

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
コード2: XYZオイラー角を回転行列に変換するScilab関数
transver.sci
function vertices = transver(vertices_0, r, R)
// Transform vertices by translation vector r and rotation matrix R

vertices = repmat(r', size(vertices_0, 1), 1) + vertices_0*R';

endfunction
コード2: 頂点群を座標変換するScilab関数
make_block_general
図2: 6個の面を組み合わせて作成した直方体(一般配置)
スポンサーリンク