「ゲームプログラミング/3Dグラフィック」の版間の差分

削除された内容 追加された内容
編集の要約なし
2,529 行
あれらの仕組みはどうなっているのかというと、トゥーン・レンダリングといわれる技術を使っており、下記のような工夫がよくある。
 
トゥーンレンダリングといった場合、主に、
=== 色の階調化 ===
# 輪郭線の自動的な描画と、
まず、手書きアニメでは、色のグラデーションが無いのが普通である。
# 色彩の階調化
がある。
 
しかし、ゲーム産業では、たとえアニメキャラ風のキャラクターデザインのゲームでも、あまり色彩の階調化は使われない。
なので、CG表示でも、そう処理すればいいだけである。具体的には、たとえば、各部の色を、何階調かに近似すればいいのである。
 
いっぽう、アニメ絵風のゲームでも、輪郭線の自動的な描画は使われる作品が多い。
また、階調は、色ごとに設定する。
たとえば、ある物体の、光(ふつうの白色光)の当たる前の標準状態の色が水色だった場合、たとえば3階調として
:やや白みのある水色
:水色
:ややカゲで暗くなった水色
のように、3階調に分割する。
 
 
色ごろに階調を設定しないと、アカっぽい色は、ぜんぶアカになったりとかして、役に立たなくなってしまう。
 
 
なお、現代コンピュータでは色データの濃淡は普通は255段階である。256×256×256 = 16777216 の約1600万色である。
 
 
2,645 ⟶ 2,636行目:
 
 
===== 「材質」による方法 =====
市販の3Dモデリングソフトでは、各部分の「材質」(『マテリアル』ともいう)をパーツごとに登録できる。なので、エッジ法や深度法などでの、各部の画素どうしの法線の比較のついでに、材質の比較をすることで、材質の変化をした部分に輪郭線を引くこともできる。このため、たとえば材質「服」と材質「肌」との境目の画素のぶぶんに輪郭線を引くこともできる。
 
 
ただし、材質どうしの比較だと、たとえば手を胸(説明の簡単化のため、男の平らな胸にする)に当てている場合や、手を腹に当てている場合などは、手も胸も腹も材質は同じ「肌」なので、この方法では検出できない。
 
 
どうしても、このような場合でも、手と胸との境界線を「材質」比較の方法で描画したい場合、対策として、たとえば材質「肌-手」や材質「肌-胸」など、身体各部ごとに材質をつくっておけばいい。
 
 
なお、普通のアニメ絵では、胸と腹のあいだの境界線は書かないし、胸と肩のあいだの境界線も書かない。
 
なので、例外として、材質が違っていても境界線を書かない組み合わせをあらかじめ登録しておき、それ以外の組み合わせが隣りあった場合にだけ境界線を描けばいい。
 
もっとも、この方法を使わなくても、前述したような黒背景の方法や「法線」なんとか法などでも、手と男胸との輪郭線を描画できる可能性はある。
 
==== 弱点 ====
2,665 ⟶ 2,641行目:
[[File:Fillet emphasise japanese.svg|thumb|400px|フィレット]]
 
裏ポリゴン法線なんとか法やエッジ法にかぎらず、上述などすべての方式法線ベクトルを使う手法場合、弱点として、カドっこを丸めるフィレット処理などの処理をされると、とたんに輪郭の検出が描画が難しくなる。
 
「フィレット」とは、工業製品などで、エッジのある場所に丸みをつける加工をすることである。
背景と外輪郭線の検出はフィレットされても上述のどの方法でも検出は容易だが、しかし、等角図の内部の輪郭線のような線の検出は、上述の方式では、どれも検出が困難・ほぼ不可能である。
 
 
なぜフィレットのような処理に弱いかというと、円柱側面状の丸みのある場合、その場所の傾きは連続的に変化していくので、微分していくと法線どうしの向きは一致していき、よって法線の向きの差分を検出しづらい。
「フィレット」とは、工業製品などで、エッジのある場所に丸みをつける加工をすることである。
 
 
かといって対策として、(1画素単位といった)微分ではなく、数画素単位~十数画素のような大きな単位での差分にすると、今度は、輪郭線を書きたくない場所に誤検出をする可能性がある。
 
 
 
2,682 ⟶ 2,662行目:
フィレットがあってもどうしても輪郭を検出したい場合、後述の方法がある。
# テクスチャ的に、輪郭線として検出したい場所を最初から輪郭線の色でモデル表面に塗っておく方法。
 
