2

私はここで少し錆びています。

カメラの視野方向を表すベクトル (camDirectionX、camDirectionY、camDirectionZ) があります。カメラの位置である (camX, camY, camZ) があります。

次に、(objectX、objectY、objectZ) にオブジェクトを配置します。

カメラの視点から、オブジェクトの方位角と仰角を計算するにはどうすればよいですか??

4

1 に答える 1

4

問題を単純化するために私が最初に行うことは、座標空間を変換して、カメラが (0, 0, 0) にあり、軸の 1 つを真下に向けるようにすることです (したがって、方向は (0, 0, 1) となります) )。カメラが (0, 0, 0) にあるように変換するのは簡単なので、ここでは説明しません。カメラの向きが (0, 0, 1) になるように回転させるのは少しトリッキーです...

それを行う 1 つの方法は、カメラの完全な正規直交基底を構築し、それを回転行列に貼り付けて適用することです。カメラの「正規直交基底」は、カメラから前方、上方、および右を指す 3 つのベクトルを意味する凝った言い方です。それらはすべて互いに 90 度である必要があり (これは ortho ビットが意味することです)、すべての長さは 1 でなければなりません (これは通常のビットが意味することです)。

これらのベクトルは、ちょっとした外積のトリックで取得できます。2 つのベクトルの外積は、両方に対して (90 度で) 垂直です。

右向きのベクトルを取得するには、カメラの方向ベクトルを (0, 1, 0) (真上を指すベクトル) で外積するだけです。外積から得られるベクトルを正規化する必要があります。

カメラのアップ ベクトルを取得するには、カメラの方向ベクトルと、計算したばかりの右向きのベクトルを外積します。両方の入力ベクトルが正規化されていると仮定すると、正規化は必要ありません。

これで、カメラの直交基底ができました。これらのベクトルを 3x3 行列の行に貼り付けると、座標空間を変換する回転行列が得られ、カメラが軸の 1 つ (ベクトルを貼り付ける順序によって異なります) の真下を向くようになります。

オブジェクトの方位角と仰角を簡単に計算できるようになりました。

方位角を取得するにatan2は、オブジェクトの x/z 座標で を実行します。

標高を取得するには、オブジェクト座標を x/z 平面に投影し (y 座標を 0 に設定するだけです)、次のようにします。

acos(dot(normalise(object coordinates), normalise(projected coordinates)))

これにより、常に正の角度が得られます。オブジェクトの y 座標が 0 より小さい場合は、角度を負にしたいでしょう。

これらすべてのコードは次のようになります。

fwd = vec3(camDirectionX, camDirectionY, camDirectionZ)
cam = vec3(camX, camY, camZ)
obj = vec3(objectX, objectY, objectZ)

# if fwd is already normalised you can skip this
fwd = normalise(fwd)

# translate so the camera is at (0, 0, 0)
obj -= cam

# calculate the orthonormal basis of the camera
right = normalise(cross(fwd, (0, 1, 0)))
up = cross(right, fwd)

# rotate so the camera is pointing straight down the z axis
# (this is essentially a matrix multiplication)
obj = vec3(dot(obj, right), dot(obj, up), dot(obj, fwd))

azimuth = atan2(obj.x, obj.z)

proj = vec3(obj.x, 0, obj.z)
elevation = acos(dot(normalise(obj), normalise(proj)))
if obj.y < 0:
    elevation = -elevation

注意すべきことの 1 つは、カメラが真上または真下を向いている場合、元のカメラ ベクトルと (0, 1, 0) の外積が長さゼロのベクトルを返すことです。カメラの向きを完全に定義するために、カメラは常に「まっすぐ」であると仮定しましたが、カメラが真上または下を向いている場合は意味がありません。別のルールが必要です。

于 2012-06-11T03:47:39.087 に答える