剛体のアニメーションも、第2、第3項で説明した点のアニメーションと原理は全く同じです。剛体の場合、描画と消去の対象が3次元形状になるという違いがあるだけです。
例として、運動する直方体のアニメーションを作成してみましょう。これは、第6項で作成した一般配置の直方体を描画するスクリプトを基にして行えます。
まず、スクリプトを簡潔にするために、コード1に示すような、直方体を plot3d
で描画するためのパッチデータを返す関数を定義します。
function patches = calcBlock(r, R, Lx, Ly, Lz) // Return patches data of a block geometry // 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); endfunction
コード1の calcBlock()
関数を用いれば、第6項の一般配置の直方体を描画するスクリプトを、次のコード2のように簡潔に書き直すことができます。
// make_block.sce clear; xdel(winsid()); exec('eulerXYZ.sci', -1); exec('transver.sci', -1); exec('genpat.sci', -1); exec('calcBlock.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; // Patches patches = calcBlock(r, R, Lx, Ly, Lz); // 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;