LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-07-02

[toc]

数学基礎_ベクトル

1 ベクトルの定義

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

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

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

    image-20220701094124242

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

    image-20220701094149415

  • ベクトルとスカラー量

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

    • 数学形式で同じですが、幾何学では意味は違う
      • 点:位置の性質をもつ、大小と方向の性質は持たない
      • ベクトル:位置の性質は持たない、大小と方向の性質はもつ
      • 繋がり:任意の点は、原点からのベクトルと認識されることができる
  • 零ベクトル (0,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.xk,\vec u.yk,\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}}
$$

image-20220701112417721

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

$$
\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

$$
\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

$$
\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

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

  • クロス積と平行四辺形面積
    image-20220701161023639

$$
\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

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

$$
\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

$$
\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
$$

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

  • ハーフランバート

$$
\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}
$$

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

ProjectRepo

参考資料

Introduction to 3D Game Programming with DirectX® 12

3Blue1Brown

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0