face オブジェクト

face 部品は三角形のリストで指定します(それぞれの頂点に位置・色・法線を与えます)。これは新たな 3D モデリング・ツールを python ルーチンで記述するときに有効です。法線の計算などに多くの計算処理が必要ですが、C 言語で記述することまではしなくて済みます。

face オブジェクトは curve や convex などと同様に array 部品ともいえます。face オブジェクトはたくさんの一つの向きに揃えられた三角形の頂点で構成されます。各頂点には色:color と法線:normal も指定します。 位置:pos 属性は下のように表現します。

pos = [ t0v0, t0v1, t0v2, t1v0, t1v1, t1v2, t2v0, t2v1, t2v2, ... ]

ここで tov0 は三角形(triangle)0 の頂点(vertex)0 位置を意味します。この位置は三つの浮動小数点要素を持つリストまたはタプルまたはベクトルで与えます。t0v1 は三角形 0 の頂点 1 位置です。colornormal 属性も、要素数も含めて同様に構成します。

それぞれの face は片側だけを表示します。(訳注:もう片側は背景色のままです。)どちらの側が光るのかは三角形頂点の配置順序によって決まります。pos リストの中にある頂点が、三角形面に向かって反時計回りに配置されているとき表示される面になります。もし三角形のどちらの側も見えるようにするときは、二つの三角形を向かい合わせに配置する必要があります。

もし頂点の法線が指定されないと、各面は周囲の光のみによって照明されます。メインライトが外観に現れるには表面の頂点に対する法線(norm)指定が必要です。もっとも単純なときは法線は面に直行しています。隣り合う面の辺は境界を持ちます。隣り合う面の頂点の法線を平均化することで滑らかな表面が得られます。それぞれの面の輝度は法線と光の cosin 角度に比例します。

三角平面の各頂点に異なった色を指定したとき VPython は その面の間を補間・補正します。その場合は三角平面が一つの色ではなくなります。各頂点の法線が異なるときにも同様な補間・補正が発生します。そのとき三角形の輝度は一様でなくなります。

face オブジェクトは、記述モデル導入のため また他の新たな python 部品開発のために作られています。普通のプログラムから直接操作する目的では作られていません。face オブジェクトは他の Visual オブジェクトに比較して、かなり低レベルの部品です。face オブジェクトは、表面の影・色を滑らかにしたり片面/両面の照明などについて十分に柔軟な機能を持ちます。しかし pos, color, normal の計算は全てプログラマーが行わねばなりません。

face オブジェクトのの例がデモプログラムにあります。御覧ください。


訳注:-------------- 頂点の法線とは -----------------

コンピュータ・グラフィックスでは法線を光の反射の計算と表面/裏面の指定に使います。コンピュータ自体に平面の配置から法線を計算させることもできます。でも その計算は CPU の時間負荷が大きな処理となります。あらかじめ外形の配置データと一緒に法線方向のデータも与えておくことで高速に処理させるべきです。

法線自体は平面に対して互いに反対方向の一組だけが一意的に定まります。でも図形の連続的な変化に伴って法線も連続的に変化するように割り振らねばなりません。一つの平面に対して二つの法線のどちらをとるか定まれば、連続性から他の面で二つの法線からどちらを選択すべきかは定まってしまいます。

さて数学では法線は平面に対して定まります。でもコンピュータ・グラフィックスの分野では頂点に対して法線を定めるほうが普通です。法線が属する対象が頂点であることでデータの管理が楽になるからです。平面に対する法線を使うと頂点の数と法線の数が異なってきます。コンピュータにどの平面素辺と対応する法線か判定させるのにも CPU の時間負荷が大きく取られます。頂点ごとに法線データを与えたほうがコンピュータ処理が簡単・高速になります。

このような意味でコンピュータ・グラフィックスでの法線は数学でのように厳密なものではありません。通常は精度を求めません。スムージング処理した後に違和感のない影を作るためのデータに過ぎません。垂直に配置された円錐の法線の垂直成分を 0 にしてしまうことも珍しくありません。

参考 URL: Vertex Normals http://www.flipcode.com/articles/article_vertexnormals.shtml