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:
parent
e234dda860
commit
43970df494
1 changed files with 7 additions and 2 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue