まったり アイマス2

アイドルマスター2 超ライトユーザーのプレイ日記

3662. 陰関数表示プログラム、概要、続き^3

2022年02月07日 | 日記
 プログラムそのものの解説を少しやって、今回で本シリーズは終了です。

 最初に定数の定義があって、WT、HT、DTはそれぞれ表示の横幅、縦幅、奥行きです。計算の都合上、8の倍数を指定します。
 配列b1はビットマップファイルのヘッダ部です。ここにWindowsOSの決まりどおりに絵のドット数やドット毎の色のビット数を置きます。関数main()の最初の所で値をセットしています。

 配列b0が各ドットの色を指定する、つまり絵の中身です。1次元配列になっているのはC言語の仕様上、なるべく1次元にするとポインタを使用するときに型指定で混乱しません。なので、縦横3色が1次元に並べられています。1要素のデータ型はバイト(char)で画面の左下から青緑赤の値の順で右に進み、1行の次は順次上の行に移行します。この行列の中身は関数main()の最後の方でヘッダに続いて出力されます。

 配列zbはzバッファと呼ばれる各ドット毎の奥行き情報です。書き込もうとしているドットの前にすでに他のドットがあったら上書きしません。本プログラムでは奥から計算しているのでもしかしたら不要ですが、後で複数のオブジェクトを配置する際に役立ち、それほど面倒な仕掛けではないのであらかじめ用意しておきます。 

 配列v00は粗い方の格子(8ドット間隔)の各頂点での関数値を保持する配列です。これも中身は2次元ですが配列は1次元です。縦横とも実際のドット数より一つ多いのはアルゴリズムを容易にするためです。配列v01はその一つ手前、z軸で直上の値の配列です。この2配列で格子の立方体が並んだ感じになります。隣接する頂点で符号が変化したら、その間に関数値0の地点があると類推できます。
 配列v10は細かい方の格子、つまり画面のドット毎の関数値です。配列v11はその1ドット上の関数値。隣接するドットで符号が反転していたら、そのドットをプロットします。
 配列u00~u11は切断面表示用の関数func0()用の同様の配列です。

 少し下に行って、lkは環境光の割合で、これ以上暗くなりません。lx,ly,lzは光源の方向です。main()関数の最初の方で単位ベクトル化されるので、ここはメートルとかの感覚で左右・上下・前後の値を入れれば良いです。角度指定だけで平行光線となります。

 研究用などにがんがん使うのならdraw1()やdraw2()はもう少し改良した方が良いと思います。しかし、簡単な図形ではこのままでも役立ちそうなので、分かりやすい形のこのままにしておきます。
コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 3661. 陰関数表示プログラム... | トップ | 3663. PS5はじわじわと »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

日記」カテゴリの最新記事