MATLABでゆるキャラを3D描画

MATLABのplot3()を悪用してゆるキャラ（？）を3D描画し、動画に書き出しまでの方法になります。

ときどき描き方の問い合わせをいただくので、いい機会だと思ってまとめました。

元々は私が半趣味で書いたコードですので「動けばヨシ！」のノリで書かれています。力技での実装ですので、重いかもしれません。

##今回描くもの
![riroshi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677514/4414ae99-3aa3-901d-0eb5-332ffab9857f.png)
可愛いですね。どこぞの大学のどこぞの語学クラスのゆるキャラです。
え、見覚えがある？　きっと気のせいですよ。

噂ではよく燃やされたりしているそうな。
~~因みに怒られたらこの記事は消えます（）~~

##コード
```matlab:DrawPicture.m
figure();
hold on;
% 円を描くのに使用
% ここで細かく刻むと綺麗になる
t = (0:0.2:6.4);
% 描画精度
% ここでdeltaを小さくすると綺麗になる
delta = 0.05;
% frame数の管理
f = 1;
% はじめの視野角
view([0 22]);
axis equal;
grid on;

% ここから描画
% 足
for ii = (0:delta:2.8)
    plot3(-1.75+(1.2+ii/2.8*0.3)*cos(t), (1.2+ii/2.8*0.3)*sin(t), ones(size(t))*ii, 'r-')
    plot3( 1.75+(1.2+ii/2.8*0.3)*cos(t), (1.2+ii/2.8*0.3)*sin(t), ones(size(t))*ii, 'r-')
    drawnow;
    movie(f) = getframe(gcf);
    f = f+1;
end

% 赤ー底面
for ii = (0:delta:3.25)
    plot3(ii*cos(t), ii*sin(t), ones(size(t))*2.8, 'r-')
    drawnow;
    movie(f) = getframe(gcf);
    f = f+1;
end

% 赤ー腰
for ii = (2.8:delta:3.6)
    plot3(3.25*cos(t), 3.25*sin(t), ones(size(t))*ii, 'r-')
    drawnow;
    movie(f) = getframe(gcf);
    f = f+1;
end

% 胴体
for ii = (3.6:delta:9)
    plot3(3.25*cos(t), 3.25*sin(t), ones(size(t))*ii, 'b-')
    drawnow;
    movie(f) = getframe(gcf);
    f = f+1;
end

% 頭部
for ii = (9:delta:10.6)
    plot3(3.25*cos(t), 3.25*sin(t), ones(size(t))*ii, 'w-')
    drawnow;
    movie(f) = getframe(gcf);
    f = f+1;
end
for ii = (10.6:delta:13.85)
    plot3(sqrt(3.25*3.25-(ii-10.6)*(ii-10.6))*cos(t), sqrt(3.25*3.25-(ii-10.6)*(ii-10.6))*sin(t), ones(size(t))*ii, 'w-')
    drawnow;
    movie(f) = getframe(gcf);
    f = f+1;
end

% そで
for ii = (0:delta:0.7)
    plot3(ones(size(t))*( 3.25+ii), sin(t), ones(size(t))*(9-ii/2)+cos(t), 'b-')
    plot3(ones(size(t))*(-3.25-ii), sin(t), ones(size(t))*(9-ii/2)+cos(t), 'b-')
    drawnow;
    movie(f) = getframe(gcf);
    f = f+1;
end
% うで
for ii = (0:delta:1.6)
    plot3(ones(size(t))*( 3.25+ii), 0.8*sin(t), ones(size(t))*(9-ii/2)+0.8*cos(t), 'w-')
    plot3(ones(size(t))*(-3.25-ii), 0.8*sin(t), ones(size(t))*(9-ii/2)+0.8*cos(t), 'w-')
    drawnow;
    movie(f) = getframe(gcf);
    f = f+1;
end
for ii = (1.6:delta:1.8)
    plot3(ones(size(t))*( 3.25+ii), (2-ii)*2*sin(t), ones(size(t))*(9-ii/2)+(2-ii)*2*cos(t), 'w-')
    plot3(ones(size(t))*(-3.25-ii), (2-ii)*2*sin(t), ones(size(t))*(9-ii/2)+(2-ii)*2*cos(t), 'w-')
    drawnow;
    movie(f) = getframe(gcf);
    f = f+1;
end

% 目
plot3(ones(size(t))*( 1)+0.6*cos(t), ones(size(t))*(-3.25), ones(size(t))*12+0.8*sin(t), '-k','LineWidth',2)
plot3(ones(size(t))*(-1)+0.6*cos(t), ones(size(t))*(-3.25), ones(size(t))*12+0.8*sin(t), '-k','LineWidth',2)
drawnow;
movie(f) = getframe(gcf);
f = f+1;
for ii=(0:0.1:1)
    plot3(ones(size(t))*( 1)+0.4*ii*cos(t), ones(size(t))*(-3.25), ones(size(t))*12.3+0.4*ii*sin(t), '-k','LineWidth',2)
    plot3(ones(size(t))*(-1)+0.4*ii*cos(t), ones(size(t))*(-3.25), ones(size(t))*12.3+0.4*ii*sin(t), '-k','LineWidth',2)
end
drawnow;
movie(f) = getframe(gcf);
f = f+1;

% 口
for ii=(0:0.1:0.8)
    plot3([-ii*0.9 ii*0.9], [-3.25 -3.25], [9.4+ii 9.4+ii], '-r','LineWidth',2)
    drawnow;
    movie(f) = getframe(gcf);
    f = f+1;
end
 
plot3([-0.8 0.8], [-3.25 -3.25], [10.2 10.2], '-k','LineWidth',2)
plot3([-0.8 0],   [-3.25 -3.25], [10.2 9.4],  '-k','LineWidth',2)
plot3([0.8 0],    [-3.25 -3.25], [10.2 9.4],  '-k','LineWidth',2)
drawnow;
movie(f) = getframe(gcf);
f = f+1;

% 頬
plot3( 1,   -3.25, 10.8, 'r.','MarkerSize',15)
plot3(-1,   -3.25, 10.8, 'r.','MarkerSize',15)
plot3( 1.5, -3.25, 10.9, 'r.','MarkerSize',15)
plot3(-1.5, -3.25, 10.9, 'r.','MarkerSize',15)
drawnow;
movie(f) = getframe(gcf);
f = f+1;

% 回転
for ii = (0:10:360)
view([ii 22])
drawnow;
movie(f) = getframe(gcf);
f = f+1;
end

% 描画終わり

% 動画書き出し
% ちょっと時間がかかります
v = VideoWriter('YuruChara.mp4', 'MPEG-4');
v.FrameRate = 30;
open(v);
writeVideo(v, movie)
close(v);
```

###余談
このゆるキャラ、五月祭とか駒場祭とかに行くと本物に会えるとか会えないとか。
（昨年は残念ながら無理でしたが）