4

レイキャスティング エンジンをプログラミングしています。

光線の開始位置は、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 値の方向を決定しています。これは不正確さを引き起こしますか?角度をもっと区別する必要がありますか?

4

2 に答える 2

1

三角関数は、度ではなくラジアンで機能します。そう

tan(180 - current_angle)

のように見えるはずです

tan(Math.Pi - current_angle)

に等しいことに注意してください。

- tan(current_angle)

current_angle が次の度数の場合:

current_angle_radians = current_angle_degrees * Math.Pi / 180
于 2014-09-03T10:35:50.013 に答える