Open Raclamusi opened 3 months ago
DebugCamera3D がコンストラクタの引数 focusPosition で指定した注視点と異なる位置を注視します。
DebugCamera3D
focusPosition
下のスクリーンショットは BasicCamera3D と DebugCamera3D にそれぞれ赤い球を注目するようコンストラクタで指定したときの結果です。 BasicCamera3D の場合は赤い球が中心にあるのに対し、 DebugCamera3D の場合は赤い球が中心から外れています。
BasicCamera3D
原因は DebugCamera3D::m_focusY の初期化にあると考えられます。
DebugCamera3D::m_focusY
https://github.com/Siv3D/OpenSiv3D/blob/9c77228c3f1642b1274f10be8a86379d37a0cfe1/Siv3D/include/Siv3D/DebugCamera3D.hpp#L35
DebugCamera3D の注視点は、カメラ位置を中心とする半径 1 の y 方向に無限に伸びる伸びる円筒上に正規化されます。 カメラ位置から注視点へのベクトルを正規化したベクトルを使って m_focusY を初期化していますが、このベクトルの y 成分が 0 でないとき、その指す位置は円筒上になく、その y 成分で m_focusY を初期化したとき本来指すべき位置より y 座標の絶対値が小さくなります。
m_focusY
つまり、カメラ位置から注視点へのベクトルを円筒上に来るように正規化し、 m_focusY を初期化することでこの問題は解決できます。 例えば、 m_focusY の初期化を次のように変更します。
double m_focusY = [this] { const auto focusVector = (BasicCamera3D::m_focusPosition - BasicCamera3D::m_eyePosition); return (focusVector.y / std::hypot(focusVector.x, focusVector.z)); }();
DebugCamera3D::setView() にも同様のバグがありました。
DebugCamera3D::setView()
コメントありがとうございます! なぜかこの Issue の存在が記憶から抜け落ちてました(多分忙しかった時期だったため)。 対応が必要なので、提案を試してみます。よさそうだと判断した場合 PR 受け付けます。
問題を確認しました。修正方法も妥当だと思います。PR 受け付けます!
DebugCamera3D
がコンストラクタの引数focusPosition
で指定した注視点と異なる位置を注視します。下のスクリーンショットは
BasicCamera3D
とDebugCamera3D
にそれぞれ赤い球を注目するようコンストラクタで指定したときの結果です。BasicCamera3D
の場合は赤い球が中心にあるのに対し、DebugCamera3D
の場合は赤い球が中心から外れています。再現コード
```cpp # include原因の考察と解決策
原因は
DebugCamera3D::m_focusY
の初期化にあると考えられます。https://github.com/Siv3D/OpenSiv3D/blob/9c77228c3f1642b1274f10be8a86379d37a0cfe1/Siv3D/include/Siv3D/DebugCamera3D.hpp#L35
DebugCamera3D
の注視点は、カメラ位置を中心とする半径 1 の y 方向に無限に伸びる伸びる円筒上に正規化されます。 カメラ位置から注視点へのベクトルを正規化したベクトルを使ってm_focusY
を初期化していますが、このベクトルの y 成分が 0 でないとき、その指す位置は円筒上になく、その y 成分でm_focusY
を初期化したとき本来指すべき位置より y 座標の絶対値が小さくなります。つまり、カメラ位置から注視点へのベクトルを円筒上に来るように正規化し、
m_focusY
を初期化することでこの問題は解決できます。 例えば、m_focusY
の初期化を次のように変更します。