2017年09月05日

トライアングルストリップ化

こないだのランタンの3Dモデルをがんばってトライアングルストリップ化していました。
参考:
■[3DCG] TriStripperを試す
ここで紹介されているTriStripperを使ってみました。

同じ頂点を共有して次の面を描くので、間に「UVや材質の切れ目」があった場合、一つの頂点に二つ以上のUVを持つわけですからきちんと描画されません。
つまり、切れ目がある場合はそこを別のストリップにする必要があります。
そこで、
1.すべての頂点を調べて、その頂点を共有している面が複数のUVを持つ場合、
  頂点インデックスを書き換えて仮頂点とする。今回は上位ビットにフラグをつけました。
2.TriStripperでストリップ化
3.ビットマスクで上位ビットのフラグを消して書き換えた頂点を元に戻す。
4.総当たりで頂点インデックスを調べ、ストリップ前オブジェクトからUVを転写。
という方法でなんとかまともに出力できました。ふう。長かった!本当に長かった!

これによりポリゴンデータ量を約半分に削減できました。シェンムーに一歩近づいたかな?
posted by たあし at 21:22| Comment(0) | ドリームキャスト開発 | このブログの読者になる | 更新情報をチェックする

2017年08月22日

トゥモローネバー

果てーしなーい闇の向こうにー。
3D表示できましたああああ!長い道のりでした!とりあえずこの喜びを動画にしました。…前回のランタンから半年ぐらい経過してますね。遅すぎだぜ!

ライティングとかトライアングルストリップ化とかカメラ関係とか、やることは山積みなのですがとりあえずひと段落です。目指せ300万ポリゴン!
posted by たあし at 00:01| Comment(0) | ドリームキャスト開発 | このブログの読者になる | 更新情報をチェックする

2017年08月09日

3Dのパースで悩み中

3Dの勉強が行き詰ってもうどうにもならなかったので、久しぶりにプログラミングの師匠に連絡。
教えてもらいながら分からないところを説明しているうちに、頭の中がまとまった気がしました。アウトプットできる環境はありがたいです。
3dnayami01.png
IQ300のエッグマンとタメをはるテイルス君。キミの知能を分けてくれ。

ローカル座標(floatの頂点配列)を平行移動や回転してワールド座標に置くとします。で、ビュー行列によってカメラを原点に移動、つまりカメラ以外のものをカメラが原点にあるようにして配置します。
この時点では「まだ描画していない」ということを失念していました。描画してないからスクリーン座標系とワールド座標系が違うとかそういうことは、この時点まで気にしなくていいんですね。
で、プロジェクション行列をかけて視錐台の範囲にギューッと世界を縮めます。
この時、カメラは原点にあり、Z軸が手前に向かってプラスなので、「カメラは常にZマイナスを見ている」ということだそうです。ニアクリップとファークリップ、カメラの見える範囲は常にマイナスというのも盲点でした。
最後にカメラからの距離、原点から見た奥行き、つまりZ座標でXYZ座標を割れば、遠くのものが小さく、手前のものが大きくなります。この時Zはマイナスだと思われます。だってカメラはマイナスを向いているので。ZもZで割るので、マイナスだったZはプラスになってくれます。これでちゃんと描画されそうです。(ドリキャスでは0以下は描画されないっぽいです。)

割と最近まで、遠くのものを小さくしたりするのはハードウェアが勝手にしてくれると思っていました。ややこしいです。うーんややこしい。
間違いあればいつでもご指摘お願いします。3Dがひと段落したら次の動画をアップしたいと思います。
posted by たあし at 23:48| Comment(0) | ドリームキャスト開発 | このブログの読者になる | 更新情報をチェックする