Gakuto1112 / FiguraBlueArchiveCharacters

The avatars for Figura, the skin mod for Minecraft Java Edition, which are imitated characters who appear in "Blue Archive (ブルーアーカイブ)", the game for mobile devices.
https://youtu.be/JrPhLR34mLA
MIT License
25 stars 0 forks source link

Exスキルアニメーション中のカメラの位置のずれ #18

Closed Gakuto1112 closed 6 months ago

Gakuto1112 commented 6 months ago

不具合概要

アバターのExスキルアニメーション中のカメラワークにおいて、カメラの位置が想定した場所と異なる場合がある。例えば、以下の画像の場合はカメラの位置が想定している場所よりもかなり近い所に位置してしまっている。

カメラの位置がずれている例

原因

カメラのコリジョン判定を検出する方法に問題があり、スクリプトで検出したカメラの距離と実際のカメラの距離に差異があるのが原因。

以下、詳細説明

マインクラフトの三人称視点のカメラは通常、プレイヤーキャラクターから4ブロック離れた位置に存在する。

三人称視点

しかし、プレイヤーの視線の4ブロック以内にブロックが存在する場合、カメラがブロックの中にめり込むのを防ぐためにカメラがプレイヤーに近づくようになっている。

カメラの接近

Exスキルアニメーション中は、カメラが意図せず近寄るのを防ぐために、カメラのコリジョン判定を無効化している(打ち消している)。Figuraでは、カメラのコリジョン判定を消す機能は存在しないため、スクリプトでカメラのコリジョン判定を打ち消す機能を実装している。

しかし、このスクリプトで検出したカメラの距離と実際のカメラの距離に差異が発生してしまうため、正しくコリジョン判定を打ち消せないのが原因。

考え方と問題点

カメラの回転軸(renderer:setOffsetCameraPivot()で指定した位置)となる位置から、カメラがある方向(≒カメラの向き、client:getCameraDir()を使用)の間で、当たり判定に衝突するまでの距離を取得する(最大4ブロック、RaycastUtils:getLengthBetweenPointAndCollision()を使用)。ここから得られた値とrenderer:setCameraPos()を用いてカメラのコリジョン判定を打ち消す。

この考え方は間違えではなく、通常時では正常にコリジョン判定を打ち消せることを確認した。しかし、Exスキルアニメーション中のカメラの位置や方向が変化し続ける中では上手く打ち消すことができない。カメラの位置と方向を変更している場合はこの考え方が適合しない可能性がある。

解決策と考察

アバターモデル内のCameraAnchorに直接当たり判定検出のポイントを設置する。 → そもそも、CameraAnchorの方向と実際のカメラの方向が微妙にずれていることが判明。この方法は使えなかった。

Figuraにコリジョン判定の打ち消し機能が実装されるまで待つ。 → 時間がかかるし、いつになるのかも不明。これに期待する場合、機能のリクエストを行う必要がある。

現在の考え方では上手く解決できない可能性が少なからずあるので、代替の方法を考えておく。

Gakuto1112 commented 6 months ago

代替案として、renderer:setOffsetCameraPivot()を使わずrenderer:setCameraPos()のみでカメラの位置を制御する案。renderer:setCameraPos()でカメラの位置を移動させてもカメラのコリジョン判定の位置は変化しないため、通常位置でのコリジョン判定のみ考慮すれば良い。この方法では、回転軸が常にプレイヤーの位置であるため、カメラの方向を基にカメラの位置を補正する必要がある。

Gakuto1112 commented 6 months ago

カメラの当たり判定の検出エリアを直線状にから直方体状に変更することで、大幅なズレの軽減を実現した。(検出の細かさの都合上、若干の誤差が残る。) また、カメラ関係の操作は'camera_manager.lua'にまとめておく。 再び、カメラの位置ずれが気になる場合は、このissueの再オープン又は新規issueをオープンする。