したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |
レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。

おちゃめくらぶ掲示板

1481御茶目菜子:2013/02/17(日) 22:21:39
プチコンでポリゴン表示をしよう
先日作った塗りつぶし三角形描画ルーチンだけど今ひとつ使いどころがないにょ。
唯一使えそうなのがポリゴン表示くらいということで、せっかくなのでポリゴン表示を行う
プログラムを即興で作ってみたにょ。
プチコンにはポリゴン表示命令はなく基本的にポリゴンは表示できないのだけど命令で
備わってないものは代用ルーチンとなるプログラムを作ってしまえばいいだけの話にょ。

実はプチコンでポリゴン表示というのはすでに初代プチコン時代にやっている人がいる
わけであって今更やってもただの後追いにしかならないにょ。

 「プチコンで3Dのテスト」 epoxyさん
 http://www.nicovideo.jp/watch/sm14096563
 「トライフォース」 ウルさん
 http://www.nicovideo.jp/watch/sm16276657

そこで、高速化を重視してみることにしたにょ。
ただし、mkIIは初代と比べて1.2〜1.5倍くらい高速になっているにょ。
http://ww5.tiki.ne.jp/~ochame/petitcom/p_bench.htm
上記のプチコンでの3Dテストを見る限りでは4〜5fps程度なのでmkIIのアドバンテージを考慮
すれば「すでに発表されているものより高速」と謳うためには10fps以上は欲しいところにょ。

ポリゴン表示を行う場合の大まかな流れを考えると次のようになるにょ。

 (1)データを用意
 (2)ジオメトリ処理
 (3)レンダリング

(1)データとして必要なのはまずは頂点データにょ。
x、y、zの3次元データを頂点の数だけ用意する必要があるにょ。
頂点座標は回転の中心を(0,0,0)とした時の相対座標で用意しておくと回転処理が簡単にょ。
次に用意するのがポリゴンデータにょ。
基本的にポリゴンは三角形の集合体であるため用意した頂点データのうち何番と何番と何番の
座標を結んだ三角形にするのかという情報が必要になるにょ。
それに描画色を加えた4つのデータを1組として構成ポリゴン数の分だけ用意する必要しなく
てはならないにょ。
あと、ワイヤーフレームに対応するならば何番の頂点と何番の頂点を結ぶかというデータを
用意しておけばいいにょ。(ポリゴン用のデータを使用して三角形の周りをGLINEで結ぶと
いう方法もあるけどそれだとフレームレートが半減してしまう)

(2)ジオメトリ処理はそのデータを元に回転などの座標変換処理をしてスクリーン座標に変換
することにょ。
このサンプルプログラムでは下画面をマウス代わりにして上下回転、左右回転、拡大縮小が
自由自在にできるようになっているにょ。
上下回転はX軸回転、左右回転はY軸回転を行えばいいにょ。
これは単純に行列式に入れて計算するだけなので何ら難しいことはないにょ。
もちろん、高速化のためにこの式も簡略化して出来る限り無駄のないようにしておく必要が
あるにょ。
そして、それをスクリーン座標に変換する必要があるにょ。
スクリーン座標変換は「プレイヤー視点=カメラ視点」という場合には単純な1次式で表す
ことができるため非常に簡単にょ。(これが斜め見下ろしだと計算が少し難しくなる)
http://ww5.tiki.ne.jp/~ochame/petitcom/tips/routine.htm#3d_screen

(3)これで回転したオブジェクトの頂点が画面上でどこにくるのかが分かるためあとはポリゴン
表示(レンダリング)を行うだけなんだけどその前にワイヤーフレームを行ってみたにょ。
ワイヤーフレームに関しては私はポケコン(PC-E500)でも作った経験があるけどポケコンでは
高速化を駆使しても1〜2fps程度の速度しか出なかったので事実上使い物にはならなかったにょ。
しかし、プチコンならば頂点数によっても異なるけど今回用意したデータ程度ならば60〜90fps
であるため非常に高速にょ。

ここからがいよいよ本番にょ。
ポリゴン表示には例の高速三角形描画ルーチンを使えばいいのだけど普通にポリゴン番号順に
表示したのではダメで本来ならば手前の部分に隠れている奥の部分が見えないような処理を
する必要があるにょ。
これは3D演算用のハードウェアならばZバッファを搭載しているためピクセル単位で深度を記録
していけばいいのだけどプチコンではZバッファによる処理をソフトウェアで実装しなくては
ならず、それでは速度面で非常に厳しいものになるため単純なZソートを行うことにしたにょ。
これは面ごとにどれが手前でどれが奥かを頂点座標から判断して並べ替えるというものにょ。
ただ、ここで難しいのは単純に頂点座標からは手前か奥かは判断しにくいケースが非常に
多いということにょ。
ということでZソートは不完全だけど座標に重みを付けることで速度を維持しつつある程度は
正確な判断ができるようになったにょ。
しかし、Zソートの導入のせいで24面体の表示は10fpsを割り8〜9fpsになったにょ。(24面体で
10fpsを確保するには240ポリゴン/秒の速度が必要だからやむを得ないけど)

ここから速度を上げるために行ったのが陰面消去にょ。
これは、本来ならば見えない裏側からみたポリゴンを判定してそれを表示しないようにする
というものにょ。
Zバッファのようにピクセル単位の深度情報を処理しているならばそれでこの陰面消去処理も
行えるのだけど面単位(ポリゴン単位)でしか処理ができないため行える方法といえば
視線ベクトルと法線ベクトルとの内積を計算してそれを元に判断するというものにょ。
これによって、処理は増大したものの表示しなくてはならないポリゴン数が減ったために
24面体の表示は12fpsにまで向上したにょ。(トライフォースで13〜14fps、立方体ならば
16〜17fps)
さらにZソートではカバーしきれてなかった奥にあるポリゴンの非表示も行えるように
なったにょ。
ただし、ポリゴンの表と裏を判断するためにポリゴンのデータはベクトルの向きを考慮した
順番にする必要があるにょ。(といっても、ポリゴンを構成する3つの頂点の順番を反時計
周りに統一したというだけの話だけど)

このようにして、今回のプログラムはとりあえず完成したにょ。
http://www.youtube.com/watch?v=NUZD6W5qw2M
ちなみに1日で作ったためあまりできの良いプログラムではないのでもう少しリストを見直して
から公開するにょ。(1月28日に書いたGRPの2軸回転の方が速度を出すために今回のポリゴン
プログラムよりも作るのに苦労した)
あとモデリングは上記の他の方の動画を見て脳内で3次元座標に変換をしたためモデリングに
かかった時間は0分にょ(笑)
公開しても使ってくれる人がいるかどうかは微妙だけど自分が作った3Dデータをプチコンで
表示するというだけでも最初は感動が味わえると思うにょ。(ジオメトリ処理を込みで
概ね120〜200ポリゴン/秒くらいだからゲームで使うにはかなり厳しい速度)
解像度をデフォの256x192から縦横半分の128x96にすれば描画速度は1.5倍程度に高速化可能
だけどジオメトリ処理の負荷は変わらないのでここから大幅な速度向上は難しそうにょ。
ワイヤーフレームならば実際のゲームでもそれなりに使えるレベルの速度はあるのでそれを
使ったゲームならば十分作るのは可能ではないかと思うにょ。




掲示板管理者へ連絡 無料レンタル掲示板