Input.GetAxis(“ Mouse X / Y”)を使用してカメラを回転させる方法は?


13

マウスで回転する一人称カメラを作りたい。

私が見Input.GetAxisスクリプトAPIのページで、私は私のポストの下部に含まれているサンプルコードを、発見しました。試してみると、基本的な機能は同じだと思いましたが、特にマウスを円で動かすと、カメラがxz平面に平行に保たれないことに気付きました。しばらくすると、カメラが奇妙な角度になり、プレーヤーは完全に乱暴になります!

どういうわけかカメラの動きを制限するこのコードのクイックフィックスはありますか、またはカメラを回転させるより良い方法はありますか?

 using UnityEngine;
 using System.Collections;

     public class ExampleClass : MonoBehaviour {
         public float horizontalSpeed = 2.0F;
         public float verticalSpeed = 2.0F;
         void Update() {
             float h = horizontalSpeed * Input.GetAxis("Mouse X");
             float v = verticalSpeed * Input.GetAxis("Mouse Y");
             transform.Rotate(v, h, 0);
         }
     }

ジンバルロックのような音が発生しています。回転にオイラー角を使用しているときに発生します。ソリューションを提供するには、いくつかのテストを行う必要があります。基本的に、四元数を使用する必要があります。ジンバルロックの影響を受けません。
ファジーロジック、

四元数を使用して回転を行うにはどうすればよいですか?transform.rotation = Quaternion.Slerp(-Input.GetAxis( "Mouse X")、Input.GetAxis( "Mouse X")、Time.deltaTime * freeLookTurningSpeed);を試しました。、しかしそれは私にエラーを与えました。
stackexchangeの生まれ変わり

わかりました、私はテストをしました。幸い、それはジンバルロックではありません。解決策を回答します。
ファジーロジック

回答:


18

問題は、既存のローテーションを自分で追跡して更新するたびに置き換えるのではなく、更新することです。

ローテーションを更新すると、新しいローテーションと古いローテーションが組み合わされ、予期しない動作が発生します。

解決策は、蓄積されたローテーションを追跡し、新しい値で更新ごとにローテーションを完全にリセットすることです。

クレジット、期限付き、私はここで答えを見つけました:Unity Answers:how-to-lock-or-set-the-cameras-z-rotation-to-zero

作業コード:

using UnityEngine;
using System.Collections;

public class FirstPersonCam : MonoBehaviour {

    public float speedH = 2.0f;
    public float speedV = 2.0f;

    private float yaw = 0.0f;
    private float pitch = 0.0f;

    void Update () {
        yaw += speedH * Input.GetAxis("Mouse X");
        pitch -= speedV * Input.GetAxis("Mouse Y");

        transform.eulerAngles = new Vector3(pitch, yaw, 0.0f);
    }
}

主な違い:

  • 累積した値を追跡できるように、ローカルメソッド変数ではなくクラスメンバーとしてヨーとピッチを保存します。
  • + =や-=を使用して、各更新を累積します。
  • Rotate(新しい回転を古い回転に適用する)ではなく、eulerAngles(更新ごとに回転値を上書きする)を使用します。

どういたしまして。私が投稿したこの解決策があなたが抱えていた元の問題を解決した場合、それを答えとして受け入れる必要があります。新しい問題についてサポートが必要な場合は、新しい質問を投稿して整理整頓し、他の人があなたを助けたり、同様の問題が発生している場合は質問を見つけたりできるようにします。コメント領域は、拡張ダイアログ用ではありません。乾杯。
ファジーロジック、

0

カメラを空のゲームオブジェクトの子にするとどうなるでしょうか。次に、1つのスクリプトで、UPベクトルを基準にした空のゲームオブジェクトの回転を管理します。(MouseX)カメラのゲームオブジェクトに接続された別のスクリプトを使用して、右ベクトル(MouseY)を基準にした回転を管理します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.