2017-06-30 27 views
1

私はすべての方向でポイント(0,0,0)を回りたいカメラを持っていますが、ポイントの上または下にあまりにも遠くに行くことはできません。私は、この質問が左右の方向について前に答えたが、直前のものについては答えなかった。どのように制限する(クランプ)Y軸回転のための回転。回転ユニティ

私はこれらの2つの質問(基本的に同じことを言う)からコードを垂直方向に動作させようとしましたが、回転に沿ったいくつかの点でバグがあります。

First QuestionSecond Question

そしてこれは、私はそれを変換しようとした方法である:

//how much we want to rotate by this frame 
float rotX = Input.GetAxis("Mouse X") * rotSpeed; 
float rotY = Input.GetAxis("Mouse Y") * rotSpeed; //(before clamping) 

//find current direction 
Vector3 currentDirection = transform.position - Vector3.zero; 

//find current angle between basis for clamp & where we are now 
float angle = Vector3.Angle(Vector3.forward, currentDirection); 

//finds out if it's up or down 
if (Vector3.Cross(Vector3.forward, currentDirection).x < 0) angle = -angle; 

//find out how much you can move without violating limits 
float newAngle = Mathf.Clamp(angle + rotY, yMinLimit, yMaxLimit); 

//grabs how much you are allowed to move the angle from the current angle 
rotY = newAngle - angle; 

//spinning the garden 
transform.RotateAround(Vector3.zero, Vector3.up, rotX); 
transform.RotateAround(Vector3.zero, transform.TransformDirection(Vector3.right), -rotY); //vertical rotation 

誰もがY軸のため、この作品を作るための正しい方法、またはクランプする別の方法を知っている場合垂直回転、私はそれを聞くために興奮してスーパーだろう!タイ!

答えて

0

私はここにあなたが欲しいものを正確に行うクラスを持っています。ターゲットを中心にカメラを回転させ、Y回転をクランプします。左ボタンを使用して回転し、スクロールボタンを使用してターゲットを平行移動します。 特定のニーズに合わせて編集することができます。ターゲットをVector3に変更して、オブジェクトを必要とせずに(0,0,0)に設定できます。それが役に立てば幸い。

using UnityEngine; 


public class RotateAroundCamera : MonoBehaviour 
{ 
    Camera cam; 
    public bool isControlable; 
    private Vector3 screenPoint; 
    private Vector3 offset; 
    public Transform target; 
    public float distance = 5.0f; 
    public float xSpeed = 50.0f; 
    public float ySpeed = 50.0f; 

    public float yMinLimit = -80f; 
    public float yMaxLimit = 80f; 

    public float distanceMin = .5f; 
    public float distanceMax = 15f; 

    public float smoothTime = 2f; 

    public float rotationYAxis = 0.0f; 
    float rotationXAxis = 0.0f; 

    float velocityX = 0.0f; 
    float velocityY = 0.0f; 
    float moveDirection = -1; 

    public void SetControllable(bool value) 
    { 
     isControlable = value; 
    } 

    // Use this for initialization 
    void Start() 
    { 
     cam = GetComponentInChildren<Camera>(); 
     Vector3 angles = transform.eulerAngles; 
     rotationYAxis = (rotationYAxis == 0) ? angles.y : rotationYAxis; 
     rotationXAxis = angles.x; 

     Rigidbody rigidbody = GetComponent<Rigidbody>(); 

     // Make the rigid body not change rotation 
     if (rigidbody) 
     { 
      rigidbody.freezeRotation = true; 
     } 
    } 

    void LateUpdate() 
    { 
     if (target) 
     { 
      if (Input.GetMouseButton(1) && isControlable) 
      { 
       velocityX += xSpeed * Input.GetAxis("Mouse X") * 0.02f; 
       velocityY += ySpeed * Input.GetAxis("Mouse Y") * 0.02f; 
      } 


      if (Input.GetMouseButton(2) && isControlable) 
      { 
       Vector3 curScreenPoint = new Vector3(moveDirection*Input.mousePosition.x, moveDirection*Input.mousePosition.y, screenPoint.z); 

       Vector3 curPosition = cam.ScreenToWorldPoint(curScreenPoint) + offset; 
       target.transform.position = curPosition; 
      } 

      if (Input.GetKeyDown(KeyCode.R) && isControlable) 
      { 
       target.transform.position = Vector3.zero; 
      } 

      if (Input.GetKeyDown(KeyCode.T) && isControlable) 
      { 
       moveDirection *= -1; 
      } 

      if (isControlable) 
      { 
       distance -= Input.GetAxis("Mouse ScrollWheel"); 

       if (distance > distanceMax) 
       { 
        distance = distanceMax; 
       } 
       else if (distance < distanceMin) 
       { 
        distance = distanceMin; 
       } 
      } 

      rotationYAxis += velocityX; 
      rotationXAxis -= velocityY; 

      rotationXAxis = ClampAngle(rotationXAxis, yMinLimit, yMaxLimit); 

      Quaternion fromRotation = Quaternion.Euler(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, 0); 
      Quaternion toRotation = Quaternion.Euler(rotationXAxis, rotationYAxis, 0); 
      Quaternion rotation = toRotation; 

      Vector3 negDistance = new Vector3(0.0f, 0.0f, -distance); 
      Vector3 position = rotation * negDistance + target.position; 

      transform.rotation = rotation; 
      transform.position = position; 

      velocityX = Mathf.Lerp(velocityX, 0, Time.deltaTime * smoothTime); 
      velocityY = Mathf.Lerp(velocityY, 0, Time.deltaTime * smoothTime); 

      screenPoint = cam.WorldToScreenPoint(target.transform.position); 
      offset = target.transform.position - cam.ScreenToWorldPoint(new Vector3(moveDirection*Input.mousePosition.x, moveDirection*Input.mousePosition.y, screenPoint.z)); 
     } 

    } 

    public static float ClampAngle(float angle, float min, float max) 
    { 
     if (angle < -360F) 
      angle += 360F; 
     if (angle > 360F) 
      angle -= 360F; 
     return Mathf.Clamp(angle, min, max); 
    } 
} 
+0

申し訳ありませんが、返信に数日かかりました。最後にそれをテストする時間があり、それは完全に動作します!私の答えの検索で、Unity Answersの別の記事を同じ質問で見つけましたが、この投稿へのリンクを渡すと気になりますか? –

+0

私はまったく気にしません。実際、私はこの答えがより多くの人々を助けることを知ってうれしいです。 :-)(あなたのコメントへの遅れた答えには申し訳ありません) – Fenixrw

関連する問題