![]() 上のアニメーションGIFを見ればわかるよーに、顔は「八方向」分だけ手書き、という方向にしました。 NaGu-Ruは、X-Y軸メイン(再サイドビューです)の2Dゲームにするので、このY軸回転させた画像に加え、DelphiXの画像合成関数を 使ってZ軸回転を表現できます。それなら、X軸回転も・・・といきたいのはやまやまですが、 X軸回転画像についても8方向分用意するとなると、8×8で64パターンも必要になります。 ひとつの顔グラフィックは32×32だから、32×32×64×2 = 2の17乗byte = 131072byte = 128kbyte となりますね。さらに、体の分もありますからさらに2倍で256kbyteとなります。それと、手足も付け加えて多めに見て 512kbyteくらいになりそうです。これを10人分用意するとなると、512×10 = 5120kbyte = 約5MB!! しかも、顔グラフィックは「表情」がない状態でこれですから、二倍になると考えても大体10MBにもなります(マジで!?)。 というわけで、画像はY軸、Z軸回転のみをサポートすることにしました。 さらに、システムがあまりにも不安定になってきたということで、再インストールしてたら 「Windowsのパスワードが書いてあるやつ」がどっかいっちゃってて 探しに探したところ、なんと捜し求めていた3D関連の資料がどさどさっ、と出てきました。 棚からdevilmanさんです。ということで、「時代は3Dだ」とか一人で思ってくるくると回すことを決意しました。 いつこの資料がなくなるかわからないので、ここに書いておきます。いわゆるオブジェクト用変換行列は 次のようになります。ちなみに行列は4×4行列です(呼び名忘れた)。
オブジェクト用変換行列 = |Z軸回転行列|×|X軸回転行列|×|Y軸回転行列|×|平行移動行列|
まずは、X,Y,Z軸回転行列と平行移動行列の中身を書き出してみます。 また、各軸に対しての回転角度はそれぞれRx,Ry,Rzとし、移動量はlx,ly,lzとする。
んで、つぎに掛け算ずみテーブルを作ります。これはサインでの角度を 二つ入れるとそれに対応する値が返ってくる、ってものです。 テーブルのサイズは、先ほど設定した〜度系っていうのの2乗分だけ 必要です(4096度系なら4096*4096個必要)。メモリ的にはおそらく 256度系がめいっぱいだと思います。これだとメモリも256kbyteですむのでお手ごろです。 ちなみに、1024度系だと4096kbyte=4MBもいるのでかなり非実用的です。 さらに4096度系だと64MBもメモリが必要になります。完璧無理ですね。ということで、 ここでは256度系を使用することにしましょう。 ほかには、三角関数同士の掛け算部分を加法定理で掛け算を足し算にしてやる、ってのが ありますが、面倒くさそうなのでやめます。 というわけで、テーブルにより掛け算部分がかなり減りますねー。 この時点で掛け算が必要なところは、16こですがこれがなくなります。 僕は今作ってるやつで4096度系を使っているので、これを256度系に変換する必要がありますが、 4096度系での角度 ÷ 16 = 256度系の角度と計算できますが、これは 4096度系の角度 右シフト 4 = 256度系の角度というように、シフト一発で計算できますので 遅くないはず(むしろ速い?)。実際には、X,Y,Z軸それぞれの回転角度があるので、 三回シフトが必要になります。それと、足し算四回ですね。これで遅けりゃ CPUに文句を言ってください(^^;) とはいえ、あくまでこれは行列を作っただけです。この後、実際に使える形(ベクトル)に もってくには、16回の掛け算が必要になります・・・・。まぁこれはあきらめるしかない、 と思っています。どうしても高速化したいって人は固定小数点でも使ってみてはいかがでしょうか。 (テンション低いな・・・・) |