Blenderのテクスチャ座標についておさらいしてみる

Blenderでノード等のチュートリアルを試していて躓いているのを見ると
テクスチャの座標について「なんとなく」でやっているのを見かけるので
軽くまとめてみようかと思います。

# 画像のUV座標について
普段、２D画像を扱う時にはピクセルで座標を指定することが多いですが、
３Dソフトの多くは画像の左下または左上を基準にもう片方の画像の端を1.0とした座標を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/ba09c514-eff5-8b32-3ae4-44190e63e84b.png)
Blenderでは左下が原点の(0,0) 右上が(1.0,1.0) 中心が(0.5,0.5)と、
0から1の割合で座標を表す形になります。

::: note
ソフトによってはピクセル座標で表示されている場合もありますが　分かりやすいように変換をしているだけです
Blenderでも画像を表示している場合には　
UVエディッタビュータブにあるピクセル座標のチェックで座標がピクセル座標表示になります

なぜピクセルでなく割合なのか？　理由は色々ありますが。
3Dソフトウエアだと割り当てた画像をそのまま使うだけでなく、画像を差し替えて使うこともあるので
そういった場合にもピクセルでなければわざわざ値を変換する必要がなくなりますね。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/cf0983b4-4791-5e9a-68f7-7cfec74fe5ed.png)
UVテクスチャでは、UV上の面の頂点座標で**画像のどこの部分を利用するか**を指定するのですが、
３Dの面上の一点を指定して、
「面を構成する頂点から見てどれくらいの割合の位置なのか？」は すぐに計算できます。
その頂点からの割合の値をUVの方に当てはめればテクスチャ上の座標も求まります。
3Dではそんな計算をずっと繰り返して絵ができています。

::: note
とりあえずUVでは画像の縦横幅を1.0とした座標が基準になっていると覚えてください
この"基準値になるように値を調整することを数学で「正規化(Normalization)」と言います
Blenderでも色々な場所に出てくる用語ですね。
今回の記事でも使いますので覚えておいてください。
:::

# Blenderのテクスチャで使用する座標について
ここでは　Blenderの「テクスチャ座標」のノードを中心にBlenderのテクスチャで使う座標について触れたいと思います。
Blender以外のソフトにデータを出力する時には、UV座標でマッピングする以外は基本的にできないと思ってください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/a76e20fe-7acd-6810-7c08-b1d48f85605d.png)
テクスチャの座標の出力や画像テクスチャの入力のソケットが青色になっていますが
青色のソケットは入出力されるデータが**ベクトル**であることを表しています。
「ベクトル」と言っても何のことか分からないかもしれませんが　ここでは(X,Y,Z)の座標など３つの数値をひとまとめにして受け渡すと思ってください。

画像テクスチャの場合には３つ受け渡された数値のうち　頭から２つの数字(X,Y)しか使いません

## 生成
「生成」では オブジェクト自体のローカル軸での大きさを元に正規化された値が出力されます。
標準では　オブジェクトのXYZ各軸のバウンディングボックス基準になります。

オブジェクトプロパティのビューポート表示にある「テクスチャ空間」で範囲をボックス表示できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/5413d5cc-64b6-17ee-5913-f08d739f8849.png)
キャプチャでは生成でマッピングしたキューブと　同じ設定を編集モードで回転したものを並べています

オブジェクトデータプロパティにある**自動テクスチャ空間**のチェックが入った状態では
編集モードで形状を編集した場合でもオブジェクトモードで形状の大きさに合わせた値になるよう値が再計算されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/37444326-d64c-e061-2b96-b6dadf82088c.png)
また、オブジェクトデータプロパティの自動テクスチャ空間のチェックを外すと
基準になる値を手動で指定できます

「位置」は生成座標の中心位置　「サイズ」は計算の元になる**半径**になります。
原点座標や幅ではないので注意が必要です。

## ノーマル
「ノーマル」は法線（XYZどちらの方向を向いているか）の値です
例えば面がX方向を向いている時には（1,0,0）　-X方向を向いている場合(-1,0,0)の値になります
角度に応じた計算をするのに必要な値ですが　直接テクスチャで利用することはないかもしれません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/3a99a854-7478-93af-a4fe-845ae07aea29.png)
ちなみにジオメトリ入力ノードにも同じく「ノーマル」の項目がありますが、
テクスチャ座標のノードのノーマルはオブジェクトのローカル座標の方向
ジオメトリのノードのノーマルはシーンのグローバル座標の方向を示す値になります。
## UV
「UV」はUVマップの値です
テクスチャ座標のUVはアクティブなUVの値が出力されます。
テクスチャのベクトル入力に何もつないでいない場合にもこのアクティブなUVの値が使われます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/c4c026f9-edf9-6373-8c96-3b3d8aa16144.png)
オブジェクトデータプロパティのUVマップで カメラアイコンがある方がアクティブなUVです。
入力ノードにはUVマップのノードもありますが、こちらでは使用するUVを選ぶことができます。

ベイク等で別のUVにテクスチャを再配置したいときにも使えます。

## オブジェクト
オブジェクトのローカル座標基準の座標の値が出力されます。
ノードにあるオブジェクトの項目が空欄だとマテリアルを使用しているオブジェクトの座標で
オブジェクトを指定すると　指定したオブジェクトの座標になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/d600b40b-9e7e-fc81-7836-8fcc45a9425f.png)
キャプチャでは座標軸表示にしたEmptyの座標を利用しています
「オブジェクトのローカル座標」ですので　指定したオブジェクトの位置や回転拡縮の影響を受けます
## カメラ
カメラの位置を基準にした座標の値が出力されます。
ビューポート上ではビューに使用しているカメラを基準に値が変化します。
カメラから見た視点の中心を基準に左右方向がX軸 上下方向がY軸　奥行がZの値になります

カメラビューでは使用しているカメラを「オブジェクト」にした場合の値とはZの値を反転した関係になります
（Blenderの座標系ではカメラの見ている方向はカメラオブジェクト基準の-Z方向です）
## ウインドウ
ビューポートのウインドウの４隅で正規化した値が出力されます。
カメラビューやレンダリングの場合にはカメラのビューの4隅が基準になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/6111ade1-d34c-ab3c-406d-062ad4b939e4.png)
左下が(0,0)　右上が（1,1）でZの値は常に0なようです。

カメラ　ウインドウの座標は　うまく使用するとカメラ方向からテクスチャを投影したような効果を作れます
## 反射
視点から光を当てた場合に鏡面反射する方向の値です
グローバル軸の方向の値になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/ad8badb9-7405-8274-d1b6-be00ae63d34b.png)
例えばZ軸方向を向いているカメラに正対した平面がある場合反射方向は-Z軸方向で（0,0,-1）の値になります
環境マップのようなものを自分で作る場合に必要になりまあす

## インスタンサーからのチェックボックス
Cyclesレンダーのみで利用できる機能です
「インスタンス化」を利用して面の上に複製した場合に
複製したオブジェクトでインスタンサーのUVの値を使用します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/72a7efd4-4af3-a866-3742-5adf72a4ae1e.png)
キャプチャは細かく分割した平面上に球を並べた例です
複製した場所のピンポイントのUVを利用するので　モザイクやLEDディスプレイのような表示になっています

テクスチャ座標で提供されるデータはこのまま使うだけでなく
ベクトルの計算を使うなどして色々な効果を得られます　とっかかりの一助になればと思います