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

削除された内容 追加された内容
編集の要約なし
1,131 行
 
==== 回転させよう ====
===== 線形代数 =====
:※ タイトルは「線形代数」だが、内容は高校レベルの「行列」の初歩であり、座標幾何学の内容である。タイトルが「行列」だと、人などの並びと誤解されかねないので、あえて学術的に「線形代数」とした。
 
回転をさせるには、カメラを右方向にある角度だけ回転させた場合、視界内での被写体は逆方向である左方向に回転することになるので、つまり視界内のすべての被写体のすべての点はすべてカメラを中心に逆方向である左方向に公転することになる。
 
1,271 ⟶ 1,274行目:
</math>
の式で決まる。
 
 
 
===== 望遠と広角のハナシ =====
平面投影の特徴として、回転体の拡大縮小比率が不正確である。
 
 
たとえば、構図A
<pre>
□ 被写体
 
 
-----------------------------スクリーン
↑ カメラ
</pre>
 
 
と、構図B
<pre>
       □ 被写体
 
-----------------------------スクリーン
↑ カメラ
</pre>
 
とでは、被写体がスクリーンにより近くにある構図Bのほうが、大きく見えてしまう。
 
なぜなら、(中学レベルの)相似比によって拡大縮小率が決まるので、つまりスクリーンとの距離によって拡大縮小率が決まるからである。
 
 
現実の人間の視界では、どう考えても、カメラから遠くにある被写体は小さく見えるハズであるが、しかし、平面投影では(カメラとの距離ではなく)、スクリーンとの距離によって拡大縮小率が決まる。
 
 
このように、平面投影では、実際の人間の視界とは異なる。
 
 
しかし、それでも私たちは、あえて平面投影を使うべきである。球面投影に対応するPC映像デバイスは無いし、円柱投影では縦横比が不正確になるからである(そのため、円柱投影は視界内にある回転体や球体・円盤などを描写するのが難しい)。
 
 
 
なお、平面投影を補正しようとしても無駄、あるいは補正にすらも欠点がある。
 
たとえば容易に思いつく案としては、「カメラ前方の視界中心にある被写体を、中心に近いほど拡大表示させよう」とするアルゴリズムの導入だろうが、これには下記のような欠点がある。
 
 
<pre>
□ □
      
 
-----------------------------スクリーン
↑ カメラ
</pre>
欠点とは、もし2個以上の被写体が近くどうしで並びあってる場合に、もし中心側の被写体を拡大したとすると、中心に近い側の被写体によって、その隣の被写体が隠される現象が発生しうる(現実の人間の視界では、そんな現象は起こりえない)。
 
 
結局、どうあがいても、平面投影では、どこかの描写が不正確になる。
 
ならば、視界の端っこに、不正確な部分を寄せたほうがイイ。好都合なことに、平面投影では、視界の中心ちかくは比較的に正確である。平面投影で不正確になるのは、視界の端っこである。
 
 
なので、平面投影のアルゴリズムは、あまり余計にイジラナイでいるほうが安全だし、管理もラクである。
 
 
 
地図の投影法の問題と同じで、本来は人間の二つの目による視界は球面投影に近いと考えられるので、たとえば地球儀を地図に置き換えたら原理的に不正確になるように、球面投影の視界を平面投影あるいは円柱投影に置き換えたら、どうあがいても不正確になる。
 
 
なので、あまり視野角を大きくしすぎないほうがイイ。
 
どうしても大きな視野が必要な場合は、対策として例えば望遠鏡のように、遠くから眺めるようプログラムにして、視野角そのものは広げないようにしたほうがイイだろう。
 
 
なお、テレビ局用などのレンズ付き撮影ビデオカメラなどでも、望遠的なレンズを使って遠くから被写体を写す方式である(実際に望遠レンズかどうかは知らないが、すくなくても決して広角レンズではない)。(よく、テレビ番組などの制作裏話などの紹介の番組などで、スタジオセットの撮影で、セットから結構離れた場所でカメラマンが やや大きい撮影カメラで撮影しているシーンがときどきがあるだろう。バズーカ砲みたいに肩に担いだり、あるいはカメラを荷台に載せて撮影するカメラをもってるアレ。あの距離みたいに、実際の撮影でも、けっこうカメラマンは離れている。)
 
人間の目を、実物のカメラですら(人間の目を完全に)再現するのは、原理的に無理なので、カメラですらも、望遠的に距離を離すことによって視野角を小さめにして、誤差を縮小している。
 
 
 
1,277 ⟶ 1,357行目:
 
</syntaxhighlight>
 
 
=== 隠面処理 ===