Column

プログラミング
[Unityメモ1] マウス移動量をWorld座標に変換する方法
2022.12.27

以下のコードで可能です。(移動量が微妙にずれるので多分どこか間違っています。)

Camera MainCam;

void Start(){
    MainCam = GetComponent<Camera>();
}

void Update(){
    if(MainCam == null)
        return;
    if (Input.GetMouseButton(2))//マウスミドルボタンが押されたとき
    {
         //(1)マウス移動量を取得 ※1
         float moveX = Input.GetAxis(“Mouse X”);
         float moveY = Input.GetAxis(“Mouse Y”);

          //(2)moveX, moveYをゲーム画面に対して0-2に正規化※2
          moveX *= (Screen.currentResolution.width / Screen.width * 2f * 0.01f);
          moveY *= (Screen.currentResolution.height / Screen.height * 2f * 0.01f);

          //(3)projection逆変換 ※3
          moveX /= MainCam.projectionMatrix.m00;
          moveY /= MainCam.projectionMatrix.m11;

          //(4)view逆変換
          var mv = MainCam.cameraToWorldMatrix.MultiplyVector(new Vector4(moveX, moveY, 0));

          //(5)カメラを移動
          MainCam.transform.localPosition -= mv;// new Vector3(moveX, moveY, 0.0f);

         ///※1 Input. GetAxisで取得される値はモニターの解像度に対する変位を%として取得しているみたい。
         ///※2(ゲーム画面のスクリーン座標は-1から1で表される)
         ///※3 projection行列は多分対角行列だから逆変換はこれで良いと思う。
     }
}

解説

通常、スクリーン座標系からワールド座標系へ変換するには

スクリーン座標(-1から1で正規化されてる) –Projection Matrixの逆行列で変換->  ビュー座標 –View Matrixの逆行列で変換 –> ワールド座標

を行います。UnityではInput.GetAxisで取得されるマウス変位がモニター全体に対して%で取得されるために(2)で実際のゲーム画面に対しての移動量を取得しています。