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

削除された内容 追加された内容
編集の要約なし
2,597 行
 
 
==== 「材質」による方法 ====
市販の3Dモデリングソフトでは、各部分の「材質」(『マテリアル』ともいう)をパーツごとに登録できる。なので、エッジ法や深度法などでの、各部の画素どうしの法線の比較のついでに、材質の比較をすることで、材質の変化をした部分に輪郭線を引くこともできる。このため、たとえば材質「服」と材質「肌」との境目の画素のぶぶんに輪郭線を引くこともできる。
 
 
ただし、材質どうしの比較だと、たとえば手を胸(説明の簡単化のため、男の平らな胸にする)に当てている場合や、手を腹に当てている場合などは、手も胸も腹も材質は同じ「肌」なので、この方法では検出できない。
 
 
どうしても、このような場合でも、手と胸との境界線を「材質」比較の方法で描画したい場合、対策として、たとえば材質「肌-手」や材質「肌-胸」など、身体各部ごとに材質をつくっておけばいい。
 
 
なお、普通のアニメ絵では、胸と腹のあいだの境界線は書かないし、胸と肩のあいだの境界線も書かない。
 
なので、例外として、材質が違っていても境界線を書かない組み合わせをあらかじめ登録しておき、それ以外の組み合わせが隣りあった場合にだけ境界線を描けばいい。
 
もっとも、この方法を使わなくても、前述したような黒背景の方法や「法線」なんとか法などでも、手と男胸との輪郭線を描画できる可能性はある。
 
 
2,604 ⟶ 2,619行目:
 
エッジ法にかぎらず、上述のすべての方式の弱点として、カドっこを丸めるフィレット処理などの処理をされると、とたんに輪郭の検出が描画が難しくなる。
 
背景と外輪郭線の検出はフィレットされても上述のどの方法でも検出は容易だが、しかし、等角図の内部の輪郭線のような線の検出は、上述の方式では、どれも検出が困難・ほぼ不可能である。
 
 
「フィレット」とは、工業製品などで、エッジのある場所に丸みをつける加工をすることである。
2,614 ⟶ 2,632行目:
3D-CG屋さんは、ときどき、製造業メーカーなどから宣伝用CG動画などの製作を頼まれる場合もある。
 
フィレットがあってもどうしても輪郭を検出したい場合、後述の、材質の差分による方法などが対策としてある。(他にもレイトレーシングの併用があるが、これはちょっとキツイ。)
 
フィレットがあってもどうしても輪郭を検出したい場合、後述の、材質いくつか差分による方法など対策としてある。(他にもレイトレーシングの併用があるが、これはちょっとキツイ。)
==== レイトレーシングの併用 ====
# テクスチャ的に、輪郭線として検出したい場所を最初から輪郭線の色でモデル表面に塗っておく方法。
フィレットのような丸みのある方法でも輪郭線を検出する方法としては、レイトレーシングを併用する方法がある。
# 他にもレイトレーシングの併用で検出できる場合があるが、これはちょっとメモリ負担がキツイ。
 
つまり、丸みがあろうが何だろうが、全体的に見て、デコボコしてたり、段差のある場所なら、光を当てたとき、そこで明暗が変化する可能性が高い。
 
==== 輪郭線にしたい場所に3Dモデル側で黒く塗る ====
なので、いろんな方向で被写体にレイトレーシングを試行してみて、明暗の変化の激しいポイント付近にあるパーツを見つければ、そこを輪郭として認識すればいい。
リアリティは乏しくなるが、輪郭線として検出したいエッジ部に場所に、最初から(周囲の色が黒くなければ)エッジに黒く色をぬっておく方法も、単純だが効果的である。
 
エッジがフィレットされて丸められても、そのエッジごと黒くぬれば、周囲の色と違うので、簡単に見分けがつくというワケである。
 
テクスチャ的な手法である。
欠点として、メモリの負担がかなり大きくなり、そのため処理速度にも負担になりかねない。なので、携帯ゲームでの利用は、絶望的である。筐体ゲーム(プレステやx-boxなど)ですら、やや厳しいかもしれない。
 
アニメ調にデフォルメされた子供のCGキャラクターなどは、最初から鼻の下のカゲなどが、黒くぬっておかれる場合もよくある。
また、アルゴリズムも高度である。
 
 
弱点として、リアル調のCGでは導入が困難である。
ただし、この方法だと、アニメ調のキャラクターデザインだけでなく、リアル調のCGキャラクターでも、鼻と顔などのような境目の微妙な輪郭ですら検出できるので、劇画などにも応用の可能性がある。
 
また、見る角度やデザインの画風によっては、テクスチャが目立ちかねない。近くで接写する構図だと難しい。
ただし、残念ながら市場の需要として、そもそもリアル調の劇画風CGの需要が少ない。
 
 
対策として、カメラと被写体の距離や角度によって、輪郭にしたい部分のモデルだけをこっそりと輪郭テクスチャなしのモデルに入れ替える手法だと(たとえばカメラが接写になるほど近くなった場合には、輪郭部テクスチャをオフにして、テクスチャ無し3Dモデルに入れ替えるなどの方法)などが考えられる。ただし、少しメンドウくさい。
==== 関連技術 ====
市販の3Dモデリングソフトでは、各部分の「材質」(『マテリアル』ともいう)をパーツごとに登録できる。なので、エッジ法や深度法などでの、各部の画素どうしの法線の比較のついでに、材質の比較をすることで、材質の変化をした部分に輪郭線を引くこともできる。このため、たとえば材質「服」と材質「肌」との境目の画素のぶぶんに輪郭線を引くこともできる。
 
==== レイトレーシングの併用 ====
フィレットのような丸みのある方法でも輪郭線を検出する方法としては、レイトレーシングを併用する方法がある。
 
つまり、丸みがあろうが何だろうが、全体的に見て、デコボコしてたり、段差のある場所なら、光を当てたとき、そこで明暗が変化する可能性が高い。
ただし、材質どうしの比較だと、たとえば手を胸(説明の簡単化のため、男の平らな胸にする)に当てている場合や、手を腹に当てている場合などは、手も胸も腹も材質は同じ「肌」なので、この方法では検出できない。
 
なので、いろんな方向で被写体にレイトレーシングを試行してみて、明暗の変化の激しいポイント付近にあるパーツを見つければ、そこを輪郭として認識すればいい。
 
どうしても、このような場合でも、手と胸との境界線を「材質」比較の方法で描画したい場合、対策として、たとえば材質「肌-手」や材質「肌-胸」など、身体各部ごとに材質をつくっておけばいい。
 
欠点として、メモリの負担がかなり大きくなり、そのため処理速度にも負担になりかねない。なので、携帯ゲームでの利用は、絶望的である。筐体ゲーム(プレステやx-boxなど)ですら、やや厳しいかもしれない。
 
また、アルゴリズムも高度である。
なお、普通のアニメ絵では、胸と腹のあいだの境界線は書かないし、胸と肩のあいだの境界線も書かない。
 
なので、例外として、材質が違っていても境界線を書かない組み合わせをあらかじめ登録しておき、それ以外の組み合わせが隣りあった場合にだけ境界線を描けばいい。
 
もっともただし、この方法を使わだと、アニメ調のキャラクターデザインだけでなくても前述したような黒背景リアル調方法や「法線」なんとか法などCGキャラクターでも、手と男胸顔などような境目の微妙な輪郭線を描画ですら検出できるので、劇画などにも応用の可能性ある。
 
ただし、残念ながら市場の需要として、そもそもリアル調の劇画風CGの需要が少ない。
 
 
また、フィレット(丸み化)処理のある被写体の場合、黒背景法や「法線」法や深度法などでの検出が難しいので、このような場合にも、「材質」方式で輪郭を検出するのも有効であろう。
 
材質の表面上でとなりあった部分どうしの組み合わせは、例外として輪郭としては検出しないようにプログラムしておく。例外以外の組み合わせが隣り合った場合に、輪郭として検出すればいい。