我正在编写一个光线投射引擎。
射线的起始位置由站在 2D 网格内的玩家的位置给出。
当将光线投射到一个方向时,我必须确定光线相交的网格。
(这个概念的深入描述在这里:http ://www.permadi.com/tutorial/raycast/rayc7.html )
有一点不准确,会引起一些麻烦。我认为问题是由于网格步数计算不正确引起的。
但是我缺乏解决这个问题的数学理解。
问题描述:
当光线向左移动时,网格相交步长与向右移动时的步长略有不同。
(为什么我什至关心这个?:当垂直和水平交叉点彼此靠近时,特别是在角落,它导致一些水平网格交叉点比垂直网格交叉点更远离玩家的问题。因为我使用不同的纹理对于垂直交叉点,水平墙的外观被破坏了,因为在墙的小部分使用了垂直纹理,即使它是水平墙。)
这个问题是由我的算法缺陷引起的吗?这就是我计算第一个水平网格交点和网格步长的方法:
找到第一个网格交点:
if (current_angle > 180) {
first_grid_horizontal_y = ((int)p.pos_y / Field::width) * Field::width + Field::width;
} else {
first_grid_horizontal_y = ((int)p.pos_y / Field::width) * Field::width - 1;
}
first_grid_horizontal_x = p.pos_x + (p.pos_y - first_grid_horizontal_y) / tan( 180 - current_angle);
计算步长:
if (current_angle > 180) {
grid_stepsize_horizontal_y = Field::width;
grid_stepsize_horizontal_x = Field::width / tan(current_angle - 180);
} else {
grid_stepsize_horizontal_y = -Field::width;
grid_stepsize_horizontal_x = Field::width / tan(180 - current_angle);
}
如您所见,我总是使用“180 - 当前角度”来确定 x 值的方向。这会导致不准确吗?我必须更多地区分角度吗?