❤恋するコンピュータサイエンス❤

コンピュータサイエンス、3DCGをもっと楽しく、もっと本質的に!c言語、c++の記事中心です

試行錯誤cub3d DDA アルゴリズム③【DDAをループさせる】

実際のDDAアルゴリズムを回してみましょう。
壁にぶつかるまで、毎回光線を1マスずつ増やしていくループです。
毎回、x方向に1マスずつ(stepX)、y方向に1マスずつ(stepY)ジャンプしますが、常に1マスずつジャンプしています。
(光線の方向が x 方向であれば、光線は y 方向には変化しないので、ループは毎回 x 方向に1マスずつジャンプすればよいことになります。)

光線がY方向に少し傾斜している場合、x方向に何回かジャンプするたびに、レイはY方向に1マスジャンプする必要があります。(レイが y 方向にある場合は、x 方向には決してジャンプする必要はありません。)

sideDistX sideDistY はその方向にジャンプするたびに deltaDistX で増分され、
mapXmapY はそれぞれ stepX stepY で増分されます。

光線が壁に当たるとループが終了し、変数 "side" で壁の x 側と y 側、そして mapX mapY でどの壁に当たったかが分かります。

      //perform DDA
      while (hit == 0)
      {
        //jump to next map square, either in x-direction, 
or in y-direction
if (sideDistX < sideDistY) { sideDistX += deltaDistX; mapX += stepX; side = 0; } else { sideDistY += deltaDistY; mapY += stepY; side = 1; } //Check if ray has hit a wall if (worldMap[mapX][mapY] > 0)
hit = 1; }