Загрузка данных


# ═══════════════════════════════════════════════════════
#  Chicken Jockey Animation — Maple 3D
#  Зомби падает → курица несётся → сбивает стикмана
# ═══════════════════════════════════════════════════════
restart;
with(plots): with(plottools):

── ЦВЕТА ────────────────────────────────────────────────

sk := "#7EAA6E": sh := "#6B7FBF": pn := "#4F4F6A":
hr := "#1C140A": ey := "#CC2222":
sc := "SaddleBrown": rst := 0.05:

── КУРИЦА  (y-вверх, ноги в y=0, смотрит в −Z) ─────────

CH := display(
  cuboid([-0.5,0,-0.3],[-0.2,0.8, 0.3],color="Yellow"),
  cuboid([ 0.2,0,-0.3],[ 0.5,0.8, 0.3],color="Yellow"),
  cuboid([-0.8,0.8,-0.6],[ 0.8,1.8, 0.6],color="White"),
  cuboid([-1.1,1.0,-0.4],[-0.8,1.6, 0.4],color="White"),
  cuboid([ 0.8,1.0,-0.4],[ 1.1,1.6, 0.4],color="White"),
  cuboid([-0.3,1.2, 0.6],[ 0.3,1.6, 0.9],color="White"),
  cuboid([-0.5,1.8,-1.1],[ 0.5,2.6,-0.1],color="White"),
  cuboid([-0.15,2.1,-1.4],[0.15,2.4,-1.1],color="Yellow"),
  cuboid([-0.4,2.2,-1.1],[-0.2,2.4,-1.05],color="Black"),
  cuboid([ 0.2,2.2,-1.1],[ 0.4,2.4,-1.05],color="Black"),
  cuboid([-0.15,2.6,-0.9],[0.15,2.9,-0.3],color="Red"),
  cuboid([-0.6,1.8,-0.3],[ 0.6,1.95,0.3],color="Brown")
):

── ЗОМБИ  (y-вверх, сидит на курице) ───────────────────

ZM := display(
  cuboid([-0.22,1.78,-0.15],[-0.04,2.14, 0.13],color=pn),
  cuboid([ 0.04,1.78,-0.15],[ 0.22,2.14, 0.13],color=pn),
  cuboid([-0.27,2.14,-0.21],[ 0.27,2.72, 0.21],color=sh),
  cuboid([-0.55,2.30,-0.58],[-0.27,2.65,-0.19],color=sk),
  cuboid([ 0.27,2.30,-0.58],[ 0.55,2.65,-0.19],color=sk),
  cuboid([-0.36,2.72,-0.36],[ 0.36,3.44, 0.36],color=sk),
  cuboid([-0.36,3.20,-0.36],[ 0.36,3.44, 0.36],color=hr),
  cuboid([-0.36,2.72, 0.20],[ 0.36,3.44, 0.36],color=hr),
  cuboid([-0.36,2.90,-0.36],[-0.30,3.44, 0.20],color=hr),
  cuboid([-0.31,3.02,-0.37],[-0.10,3.22,-0.34],color="White"),
  cuboid([ 0.10,3.02,-0.37],[ 0.31,3.22,-0.34],color="White"),
  cuboid([-0.28,3.04,-0.38],[-0.13,3.19,-0.35],color=ey),
  cuboid([ 0.13,3.04,-0.38],[ 0.28,3.19,-0.35],color=ey),
  cuboid([-0.07,2.93,-0.37],[ 0.07,3.02,-0.34],color=sk),
  cuboid([-0.20,2.82,-0.37],[ 0.20,2.91,-0.34],color="#2E1810"),
  cuboid([-0.16,2.84,-0.38],[-0.07,2.90,-0.35],color="White"),
  cuboid([ 0.07,2.84,-0.38],[ 0.16,2.90,-0.35],color="White")
):

── РИНГ  (переписан: y-вверх, мат в плоскости XZ) ──────

L:=6: Hp:=1.3: rp:=0.07: rr:=0.03: mt:=0.2:
ry := [0.45, 0.85, 1.25]:

mat_ring := cuboid([-L/2,-mt,-L/2],[L/2,0,L/2], color="Gray"):

cx := [[-3,-3],[3,-3],[3,3],[-3,3]]:
posts := [seq(
  plot3d([cx[i][1]+rp*cos(t), yy, cx[i][2]+rp*sin(t)],
    t=0..2*Pi, yy=0..Hp, color="Navy", style=surface, grid=[12,6]),
  i=1..4)]:

