2020/04/22(水) [n年前の日記]
#1 [godot] カメラ情報から自機の移動範囲を求めるソレを考えてるところ
Godoto Engine 3.2.1 上で、カメラ情報から自機の移動範囲を求めることができないかと考えてるところ。
◎ 前提条件。 :
Godot Engine の座標系は以下のような感じ。
いわゆる右手座標系、なのだろうか。
_3次元CGと座標系
カメラ(Camera)情報は以下。
自機の移動面は、y=0 の平面。
余談。
- +X : 右
- +Y : 上
- +Z : 手前
いわゆる右手座標系、なのだろうか。
_3次元CGと座標系
カメラ(Camera)情報は以下。
- Tarnslation (位置) : (x, y, z) = (0, 40, 12)
- Rotation (角度) : (rotx, roty, rotz) = (-65, 0, 0)
- Fov (画角) : 60度
自機の移動面は、y=0 の平面。
余談。
- Godot Engine のカメラは、x回転角度が0の時、水平線が見える。(真横を見てる)
- カメラのデフォルト設定では、画角は垂直画角として扱われる。
- カメラの Keep aspect 設定を変えることで、水平画角にすることも可能。
◎ 縦方向の移動範囲。 :
縦方向というか、奥行き方向については、以下の計算で求めることができそう。たぶん。
前述の図は、横方向から見た時の図だけど、カメラの位置を原点にした状態で考えてるので、求めた値にカメラの位置情報(z値)を後から加減算して本来の値を得ることになる。
一応 Godot Engine 上で、自機の位置を計算で求めた値に変更してみたら画面の上下端に位置してるように見えたので、この計算でも合ってるんじゃないかな。
問題は横方向。どうやって求めればいいのだろう…。
cxrot = -65 cy = 40 cz = 12 fov = 60 ang = 180 - cxrot - (fov / 2) = 215 n = (-cy) / sin(ang) = 69.74 z_top = n * cos(ang) + cz = -57.13 + 12 = -45.13 ang2 = 180 - cxrot + (fov / 2) = 275 m = (-cy) / sin(ang2) = 40.15 z_bottom = m * cos(ang2) + cz = 3.50 + 12 = 15.50
前述の図は、横方向から見た時の図だけど、カメラの位置を原点にした状態で考えてるので、求めた値にカメラの位置情報(z値)を後から加減算して本来の値を得ることになる。
一応 Godot Engine 上で、自機の位置を計算で求めた値に変更してみたら画面の上下端に位置してるように見えたので、この計算でも合ってるんじゃないかな。
問題は横方向。どうやって求めればいいのだろう…。
◎ 垂直画角から水平画角を求める。 :
とりあえず、垂直画角から水平画角を求めないといけない。
w = 1280 # Window width h = 720 # Window height fov = 60 tan(fov / 2) = (h / 2) / dist dist = (h / 2) / tan(fov / 2) tan(fov_h / 2) = (w / 2) / dist fov_h / 2 = arctan((w / 2) / dist) fov_h = 2 * arctan((w / 2) / dist) fov_h = 2 * arctan((w / 2) / ((h / 2) / tan(fov / 2))) = 91.50垂直画角が60度、ウインドウサイズが1280x720なら、水平画角は91.50度ぐらいになるのかな。コレ、合ってるんだろうか。
◎ 別の方法はないのかな。 :
例えば、平面と線分の交点を求める関数でもあれば、こんな計算をしなくても自機の移動範囲を求めることができそうな気もするのだけど…。どうなんだろう…。自機が移動する平面と、カメラの四隅に相当する線分で、交点を求めれば…。そのほうが汎用性はありそうな気もする…。
そういう関数って、Godot Engine には無いのかな。ありそうな気もするのだけど。
そういう関数って、Godot Engine には無いのかな。ありそうな気もするのだけど。
[ ツッコむ ]
以上、1 日分です。