Power Pointで3Dモデルを専用ソフトウェアなしで表示させたい！

これは、とある金融機関（PCセキュリティがちがち、ソフトウェアインストール一切不可、装備はOffice365とメモ帳、インターネット接続に著しい制限）で戦うサラリーマンの物語である。

# Power Pointで3Dをぐりぐり動かしたいんじゃ
課長からそう言われた俺は、Power Pointを立ち上げ、「挿入＞3Dモデル＞3Dモデルのストック」を押す。そして、ここから素敵な3Dを選択する。簡単すぎるぜ。
<img width="600" alt="PowerPointに3Dモデルを挿入" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554761/d47b1426-90ef-3936-552c-ddfda6e73248.png">


## ぼけぇ！俺の顔写真入りの3DをPower Pointでぐりぐりうごかせるようにせぇ！
ふと気が付くと、俺は課長に怒鳴られていた。既存の3Dモデルの挿入ではお気に召さないらしい。仕方ない。次なる手段を提案するか。

  **「課長、Blenderか六角王（←古い）をつかって3Dモデルを作ってPowerPointで読み込めばいいですよ 」**  

やっぱり俺って頭いい！

## じゃあ、やって。ちなみに、会社のPCにソフトウェアインストールするの禁止だからね。ルールやぶったらセキュリティ研修受けて反省文書いてもらうよ。

かくして、俺の「無理ゲー：謎の会社セキュリティをかいくぐり課長の顔社員入りの3DをPowerPointに読み込め」チャレンジが始まった。

## 何はともあれ、やってみよう。
Power Pointの機能で、3Dオブジェクトのファイルを読み込む機能はある。
例えば、obj形式、3mf形式、ply形式だそうだ。
このうち一つの形式を、会社のPCに入っている「メモ帳」と「PowerPoint」を使って作ることができればいいんだな。（後からわかるが、zip圧縮も使うことになる）
とりあえず、ググって情報が多そうな3mf形式を選ぶ。ここからは、「メモ帳」で3mf形式を作ることに全力を注ぐ。

## 情報源
3mf形式の公式情報は以下のページにあるっぽい。

https://3mf.io/spec/

でも、正直見てもよくわからん。きっと、しっかりとした情報が書いてあると思うのだが。。英語だしよくわからん。

ただ、

https://github.com/3MFConsortium/spec_core/blob/master/3MF%20Core%20Specification.md#11-package

このページに

> The 3MF Document format MUST use a ZIP archive for its physical model. 

と書いてある。どうやら、3mfファイルの正体はzipファイルらしく、関係するファイルをすべて圧縮しているとのこと。これがわかれば、3mfファイルのサンプルを探して、実際に中身を見てみよう。
サンプルをあさっていたら、このページにあるようだ。

https://github.com/3MFConsortium/3mf-samples/tree/master/examples

まずは、基本的な構造をさぐるために、「core」フォルダにある「box.3mf」をダウンロードしてみる。

## 早速中身をみていく
先ほど知った、3mfファイルの実態はzipファイルということを利用して、ダウンロードした「box.3mf」を「box.zip」ファイルにリネーム。圧縮ファイルを解凍してみる。
(あ、元のbox.3mfはコピーして置いといてね。後で使うので。)
すると中身はこんな感じ。

```
.
└── box/
　　　　├── [Content_Types].xml
　　　　├── _rels/
　　　　│   └── .rels
　　　　└── 3D/
　　　　　└── 3dmodel.model

```
入っているファイルは、「[Content_Types].xml」と「.rels」と「3dmodel.model」の3つだけ。
これらのファイルはすべてメモ帳で開くことができた。
そして、「.xml」というファイルがあることからも想像できるが**すべてxml形式で書かれている**。これは重要なことなので覚えておこう。

「[Content_Types].xml」と「.rels」は中身を見るに、ファイル形式やら「3dmodel.model」ファイルがどこにあるかを指定しているだけなので、フォルダ構造を変えなければそのままコピーして使えそうだ。
つまりは、「3dmodel.model」さえ書き換えることができたら、自由に3Dモデルを作れそう。


## 3dmodel.model
早速、box.3mfの「3dmodel.model」をメモ帳で開けてみよう。
お、、、長い。。。。長いよ。


```
<?xml version="1.0" encoding="UTF-8"?>
<model unit="millimeter" xml:lang="en-US" xmlns="http://schemas.microsoft.com/3dmanufacturing/core/2015/02">
  <metadata name="Copyright">Copyright (c) 2015 3MF Consortium. All rights reserved.</metadata>
  <resources>
    <object id="1" type="model">
      <mesh>
        <vertices>
          <vertex x="0" y="0" z="0" />
          <vertex x="10" y="0" z="0" />
          <vertex x="10" y="20" z="0" />
          <vertex x="0" y="20" z="0" />
          <vertex x="0" y="0" z="30" />
          <vertex x="10" y="0" z="30" />
          <vertex x="10" y="20" z="30" />
          <vertex x="0" y="20" z="30" />
        </vertices>
        <triangles>
          <triangle v1="3" v2="2" v3="1" />
          <triangle v1="1" v2="0" v3="3" />
          <triangle v1="4" v2="5" v3="6" />
          <triangle v1="6" v2="7" v3="4" />
          <triangle v1="0" v2="1" v3="5" />
          <triangle v1="5" v2="4" v3="0" />
          <triangle v1="1" v2="2" v3="6" />
          <triangle v1="6" v2="5" v3="1" />
          <triangle v1="2" v2="3" v3="7" />
          <triangle v1="7" v2="6" v3="2" />
          <triangle v1="3" v2="0" v3="4" />
          <triangle v1="4" v2="7" v3="3" />
        </triangles>
      </mesh>
    </object>
  </resources>
  <build>
    <item objectid="1" />
  </build>
</model>

```
/
でも、落ち着いてみると、初めの何行かは「おまじない」っぽいものがあって、そのあとに 
`<mesh>`タグで囲まれているやつがある。そしてその中に`<vertex>`タグがいくつかと、`<triangle>`タグがいくつか続いている。

