我正在編程一個光線投射引擎。光線投射算法中的精確問題
射線的起點位置由誰是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值的方向。這是否會導致不準確?我需要區分更多角度嗎?
是的,我做我自己的棕褐函數轉換弧度度。爲了更好的可讀性,我只是發佈了tan()。 – 2014-09-03 12:54:33