# Канаты горизонтально в плоскости XZ
mkr := proc(sd, h) local x1,z1,x2,z2:
  if   sd=1 then x1:=-3;z1:=-3;x2:=-3;z2:=3
  elif sd=2 then x1:=3;z1:=-3;x2:=3;z2:=3
  elif sd=3 then x1:=-3;z1:=-3;x2:=3;z2:=-3
  else            x1:=-3;z1:=3;x2:=3;z2:=3
  end if:
  tubeplot([x1+(x2-x1)*s, h, z1+(z2-z1)*s], s=0..1,
    radius=rr, color="Crimson", tubepoints=10)
end proc:
ropes := [seq(seq(mkr(sd,h), sd=1..4), h in ry)]:
RING := display(mat_ring, op(posts), op(ropes)):

── СТИКМАН  (параметрическая функция вращения вокруг ног) ─

# theta=0 → стоит, theta=Pi/2 → лежит (голова летит в -Z)
# Формула: точка (x,y,0) → (x, y·cos θ, -y·sin θ + pz)
make_stick := proc(theta, pz)
  local c, s:
  c := evalf(cos(theta)): s := evalf(sin(theta)):
  display(
    sphere([0, 2.1*c, -2.1*s+pz], 0.22, color=sc),
    tubeplot([0, (0.8+1.2*u)*c, -(0.8+1.2*u)*s+pz],
      u=0..1, radius=rst, color=sc),          # тело
    tubeplot([-0.6*u, (1.8-0.4*u)*c, -(1.8-0.4*u)*s+pz],
      u=0..1, radius=rst, color=sc),          # лев рука
    tubeplot([ 0.6*u, (1.8-0.4*u)*c, -(1.8-0.4*u)*s+pz],
      u=0..1, radius=rst, color=sc),          # прав рука
    tubeplot([-0.28*u, 0.8*(1-u)*c, -0.8*(1-u)*s+pz],
      u=0..1, radius=rst, color=sc),          # лев нога
    tubeplot([ 0.28*u, 0.8*(1-u)*c, -0.8*(1-u)*s+pz],
      u=0..1, radius=rst, color=sc)           # прав нога
  )
end proc:

── ПАРАМЕТРЫ АНИМАЦИИ ───────────────────────────────────

Nf    := 90:    # всего кадров
p1    := 28:    # зомби приземляется на курицу
p2    := 62:    # курица сбивает стикмана
ch_z0 := 2.2:   # стартовая Z курицы (у края ринга)
sm_z  := -2.0:  # Z стикмана (у другого края)

── ПОСТРОЕНИЕ ОДНОГО КАДРА ──────────────────────────────

frame := proc(i)
  local t, z_ch, y_zm, y_bounce, y_bob, theta_sm, CHICK, ZOMBI, STICK:

  # Позиция Z курицы (линейный разгон от p1 до p2)
  if i <= p1 then
    z_ch := ch_z0:
  else
    t := evalf(min(1.0, (i-p1)/(p2-p1))):
    z_ch := evalf(ch_z0 + (sm_z - ch_z0)*t):
  end if:

  # Высота зомби над курицей (гравитация: y ~ 1−t²)
  if i <= p1 then
    t := evalf(i/p1):
    y_zm := evalf(3.5 * (1 - t^2)):
  else
    y_zm := 0:
  end if:

  # Пружинящий отскок при приземлении (кадры p1..p1+6)
  if i >= p1 and i <= p1+6 then
    y_bounce := evalf(-0.12 * sin(Pi*(i-p1)/6)):
  else
    y_bounce := 0:
  end if:

  # Боббинг при беге (|sin| — подбрасывание на каждом шаге)
  if i > p1 and i <= p2 then
    t := evalf((i-p1)/(p2-p1)):
    y_bob := evalf(0.07 * abs(sin(5*Pi*t))):
  else
    y_bob := 0:
  end if:

  # Угол падения стикмана (0 → Pi/2 после столкновения)
  if i < p2 then
    theta_sm := 0:
  else
    t := evalf(min(1.0, (i-p2)/(Nf-p2))):
    theta_sm := evalf((Pi/2) * t):
  end if:

  # Курица и зомби движутся вместе по Z;
  # зомби дополнительно смещён вверх на время падения
  CHICK := translate(CH, 0, y_bounce+y_bob, z_ch):
  ZOMBI := translate(ZM, 0, y_zm+y_bounce+y_bob, z_ch):
  STICK := make_stick(theta_sm, sm_z):

  display(RING, CHICK, ZOMBI, STICK)
end proc:

── ЗАПУСК ───────────────────────────────────────────────

display(
  [seq(frame(i), i=1..Nf)],
  insequence  = true,
  scaling     = constrained,
  axes        = none,
  view        = [-4..4, -0.3..5.5, -4.5..4],
  orientation = [45, 65],
  lightmodel  = light2,
  size        = [800, 650]
);