お、これはわかるぞ。**おじさんでもこれはわかるぞーー！** :relaxed:

Vertex = 頂点！
つまり、`<vertex>`タグでは、頂点を作ってるんだな。タグの中にある、x,y,zというのもx座標、y座標、z座標を現している。
box.3mfのサンプルでは、「box=立方体」なので全部で8個の頂点(vertex)が書かれている。

ほうほう。そして、次は`<triangle>`。つまり三角形ね。
タグの中には、必ずv1, v2, v3がある。これは三角形の頂点をを現しているのだろう。しかし、v1="3"のように書かれた謎の番号。3ってなんじゃ？でも、よくよくみると、この番号0番～7番まであ～るじゃないですか。
0～7ということは全部で８個！これは頂点の番号を現しているに違いない！
きっと、`<vertex>`タグで書かれた頂点は、書かれた順番に0、１、２、３・・・と番号が自動的に降られていて、`<triangle>'タグではどの頂点を使って三角形を作るのかを指定しているのね。

はて、でも僕の知ってる立方体は三角形ではなく、正方形が6面でできているんご。
なんで、ここには三角形が12個も定義されているんだ？

神の声:angel_tone1:
**それは、正方形が2つの三角形の組み合わせで作れるからですよ:cactus:**


Thank You Angel!!　よくわかったぜ。

## 修正してみる
でも、この3dmodel.modelの`<vertex>`をよく見ると、立方体（サイコロ）じゃなくて直方体になっているね。

``` 
<vertex x="0" y="0" z="0" />
<vertex x="10" y="0" z="0" />
<vertex x="10" y="20" z="0" />
<vertex x="0" y="20" z="0" />
<vertex x="0" y="0" z="30" />
<vertex x="10" y="0" z="30" />
<vertex x="10" y="20" z="30" />
<vertex x="0" y="20" z="30" />
```
xは0か10になっているけど、yは0か20、zは0か30になっちゃっている。
これだと、x方向の長さが10、y方向の長さが20、z方向の長さが30の直方体になってしまうね。

だから、次のようにコードを直す。

```diff
<vertex x="0" y="0" z="0" />
<vertex x="10" y="0" z="0" />
<vertex x="10" y="10" z="0" />
<vertex x="0" y="10" z="0" />
<vertex x="0" y="0" z="10" />
<vertex x="10" y="0" z="10" />
<vertex x="10" y="10" z="10" />
<vertex x="0" y="10" z="10" />
```

## 修正したファイルをもう一度3mfファイルに
ここまでで、3dmodel.modelを修正し、保存することができた。
それでは、修正したファイルを使って3mfファイルを作ろう。

といっても、簡単で、解凍した（そしてその中の3dmodel.modelを修正した）boxフォルダを、zipで再圧縮すればよいだけ。
ちなみに、再圧縮しただけだとファイル名が「box.zip」になるので「box.3mf」にリネームしてあげましょう。

### ここで注意！！🐻
私は7zipを使っているのですが、普通にzipに圧縮して3mfにリネームするだけだとうまくいきませんでした。（あとでPowerPointで読み込もうとしたらエラーになって読み込めませんでした。）
どうやら、圧縮するときに「圧縮レベル」を「9 - 超圧縮」にしないと、3mfとしてPowerPointは認識してくれないようですので、お気を付けを。（他の圧縮ソフトでは事情がわからないのですが、もしうまくいかないときは、7zipをお試しください）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554761/4f3f9583-08e5-b4bb-1a52-883b561b659f.png)

### ここで注意その2！！🐻
圧縮するときは、「[Content_Types].xml」ファイル、「_rels」フォルダ、「3D」フォルダを直接選択して、一気に圧縮！
間違っても、この3つのファイル・フォルダが入っているフォルダ（boxフォルダ）を選択して圧縮したら、読み込みの際にエラーになるので気を付けて。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554761/73b51306-1811-bf48-2ef8-f26bf780c0e2.png)



## そしてふと我に返る
box.3mfの構造を見てすげぇ満足したけど、俺何やってる？ここはどこ？
とりあえず、box.3mfをパワーポイントで読ませてみよう。（元のbox.3mfはとっくにzipに名前を変えて解凍してしまったといういたずら小僧は、もう一度ダウンロードしてくるか、box.zipをそっとbox.3mfに名前を変えてみよう。）

さてさて、パワーポイントと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554761/58b82a1b-f5f7-bee5-abc9-5fcd5729bf7d.png)

つぎに、box.3mfを読み込むぞっと。
box.3mfを選択すると・・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554761/1ac96d6b-fda0-4499-3b79-5244b7cd98e3.png)

よし、ちゃんと立方体に変化した3Dモデルを入れることができたぜい！
こんなご時世にメモ帳だけで3Dモデルを作ってPower Pointにインポートするなんてワイルドだろ～


## ぼけぇ！俺の顔写真入りの3DをPower Pointでぐりぐりうごかせるようにせぇ！
あ、目的忘れてた。
でも、3mfの構造がわかったから、あとはこの立方体に写真を張り付ければいいのね。
今日の業務はこれにて終了。次回へ続く・・・