「ゲームプログラミング/3Dグラフィック」の版間の差分

削除された内容 追加された内容
1,517 行
なお、このプログラムだとカメラの反対側にある被写体も描画してしまう。なので、それら反対側の描画をカットする機能を、今後のプログラミングで追加する必要がある。
 
描画カットの方法は簡単で、単に被写体の回転後のz座標がマイナスになる場合には、描画しないように、if文で記述すればいいだろう
 
描画のrectangle命令を、下記のように if 文で書き換えればいい。つまり、描画する場合の条件として、回転後のz座標 カメラ座標 の数値がプラスの場合にだけ描画するようにプログラミングすればいいだけであろう(実はまだ、これだけでは不十分被写体裏側にカメラが回りこんだ場合に、オカシな描画になってしまう)
 
<syntaxhighlight lang="c">
if (kaiten_zahyou_list[3].z_zahyou <= Camera_z) {
Rectangle(hdc,
hisyatai_onViewX + touei_zahyou_list[3].x_zahyou, hisyatai_onViewY + touei_zahyou_list[3].y_zahyou,
hisyatai_onViewX + touei_zahyou_list[4].x_zahyou, hisyatai_onViewY + touei_zahyou_list[4].y_zahyou + 40); // 基準の状態
}
 
 
brasi_parts_2 = CreateSolidBrush(RGB(100, 100, 255)); // 壁の表示用のブルー色のブラシを作成
SelectObject(hdc, brasi_parts_2); // ウィンドウhdcと、さきほど作成したブラシを関連づけ
 
if (kaiten_zahyou_list[1].z_zahyou <= Camera_z) {
Rectangle(hdc,
hisyatai_onViewX + touei_zahyou_list[1].x_zahyou, hisyatai_onViewY + touei_zahyou_list[1].y_zahyou,
hisyatai_onViewX + touei_zahyou_list[2].x_zahyou, hisyatai_onViewY + touei_zahyou_list[2].y_zahyou + 30); // 基準の状態
}
 
</syntaxhighlight>
 
 
この方法でも、カメラが被写体に移りこんだ場合も正しく描画できる(理由は後述する)。式変形をして内積計算に変形もできる。
 
では、なぜこのように被写体の裏側にカメラの回りこんだ場合ですらも、上記のif判定式によってカメラが被写体の裏側に回り込んだ場合でも、正しく判定できるのか。
 
その理由は、不等式
:kaiten_zahyou_list[3].z_zahyou <= Camera_z
を式変形すると、
:(kaiten_zahyou_list[3].z_zahyou - Camera_z ) * 1 <= 0
となり、さらに変形して
:(kaiten_zahyou_list[3].z_zahyou - Camera_z ) * (-1) >= 0
となり、最終的にベクトルの内積の形に変形できて、
:(kaiten_zahyou_list[3].z_zahyou - Camera_z ) * (-1) + (kaiten_zahyou_list[3].x_zahyou - Camera_x ) * (0) >= 0
と式変形できる。2項目は0で掛け算しているので、2項目の積は0である。
 
最後の4番目の式は、これはベクトルの内積であり、カメラ位置ベクトルから被写体の公転後の位置ベクトルとの差分ベクトルと、カメラの向きベクトル(-1,0)との内積である(カメラを時点させた場合には、代わりに被写体を公転させるように設計したため、このような計算ではカメラの向きベクトルは(-1,0)になる)。
 
要するに、ベクトルの内積の符号の正負を使って、描画するか否かを判定しているだけにすぎない。