gombeのブログ

マイコンの電子工作系PIC32/KiCad/C/C++/3D/

マイコンで3D表示(図解)

3D表示に関してここにまとめておきます。

1、座標変換

3DのCGの世界ではカメラを回すのではなく、世界を回します。また、世界を歪めます(透視投影)。しかし線形変換では透視は与えられないので別の方法を使います。

透視はzで割ることで与えられます。しかし実際にはzは重なり計算に用いられるので代わりにwを使います。そのため通常はカメラの位置は焦点になります。投影行列*カメラ行列が基本的な変形式となり、そこに必要に応じてオブジェクト回転などを入れます。

ここで透視投影と平行投影の違いを見てみましょう。

平行投影の場合、以下のような表示となります。物体の距離にかかわらず等しい大きさで描画されます。これはzの値を破棄することで投影することができます。

また、今回は透視投影をします。これは完全にカメラに視点をもたせ、そこからの空間の広がりを描画します。

ここで描画空間も確認しておきましょう。描画空間とはこの中の点を描画する、すなわちクリップする範囲を定めるための空間です。視点に近い方ではnearを用いて遠いところではfarでクリッピングします。

2,描画の方針

上の図でも説明がありますが、少ないメモリで3D計算をする場合はzバッファの値も少ないため、工夫して節約する必要があります。そのため、奥行きの情報、またピクセルの情報は一ライン分のみ保持して、一気に描画します。実際には、ピクセルの情報のみ2ライン分保持することもあります。(ダブルバッファリング)

zスパンの計算は普通に奥行きを計算して手前側を描画するだけに過ぎません。このため手前から描画することで二重の描画を防ぎ、速度を向上させることもできます。

3、三角形の形をあらかじめ計算

三角形を描くためには、あらかじめ辺の傾き(増加量)を計算しておくと高速です。

開始点vx1,vx2を一定の増加量ずつ足しあわせていきます。三角形には変曲点がありますのでその文を考慮しておきましょう。この場合ではvx2が途中で変化します。忘れずに実装しましょう。同様にzバッファやw補間、uv補間もします。

三角形内も補間したい場合は、まず辺で補間し、その両端を更に補間をかけます。いずれも増加量を予め計算しておくことで高速に求めることができます

テクスチャマッピングについて知るべきこと

テクスチャマッピングで何を注意する必要があるかというと歪みの補正です。下の図を見てください。

これを三角ポリゴンに分解して、以下のようになります。

気づいていらっしゃるかもしれませんが、手前の三角系のほうが、大きく表示されています。これは点を保管するだけでは、奥行きの情報まで補間しないと正しいテクスチャマッピングができないということを暗示しています。そのためマッピングの際は予め1/wを計算しておき、その値で描く要素をかけて、その1/wを補間した結果で割ることで補正できます。

https://github.com/elect-gombe/esp32_mmd