2014-09-03 78 views
2

我正在編程一個光線投射引擎。光線投射算法中的精確問題

射線的起點位置由誰是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值的方向。這是否會導致不準確?我需要區分更多角度嗎?

回答

1

三角函數與弧度,不度工作。所以

tan(180 - current_angle) 

應該像

tan(Math.Pi - current_angle) 

注意,它等於

- tan(current_angle) 

如果您current_angle是在度是:

current_angle_radians = current_angle_degrees * Math.Pi/180 
+0

是的,我做我自己的棕褐函數轉換弧度度。爲了更好的可讀性,我只是發佈了tan()。 – 2014-09-03 12:54:33

1

我覺得你不準確上升時從削減1開始。

這背後的想法可能是你想獲得塊的最後一個像素的索引,但這是必要的:你在這裏做浮點數學,下一個水平交點的值應該代表網格單元之間的連線。如果向下走,它代表一個單元格的最高座標;如果你向上,它代表最低的座標。

(旁白:(int) y/w將全面邁向零,因此將只適用於非負數的工作,您可能會考慮使用floor(x/w)。)