グラフィックス勉強のノード_1.2_数学基礎_ベクトル

[toc]

# 数学基礎_ベクトル

## 1 ベクトルの定義

- ベクトルは方向と大小性質をもつ

- ベクトルは位置性質はない

- ベクトルの矢印がベクトルの終わり

  ![image-20220701094124242](https://vip2.loli.io/2022/07/01/M6n93dSRNmohpWz.png)

- ベクトルの移動は座標軸と平行の移動

  ![image-20220701094149415](https://vip2.loli.io/2022/07/01/K6YGDbV9kHdBvSw.png)

- ベクトルとスカラー量

  - スカラー量: 体重は100Kg
  - ベクトル：車は北へ10kmを進んだ

- ベクトルと点

  - 数学形式で同じですが、幾何学では意味は違う
    - 点：位置の性質をもつ、大小と方向の性質は持たない
    - ベクトル：位置の性質は持たない、大小と方向の性質はもつ
    - 繋がり：任意の点は、原点からのベクトルと認識されることができる

- 零ベクトル （0，0）

  - 大小は０
  - 方向の性質はない
  - 零ベクトルは点ではない
  - スカラー量の零は**数はない**と表示する、零ベクトルは**移動はない**と表示する


##　2  どう計算する

### 1.2.1  ベクトルの基本計算

$$
\displaylines{足し算/引き算（同じ次元のベクトル）\\
\vec u + \vec v = (\vec u.x+\vec v.x, \vec u.y+\vec v.y, \vec u.z+\vec v.z)\\
    \vec u - \vec v = (\vec u.x-\vec v.x, \vec u.y-\vec v.y, \vec u.z-\vec v.z)}
$$

### 1.2.2 ベクトル とスカラー量

- 足し算  引き算  X
- 掛け算 

$$
    k * \vec u= (\vec u.x*k,\vec u.y*k,\vec u.z*k)
$$

- 割り算 

$$
    \vec u\div k = (\vec u.x\div k,\vec u.y\div k,\vec u.z\div k)
$$

### 1.2.3 ベクトルの大きさ

$$
    \|\vec u\| = \sqrt{\vec u.x ^2 + \vec u.y ^2 + \vec u.z ^2}
$$

- 単位ベクトル 
  実際使用状況によって、ベクトルの長さを気にしないことがあり、
  ベクトルを使って純粋な方向を表現したい、そのような方向だけのベクトルでは、ベクトルの大きさは1であることが望まれます。あるベクトルを単位長にするとき、そのベクトルを**正規化**すると言います。ベクトルを正規化するにはその成分のそれぞれをその大きさで割ることです。

$$
    \hat{u} = \frac{\vec u}{\|\vec u\|} 
    = ({\frac{\vec u.x}{\|\vec u\|}},
    {\frac{\vec u.y}{\|\vec u\|}},
    {\frac{\vec u.z}{\|\vec u\|}})
$$

  この式が正しいことを確認するために、uの長さを計算する。

$$
\displaylines{\|\hat{u}\| = \sqrt{(\frac{u.x}{\|\vec u\|})^2
    +(\frac{u.y}{\|\vec u\|})^2
    +(\frac{u.z}{\|\vec u\|})^2} \newline
    =\frac{\sqrt{\vec u.x^2 + u.y^2 + u.z^2}}
    {\sqrt{\|\vec u\|^2}} = \frac{{\sqrt{\|\vec u\|^2}}}{{\sqrt{\|\vec u\|^2}}} = 1}
$$

### 1.2.4 ゲーム制作中よく二つのオブジェクトの距離の計算

$$
\displaylines{点Aは原点Oからの\overrightarrow{OA}\newline
	点Bは原点Oからの\overrightarrow{OB}\newline
	点Aと点Bの距離 = \|\overrightarrow{AB}\|= \|\overrightarrow{OB} -\overrightarrow{OA}\|\newline
	= \sqrt{(\overrightarrow{OB}.x-\overrightarrow{OA}.x)^2+(\overrightarrow{OB}.y - \overrightarrow{OA}.y)^2+(\overrightarrow{OB}.z - \overrightarrow{OA}.z)^2}}
$$

  <img src="https://vip2.loli.io/2022/07/01/eyX84VDgodCawMF.png" alt="image-20220701112417721" style="zoom: 50%;" />

### 1.2.5 ベクトルの内積

$$
\left\lbrace
  \begin{array}{**rcl**}
  a_1\newline a_2\newline a_3\newline \vdots\newline a_{n-1}\newline a_n
  \end{array}
  \right\rbrace
  \cdot
  \left\lbrace
  \begin{array}{**rcl**}
  b_1\newline b_2\newline b_3\newline \vdots\ \newline b_{n-1}\newline b_n
  \end{array}
  \right\rbrace = a_1b_1+a_2b_2+\cdots+a_{n-1}b_{n-1} + a_nb_n\\
$$


$$
\displaylines{ \vec a \cdot \vec b = \sum_{i-1}^naibi\newline
  \vec u \cdot \vec v =\vec u.x * \vec v.x+\vec u.y * \vec v.y+\vec u.z * \vec v.z\newline
  交換法則 \newline \vec u \cdot \vec v =\vec v \cdot \vec u\newline}
$$


- 内積の幾何解釈：内積の結果は二つのベクトルの似ている程度。結果が大きいほどなす角が小さい、その二つのベクトルはよく似ている

$$
\displaylines{\vec u\cdot \vec v = \|\vec u\|\|\vec v\|\cosθ\newline
  もし\vec uと\vec vは単位ベクトル\newline
  \vec u\cdot\vec v = \cos\theta\newline}
$$

- 内積の証明（二次元ベクトルで証明する）
  ![image-20220701131230383](https://vip2.loli.io/2022/07/01/H9VRlny7SopOkXI.png)

$$
\displaylines{\overrightarrow {AB}=\overrightarrow{OB}-\overrightarrow{OA}\newline
\|\overrightarrow{AB}\|^2=\|\overrightarrow{OB}\|^2+\|\overrightarrow{OA}\|^2-2\|\overrightarrow{OB}\|\|\overrightarrow{OA}\|\cos\theta\newline
(\overrightarrow{OB}-\overrightarrow{OA})(\overrightarrow{OB}- \overrightarrow {OA})\\
=\|\overrightarrow{OB}\|^2+\|\overrightarrow{OA}\|^2-2\overrightarrow {OB}\cdot\overrightarrow{OA}\newline
=\|\overrightarrow{OB}\|^2+\|\overrightarrow{OA}\|^2-2\|\overrightarrow {OB}\|\|\overrightarrow{OA}\|\cos\theta\newline
\therefore\overrightarrow{OB}\cdot\overrightarrow{OA}=2\|\overrightarrow {OB}\|\|\overrightarrow{OA}\|\cos\theta\newline}
$$

- 内積の幾何性質

$$
\displaylines{if(\vec u \cdot \vec v == 0)  \vec u\perp \vec v\newline
    if(\vec u \cdot \vec v > 0)  \vec uと \vec vのなす角\theta<90\degree\newline
    if(\vec u \cdot \vec v < 0)  \vec uと \vec vのなす角\theta>90\degree\newline}
$$

注意：「orthogonal」と「perpendicular」は同じ意味です

- 直交投影
  ![image-20220701120434178](https://vip2.loli.io/2022/07/01/F8sm2Z34WifaRqX.png)

$$
\displaylines{\vec v と\hat nを知っている, \vec pを求める。\\
    \vec p = k\hat n\\
    \because\|\hat n\| = 1\\
    \therefore \|\vec p\| = |k|\|\hat n\| = |k|\\
    \because k = \|\vec v\|\cos\theta \\
    \therefore \vec p = k\hat n 
    = (\|\vec v\|\cos\theta)\hat n\\
    = (\|\vec v\|1\cos\theta)\hat n\\
    = (\|\vec v\|\|\hat n\|\cos\theta)\hat n\\
    = (\vec v\cdot\hat n)\hat n\\
    \vec p を \vec v の \hat n への直交投影と呼びます。\\
    P = Proj_\hat n(\vec v)}
$$

### 1.2.6 外積/クロス積定義（三次元だけ有効）

![image-20220701143842965](https://vip2.loli.io/2022/07/01/B1EMhxjzyt5AigZ.png)

$$
\displaylines{\vec w = \vec u \times \vec v 
    = (\vec u_y\vec v_z-\vec u_z\vec v_y,\vec u_z\vec v_x-\vec u_x\vec v_z,\vec u_x\vec v_y-\vec u_y\vec v_x)\\
    \vec u \times \vec v = - \vec v \times \vec u \\
    \vec u \times \vec u = \vec 0}
$$

![image-20220701144251657](https://vip2.loli.io/2022/07/01/yuHwPeXKATLJsUQ.png)

$$
\displaylines{クロス積\vec w は\vec uと\vec vに垂直なベクトル,\\
    左手座標系は左手を使う、右手座標系は右手を使う\\
    左手で指を\vec uの方向に向け、\\
    次に\vec vの方向に曲げると、親指は\vec wの方向を指す。\\
    クロス積は平面の法線}
$$

- クロス積と平行四辺形面積
  ![image-20220701161023639](https://vip2.loli.io/2022/07/01/AcVS4B7KuhtPbUx.png)

$$
\displaylines{\|\vec w\|= \|\vec u \times \vec v\| = \|\vec u\|\|\vec v\|\sin\theta\\
    平行四辺形の面積A = \|\vec v\|h = \|\vec v\|(\|\vec u\|\sin\theta)=\|\vec u\|\|\vec v\|\sin\theta\\
    証明\\
    \cos\theta = \frac{\vec u \cdot \vec v}{\|\vec u\|*\|\vec v\|}\\
    = \frac{\vec u_x\vec v_x +\vec u_y\vec v_y+\vec u_z\vec v_z}
    {\sqrt{(\vec u_x^2 + \vec u_y^2+\vec u_z^2)}\sqrt{(\vec v_x^2 + \vec v_y^2+\vec v_z^2)}}\\\\
    \sin^2\theta = 1 - \cos^2\theta\\ = 1 - \frac{(\vec u_x\vec v_x +\vec u_y\vec v_y+\vec u_z\vec v_z)^2}
    {(\vec u_x^2 + \vec u_y^2+\vec u_z^2)(\vec v_x^2 + \vec v_y^2+\vec v_z^2)}\\
    = \frac{(\vec u_x\vec v_y - \vec u_y\vec v_x)^2
    +(\vec u_y\vec v_z - \vec u_z\vec v_y)^2
    +(\vec u_z\vec v_x - \vec u_x\vec v_z)^2}
    {(\vec u_x^2 + \vec u_y^2+\vec u_z^2)(\vec v_x^2 + \vec v_y^2+\vec v_z^2)}\\
    \sin\theta = \frac{\sqrt{(\vec u_x\vec v_y - \vec u_y\vec v_x)^2
    +(\vec u_y\vec v_z - \vec u_z\vec v_y)^2
    +(\vec u_z\vec v_x - \vec u_x\vec v_z)^2}}
    {\sqrt{(\vec u_x^2 + \vec u_y^2+\vec u_z^2)}\sqrt{(\vec v_x^2 + \vec v_y^2+\vec v_z^2)}}\\
    \vec w = \vec u \times \vec v \\
    \|\vec w\| = \sqrt{(\vec u_x\vec v_y - \vec u_y\vec v_x)^2
    +(\vec u_y\vec v_z - \vec u_z\vec v_y)^2
    +(\vec u_z\vec v_x - \vec u_x\vec v_z)^2}\\
    \|\vec u\|\|\vec v\|\sin\theta =\sqrt{(\vec u_x\vec v_y - \vec u_y\vec v_x)^2
    +(\vec u_y\vec v_z - \vec u_z\vec v_y)^2
    +(\vec u_z\vec v_x - \vec u_x\vec v_z)^2}\\
    \therefore \|\vec w\| = \|\vec u\|\|\vec v\|\sin\theta}
$$

- クロス積は二つベクトルの左右(回り関係)を判断する

$$
\displaylines{
(\vec a\times\vec b).z = (\vec a.x\vec b.y - \vec a.y\vec b.x) > 0 　　 \vec　bは\vec aの左側\\ 
(\vec a\times\vec b).z = (\vec a.x\vec b.y - \vec a.y\vec b.x) < 0 　\vec　bは\vec aの右側\\
}
$$

- クロス積は二つベクトルの内外を判断する

$$
\displaylines{右手座標系は頂点順番　逆時計回り\newline
  (\overrightarrow {AB} \times \overrightarrow {AP}).z> 0 \quad pは\overrightarrow AB の右側 \newline
  (\overrightarrow {BC} \times \overrightarrow {BP}).z> 0 \quad pは\overrightarrow BC の右側\newline
  (\overrightarrow {CA} \times \overrightarrow {CP}).z > 0)\quad pは\overrightarrow CA の右側\newline
  	点pは三角形の内部\newline
  	左手手座標系は頂点順番時計回り\newline
  (\overrightarrow {BA} \times \overrightarrow {AP}).z> 0 \quad pは\overrightarrow BA の右側\newline
  (\overrightarrow {AC} \times \overrightarrow {BP}).z> 0 \quad pは\overrightarrow AC の右側\newline
  (\overrightarrow {CB} \times \overrightarrow {CP}).z > 0)\quad pは\overrightarrow CB の右側\newline
  	点pは三角形の内部\newline
}
$$

  ![image-20220701175458573](https://vip2.loli.io/2022/07/01/sbtUZlihXnOuyFY.png)

## 3.  応用

- 基本ライティングモデル 

$$
\displaylines{C_{ambient} = G_{ambient} \newline
C_{emissive} = M_{emissive} \newline
C_{diffuse} = (C_{light}* M_{diffuse})\max(0,\hat n \cdot \hat l)\newline}
$$

- フォン(Phong)モデルスペキュラー(Specular)

  ![LightingModelSpecular](https://vip2.loli.io/2022/07/02/ucSYBozfqt9yGTW.png)

$$
\displaylines{\hat r = 2(\hat n \cdot \hat l)\hat n - \hat l\newline
フォン(Phong)モデルスペキュラー計算\newline
C_{specular} = (C_{light}*M_{specular})\max(0,\hat v \cdot \hat  r)^{m_{gloss}}\newline}
$$

- ブリンフォン(BlinnPhong)モデルスペキュラー(Specular)

![BlinnPhong](https://vip2.loli.io/2022/07/02/7UsBWNd4V9EGoly.png)

$$
\displaylines{\hat h = \frac{\hat v + \hat l}{\|\hat v + \hat l\|}\newline
C_{specular} = (C_{light}*M_{specular})\max(0,\hat n \cdot \hat  h)^{m_{gloss}}\newline}
$$

- ランバートライティングモデル

$$
C_{diffuse} = (C_{light}* M_{diffuse})\max(0,\hat n \cdot \hat l)\newline
$$

```shader
fixed4 fragLambert(v2f i):SV_Target
{
    fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
    float lambert = saturate(dot(worldLightDir,i.worldNormal));
    fixed3 diffuse  = _LightColor0.rgb * _Diffuse.rgb * lambert ;
    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
    fixed3 color = diffuse + ambient;
    return   fixed4(color,1.0);
 }
```

![image-20220702124931703](https://vip2.loli.io/2022/07/02/NcPt8VbqdDYl16i.png)

- ハーフランバート

$$
\displaylines{C_{diffuse} = (C_{light}* M_{diffuse})(\alpha(\hat n \cdot \hat l)+\beta\newline
  C_{diffuse} = (C_{light}* M_{diffuse})(0.5(\hat n \cdot \hat l)+0.5}
$$

```shader
fixed4 fragHalfLambert(v2f i):SV_Target
{
	fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
	fixed halfLamerbert = dot(i.worldNormal,worldLightDir) * 0.5f + 0.5f;
	fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * halfLamerbert;
	fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
    fixed3 color = diffuse + ambient;
	return   fixed4(color,1.0);
}
```

![image-20220702125543699](https://vip2.loli.io/2022/07/02/hZc8YC92eSkdjWg.png)

# ProjectRepo

https://github.com/WangYiTao0/GrapichStudyNote

# 参考資料

Introduction to 3D Game Programming with DirectX® 12

[3Blue1Brown](https://www.youtube.com/c/3blue1brown)