古いCPUの話題が多いです

写真付きで日記や趣味を書くならgooブログ

影のある積み木プロジェクト

2017-06-18 15:15:00 | デジタル・インターネット

みなさんこんにちは。
今回は、ずっと昔の1985年、古いパソコンSHARP MZ-80Bのために私が勝手に始めたプロジェクト「影のある積み木」をご紹介します。
このソフトは画面上に立方体だけをひたすら置いていき、いろいろな形を作ることを目的とします。
もともとはMZ-80Bで動かしていたのですが、プログラムのテープを失ってしまい、2012年になってやっとこのプロジェクトを復活させるチャンスに恵まれました。
私の記憶に基づいて、当時の自作ソフトを再現したつもりです
とはいえ、いきなりMZ-80Bで動かそうとすると大変な労力になります。高速浮動小数点、ポリゴン表示、クイックソートなど、全部なにもないところから作成していました。若いころはよくやったと思います
したがって、年老いた今日では、現在のパソコンで動くインテル Visual Fortranコンパイラを使用し、当時に比べれば楽して作ることができました。
表示例を下記に示します。
    


表示例1(宇宙ステーション?)
    

表示例2(巨大墓地?)
    

表示例3(四角い建物?)
    
・解説
このソースコードはかなり長いですが、やっている内容は単純です。解説を下記に示します。

  1. 立方体を表示するには
    3次元空間内に同じ大きさの立方体を隙間なく並べて、任意の視点から見る場合、それぞれの立方体の中心の座標と視点との距離を計算します。
    その距離が遠い立方体から順に表示すれば、Zバッファを使わずに正しく表示できることは、数学的に証明されています。
       
  2. 同一平面上にある面は同じ色で塗る
    同一直線上にない3つの座標が分かれば、それらの点を通る平面の方程式を決めることができます。
    複数の立方体のいろいろな面を表示するときに、それらの面が互いに同一平面上にあると分かったときは、仮想画面上に同じ色コードでペイントできるよう、色コードを定めます。
    その後1.で述べた、視点との距離が遠い順にそれぞれの色コードで面をペイントします。
    結果的に、視点との距離が遠い面の色コードは、より近い面の色コードで上書きされることがあります。
       
  3. 影を表示する
    ここではいわゆる「シャープな影」だけを扱います。
    同一平面上の複数の面に投げかけられる影の処理は、一括して行うことができます。
    そこで2.で述べた、色コードごとに処理すれば良いのです。
    それぞれの色コードがペイントしてある仮想画面の矩形の中に、該当する色コードが1ドット以上存在するか検索して確かめます。
    もし色コードが全く見つからなければ、それは視点により近い面の色コードによってすべて上書きされてしまったと言えますので、これから述べる影の投影の処理はすべて省略して処理速度を上げます。
    影の原因になる立方体の面の頂点座標から、該当する同一平面上に投げかけられる影の頂点座標を計算します。
    その頂点座標に従って、2次元のポリゴンをペイントすれば良いのですが、実際に「影」にするのはそのポリゴンを塗りつぶす座標の中で、該当する色コードがある座標だけにします。このようにすることで、上書きで自動的にかくれ面処理された色コードがある場所だけを正しく影にすることができます。
    影の表示に関するこれらの事項は、このプログラムのように「立方体だけ」という特殊な条件でなくても、Zバッファなどを使ったより一般的なシェーダーにも応用できると思います。
       

コードは、インテル Visual Fortran の QuickWin を使用して作成されています。
右クリック→「すべて選択」でコピー、ペーストして御利用下さい。
ビルド、実行しますと、多くの立方体を3Dで表示します(影の処理有/無を選択可能)
下記をご覧ください。(コード専用のページに移動します)

http://dewdrop-mitch.sakura.ne.jp/tomoki-j-2.html

時間と能力に恵まれることがあれば、いずれはMZ-80Bで実行したいと思っています。

 

ジャンル:
ウェブログ
この記事についてブログを書く
« PS4 Pro 試用記 | トップ | 1990年代の古いポケコン... »