1
0
Fork 0

World: Move the scale factor to a constant

Clear up the computation and split the result from the ray cast to the scale
factor.

Update the castRay explanations to add the issue of unmatched axes.
This commit is contained in:
Teo-CD 2024-01-28 21:58:32 +00:00
parent e234dda860
commit 43970df494

View file

@ -107,6 +107,9 @@ float World::castRay(float originX, float originY, float orientation) const
* the grid for the other one * the grid for the other one
* - Depending on the orientation, signs must be taken into account * - Depending on the orientation, signs must be taken into account
* to work 360° * to work 360°
* - Those formulas consider regular axes (x,y), however the world is
* built around left-handed axes (x,y), so the rendered world is
* mirrored. This also explains some weird signs for rotations.
*/ */
/* Offsets to get back on the grid from the ray's origin. */ /* Offsets to get back on the grid from the ray's origin. */
float hOffsetX; float hOffsetX;
@ -148,7 +151,7 @@ float World::castRay(float originX, float originY, float orientation) const
if (orientation < 180) { if (orientation < 180) {
vOffsetX = ceilf(originX); vOffsetX = ceilf(originX);
vOffsetY = ceilf(originX) - originX; vOffsetY = ceilf(originX) - originX;
vDir = +1; vDir = 1;
vRound = 0; vRound = 0;
} else { } else {
vOffsetX = floorf(originX); vOffsetX = floorf(originX);
@ -239,6 +242,8 @@ void World::render(sf::RenderWindow& window) const
window.draw(ground); window.draw(ground);
window.draw(ceiling); window.draw(ceiling);
const float worldToCamera = (player.focalLength*2)/player.sensorSize;
/* /*
* Throw rays and draw walls over the ceiling and ground. * Throw rays and draw walls over the ceiling and ground.
* Only throws in the plane, which doesn't work for levels/3D. * Only throws in the plane, which doesn't work for levels/3D.
@ -252,7 +257,7 @@ void World::render(sf::RenderWindow& window) const
} else if (rayAngle > 360) { } else if (rayAngle > 360) {
rayAngle -= 360; rayAngle -= 360;
} }
float obstacleScale = player.focalLength*2/(castRay(player.x, player.y, rayAngle)*player.sensorSize); float obstacleScale = worldToCamera / castRay(player.x, player.y, rayAngle);
/* 2 Is wall height in meters. */ /* 2 Is wall height in meters. */
fillColumn(window, i, obstacleScale); fillColumn(window, i, obstacleScale);
} }