Unity 備忘録テクニック(3Dポリゴンで知っておかないとはまるかも?)




皆さんこんにちは、プロクラスの野間です。

今回は実際にプログラムで3Dの面(ポリゴン)を表示
の続きです。

前回はとにかくプログラムで三角形を表示をやりました。
そして今回は次に進む前に知っておかないといけない事からです。

■問題点を体験

前回のプログラムで面を表す頂点を

02_1

int[] face = new int[] { 0, 1, 2 };

と書きました。
これを次のように書き換えてみてください。

02_2

int[] face = new int[] { 0, 2, 1 };

頂点の順序が変わっただけです。
実行すると・・・何も表示されません。
三角形なので、頂点の順序が変わったところで形が崩れることはありません。
なのに表示されない。これは知っていないとはまるかもしれない点です。

■ポリゴンには「裏」がない

通常、私たちが生きている世界で「裏が無い」等といったことはありません。
トランプでもなんでもひっくり返せば裏があります。「白紙」とかそんな話ではなく「存在しない」の意味です。
現実にはあり得ないのですが、コンピュータの世界ではそんな事が当たり前に存在しています。
ポリゴンには表があっても裏はないのです。
(もちろん存在しているのですが表示されないだけですがね)
これは速度を上げるために行われている事で、今でこそコンピュータは非常に早く、3Dもすごくたくさんの画像を表示することができるようになっています。が、それでも更に沢山のものが表示される方が良いですよね。
少しでも早く。
とある本に書いてあった事で、私が非常に感銘を受けた言葉があります。
「プログラムで最も早いのは何もしない処理である」
これを「当たり前」ととらえるか「なるほど」ととらえるか、そのあたりは置いときまして、この「なにもしない」がポイントになります。
画面の描画で時間がかかるのはやはり「描画」です。少しでも早くするためには「描画」の回数を減らすと早くなるわけです。
書き込む量、書き換える回数を減らす。書かなかったら処理にかかる時間は「0」ですものね。
『それで何故裏?』と思うかもしれません。
通常、立体で考えると厚み「0」なんてありえませんよね。
物を立体でとらえた場合、殆どの場合が「裏」とは別のポリゴンです。
わかりやすく例を出すと立方体(サイコロ)、1の反対面は6で、それらは別のポリゴンです。
そして、1の面が見えるとき、絶対に6の面は見えません(立体視では片目)。立体の場合、必ず裏面は別のポリゴンに隠れます。
球でも、いびつな岩のような形でも、絶対に裏を向いている場合何かに隠れています。
裏面が見えるのは正に1枚のポリゴンとして表示しているときのみです。

さてここで先ほどの話
・少しでも早く
・最も早いのは何もしない事

・絶対に描画しなくてもよいポリゴン
を考えると、如何でしょう?このポリゴン、「処理しない」手は無いでしょう?

もちろんこれは「わざわざ処理しないように」作られた処理なのですが、それだけの効果があるので当たり前のようにレンダリングライブラリには機能が実装されています。(オプションとなっているものが多いようです)
Unityでは「裏面を表示しない」のが標準とされているだけです。

良し悪しの話ではなく、知っていないとはまる。
私の実体験込みのお話です。
必死にプログラムを組み、表示されないので、プログラムミスを探し続けた結果ポリゴンが反対を向いていたので見えなかっただけ。泣きそうになりました。

■ポリゴンの向き

では、このポリゴンの向き(裏表)は何で決まるのか。
答えは単純で「辺の向き」です。
先の

int[] face = new int[] { 0, 1, 2 };

int[] face = new int[] { 0, 2, 1 };

の2つでは頂点をつなぐ向きが変わっているのがわかります。

で、この「向き」なのですが・・・統一されていません。
Unityではこっち

int[] face = new int[] { 0, 1, 2 };

3Dを使い慣れている方にとっては当たり前の情報ですが、3D入門の方はお見知りおきください。