見出し画像

【WebGL】CG入門: front or back facing triangles の見分け方

WebGL Fundamentals の写経を行っていく.

この3Dの説明で,back と front facing triangles の culling (= not drawing)の設定が出てくるが,どうやって見分けるんだと疑問になったのでここにメモしておく.

face culling : 面の描画.
Front / Back facing triangles の定義.
CCWがFront facingで,CWがBack facing と定義される.
https://webglfundamentals.org/webgl/lessons/webgl-3d-orthographic.html

以下のページも参考になる:

Back and Front facing triangles,
https://learnopengl.com/Advanced-OpenGL/Face-culling

同じ図形でも回転させて,裏側に行ったら見えなくなるようにできる.
これが,front と back facing triangles を定義する意義だ.

How to define the rotational direction for each facing triangle.
The camera direction's important to decide the direction.

結局カメラの向きがどこ向いているのか,についての説明が,webGL Fundamental のページには省略されていたのが混乱の原因であった.

三角形の3つの頂点の座標から,どうやって見分ける?

CG の Rendering では,三角形 を組み合わせて,描画される.
三角形の座標からどうやって見分けようか.
あわよくば,高速で見分ける条件式みたいなの得られんかな.

三角形を眺めた時に,三角形の頂点(Vertex)で作られるベクトルの外積ベクトルを考える:

$$
\vec{E} = (\vec{v}_{2} - \vec{v}_{1}) \times (\vec{v}_{3} - \vec{v}_{1})
$$

このベクトルと,カメラの向いている向きベクトルの内積が大事になってくる.

Default のカメラ視点が向いている向きを $${\vec{D} = (0,0,-1)}$$ としておく.

$$
C = \vec{E} \cdot \vec{D} = - E^z
$$

各頂点 $${i = 1, 2, 3}$$の位置ベクトルを,$${\vec{v}_i = (v^x_i, v^y_i, v^z_i)}$$のように書いておく.
さらに,簡単のために,$${\vec{w}_{ij} = \vec{v}_i - \vec{v}_j }$$ としておく.

$$
C  = - (w_{21}^x w_{31}^y - w_{21}^y w_{31}^x)
$$

これより,得たかった条件式は,
Back facing face if $${C > 0}$$
Front facing face if $${C < 0}$$
となる.

例題

WebGL Fundamentals のページによると,以下のようになるらしい:

Backward?
0, 0, 0,
40, 50, 60,
700, 800, 900,

Backward

Frontward?
0, 0, 0,
700, 800, 900,
40, 50, 60,

Frontward

になると言う.証明してみる.

Backward? の方は,

$$
C = - (40 \times 800 - 50 \times 700) = +3000 > 0
$$

Fackward?の方は,

$$
C = - (700 \times 50 - 800 \times 40) = -3000 < 0
$$

確かに,そうなっていた.

何かの役にたてばと,共有しておきます.


いいなと思ったら応援しよう!