[Blender+MATLAB] 有限要素法解析を行い, グラデーションのついた文字を作る!!

今回使っている各ソフトのバージョン等は以下の通りです.

* blender 2.90.1
* MATLAB R2021a
* MATLAB Partial Differential Equation Toolbox

# はじめに
最近, ロゴマークを作らないといけないことがあった. しかし, 小学生のころから美術の成績の低さには自信があり, 自分で作れる気が全くしなかった. そこで, 数値計算できれいなコンター図を作ってもらおうと考え, 今回の問題に取り組んだ.

# Blenderから文字の.stlファイルを作成する
まず, blenderで解析を行う文字の3D形状を出力する. 今回はアルファベットの"M"を題材として行う.
**注意: 解析は閉じた形状について行うため, 1回に行えるのは１文字である.**

参考にしたサイト
> https://blender-cg.net/3d-text/

まず, Blenderを開く.
![blender_initial.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/b3ce4ef7-6d82-a762-0bda-d77c2925ab0d.png)


次に, Add>TextでTextを追加する.
![blender_add_text.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/f0058da2-62d9-520a-2cf5-695a4ea88c01.png)

その後, tabキーを押して, 解析を行いたい文字を入力する. また, フォントなどもこの時に指定する.
![blender_edt_text.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/89bffb19-1675-6f5d-56fd-77f9cee86c96.png)


そして, 文字の形状を.stlファイルとして出力する. (今回はこのファイルをletter-M.stlとして保存した)
![blender_save_stl.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/fa9a44af-afa6-9c82-7c91-b8683c5d03fd.png)


# MATLABにより静解析を行う
今回は以下のサイトを参考にして, 文字を構造物とした有限要素法解析を行った.

> https://jp.mathworks.com/help/pde/ug/stress-concentration-in-plate-with-circular-hole.html

## 静解析モデルの作成と.stlファイルのインポート
まず, 以下で2D構造静解析のモデルを作成し, 文字形状のデータをインポートする.([createpde](https://jp.mathworks.com/help/pde/ug/createpde.html?searchHighlight=createpde&s_tid=srchtitle), [importGeometry](https://jp.mathworks.com/help/pde/ug/pde.pdemodel.importgeometry.html))

```code:matlab
model = createpde('structural','static-planestress');
importGeometry(model,'letter-M.stl');

figure
pdegplot(model,'VertexLabel','on','EdgeLabel','on');
```

このコードを実行したときにエラーが出る場合は, 文字形状が閉じていない可能性がある. そのようなときは, [Meshlab](https://www.meshlab.net/)を用いて不具合部分のメッシュを取り除き再度.stlファイルを作成してからインポートする.

![letter-M_model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/30d93fce-ede3-7822-019a-315a239853bb.png)

## 材料定数と境界条件の付加
次に, 材料特性を付加する. 今回は, ヤング率 0.2[MPa], ポアソン比 0.25とした. ([structuralProperties](https://jp.mathworks.com/help/pde/ug/pde.structuralmodel.structuralproperties.html))

```code:matlab
structuralProperties(model,'YoungsModulus',200E3,'PoissonsRatio',0.25);
```

また, インポート時に作成したfigureを参照しながら, y=0の部分に境界条件x=0,y=0を付加する. ([structuralBC](https://jp.mathworks.com/help/pde/ug/pde.structuralmodel.structuralbc.html))

```code:matlab
structuralBC(model,'Edge',5,'XDisplacement',0,'YDisplacement',0);
structuralBC(model,'Edge',15,'XDisplacement',0,'YDisplacement',0);
```

そして, 真ん中にy軸負の方向に荷重を付加した. ([structuralBoundaryLoad](https://jp.mathworks.com/help/pde/ug/pde.structuralmodel.structuralboundaryload.html))

```code:matlab
structuralBoundaryLoad(model,'Edge',8,'SurfaceTraction',[0;-200]);
```

## メッシュの作成
次に, モデルからメッシュを作成した. ([generateMesh](https://jp.mathworks.com/help/pde/ug/generate-mesh.html))

```matlab:code
generateMesh(model,'Hmax',0.01);

figure
pdemesh(model)
```

![letter-M_mesh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/6b1f0a94-c715-49ac-2666-331422435907.png)

## 求解
これまでに作った解析モデルで有限要素法解析を実施する.

```code:matlab
R = solve(model);
```

## 可視化

```code:matlab
figure
pdeplot(model,'XYData',R.Stress.syy,'ColorMap','jet')
axis equal
title('Stress yy');
```

![letter-M_stressy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/416a5327-29d1-5fac-3daf-da5f29969b24.png)

MATLABのいいところは, この結果を様々な[カラーマップ](https://jp.mathworks.com/help/matlab/ref/colormap.html)で表示できるところである. 例えば...

```code:matlab
figure
pdeplot(model,'XYData',R.Displacement.y,'ColorMap','winter')
axis equal
title('Displacement y');
```

![letter-M_dispy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/0555aed2-ec40-b86c-a911-fa85aab10d9b.png)

もちろん[変形後形状の可視化](https://jp.mathworks.com/help/pde/ug/pdeplot.html)することもできる. 

# おわりに
今回は, 文字を構造物とした有限要素法解析を実施して, 連続的なグラデーションを持った文字の作成を行った. もちろんこの方法は, 文字でなくても閉じた形状の.stlファイルを準備できれば応用が可能である.