===== 「材質」による方法 =====
市販の3Dモデリングソフトでは、各部分の「材質」(『マテリアル』ともいう)をパーツごとに登録できる。なので、エッジ法や深度法などでの、各部の画素どうしの法線の比較のついでに、材質の比較をすることで、材質の変化をした部分に輪郭線を引くこともできる。このため、たとえば材質「服」と材質「肌」との境目の画素のぶぶんに輪郭線を引くこともできる。
 
 
ただし、材質どうしの比較だと、たとえば手を胸(説明の簡単化のため、男の平らな胸にする)に当てている場合や、手を腹に当てている場合などは、手も胸も腹も材質は同じ「肌」なので、この方法では検出できない。
 
 
どうしても、このような場合でも、手と胸との境界線を「材質」比較の方法で描画したい場合、対策として、たとえば材質「肌-手」や材質「肌-胸」など、身体各部ごとに材質をつくっておけばいい。
 
 
なお、普通のアニメ絵では、胸と腹のあいだの境界線は書かないし、胸と肩のあいだの境界線も書かない。
 
なので、例外として、材質が違っていても境界線を書かない組み合わせをあらかじめ登録しておき、それ以外の組み合わせが隣りあった場合にだけ境界線を描けばいい。
 
もっとも、この方法を使わなくても、前述したような黒背景の方法や「法線」なんとか法などでも、手と男胸との輪郭線を描画できる可能性はある。
 
 
 
2,709 ⟶ 2,706行目:
 
また、明暗差が無ければ輪郭線として認識しないので、光源の位置によっては、輪郭線として表現したい場所に、かならずしも輪郭線を検出するとはかぎらない。
 
 
 
 
=== 色の階調化 ===
まず、2005年ていどまでの手書きアニメでは、色のグラデーションが無いのが普通である。
 
かつて、1980~90年代のアニメ業界では、アゴ下と顔の境目の影を強調したり、ワキの下などの影を強調する手法が流行した。
 
しかし2010年代の現代では絵柄の流行が変わっており、作品にもよるが、ゲームでは、このような影はあまり使われてない。
 
 
もし、アニメ風に階調化したいなら、下記のようになるだろう。
 
階調化を自動的にしたい場合、
たとえば、あらかじめ前提として、レイ・トレーシングによって、影の位置を算出しておいて、各部の明暗が連続的に変化するので、その明暗に応じて各部の地の色のていどを変化させることで、連続的なグラデーションのあるモデルを作る。
 
次に、これを、色情報などをもとに何段階かの階調に分類すればいいだけである。具体的には、たとえば、各部の色を、何階調かに近似すればいいのである。
 
また、階調は、色ごとに設定する。
たとえば、ある物体の、光(ふつうの白色光)の当たる前の標準状態の色が水色だった場合、たとえば3階調として
:やや白みのある水色
:水色
:ややカゲで暗くなった水色
のように、3階調に分割する。
 
 
色ごろに階調を設定しないと、アカっぽい色は、ぜんぶアカになったりとかして、役に立たなくなってしまう。
 
 
なお、現代コンピュータでは色データの濃淡は普通は255段階である。256×256×256 = 16777216 の約1600万色である。
 
 
 
 
ただし、実は2010年代のアニメ風ゲーム業界では、絵柄の流行が変わっており、もはや階調化した影の強調は、流行から外れている。(もしかしたら強調してないだけで階調化じたいはしている可能性も否定しきれないが、少なくとも影の階調が素人目には見つけられない作品が普通に多い。)
 
 
このため、そもそもの階調化の需要が、ゲーム産業では、乏しくなってきている。
 
 
 
どうしてもゲームでプレイヤーの操作できるシーンのCG動画に影や光沢を描きたい場合、テクスチャ的に被写体に影を貼り付ける場合もある。
 
 
たとえばアニメキャラの瞳の光沢など、テクスチャ的に最初から描いておくことも多いだろう。
 
顔のあご下の首の影になる部分も、最初から暗めの肌色で塗っておく作品も多いだろう。
 
 
もちろん、テクスチャなので、たとえば人物が暗い場所に入って、懐中電灯を顔より下の位置に持っていても(いわゆる逆光の状態)、なぜか目の光沢が瞳の上にあるような不整合は起きるだろうが、やむをえない(もしくは、逆光の場合のテクスチャを別途、用意するか)。
 
あご下の影テクスチャも、逆立ちしても、あごの下が暗かったりとかの不整合もあるが、やむをえない。