読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

(4) 3次元剛体アニメーション

正五角錐を回転させるアニメーションを製作しましょう。

/* 3.4.1m.mac */
load(draw)$

xyz2polar(v) := block([r : sqrt(v[1]^2 + v[2]^2 + v[3]^2)], [r, acos(v[3]/r), mod(atan2(v[2], v[1]), 2*%pi)])$

t : makelist(ev([cos(a), sin(a), 0], a = 2*%pi*j/5), j, 0, 5)$
apex : [0, 0, 1.5]$
pentapyramid : makelist(triangle(t[n], t[mod(n, 5) + 1], apex), n, 1, 5)$

N : 30$
for j : 0 thru N - 1 do
  block([p : xyz2polar([10, -30*sin(2*%pi*j/N), -30*cos(2*%pi*j/N)]), k : 0],
    while k < 10000 do k : k + 1,
    draw3d(axis_3d = false, xtics = false, ytics = false, ztics = false, view = [360/(2*%pi)*p[2], 360/(2*%pi)*p[3]], pentapyramid))$


使用した機能

3次元での表面を描画する時にはplot3d、それ以外の描画にはdraw(3d)を使います。


正n角錐を生成する関数を用意して、同様のことをしてみましょう。例は正七角錐。

/* 3.4.2m */
Shape(n) := block(
  [j, pts, sides, apex : [0, 0, 0.1]],
  pts : makelist([cos(2*%pi*j/n), sin(2*%pi*j/n), 0], j, 0, n),
  sides : makelist(triangle(apex, pts[i], pts[i + 1]), i, 1, n)
  )$

for j : 0 thru N - 1 do
([p : xyz2polar([10, -30*sin(2*%pi*j/N), -30*cos(2*%pi*j/N)]), k : 0],
  while k < 10000 do k : k + 1,
  draw3d(axis_3d = false, xtics = false, ytics = false, ztics = false, view = [360/(2*%pi)*p[2], 360/(2*%pi)*p[3]], Shape(7)))$